Ognl表达式的应用,语法,及如何获取数据root,ContextMap

简介: Ognl表达式的应用,语法,及如何获取数据root,ContextMap

1. OGNL表达式 (对象图导航语言)

OGNL是Object-Graph Navigation Language的缩写,翻译过来就是 对象视图导航语言

它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以实现:

  • 可以存取对象的任意属性,
  • 可以调用对象的方法,
  • 遍历整个对象的结构图,
  • 实现字段类型转化等功能。
  • 它使用相同的表达式去存取对象的属性。

EL(Expression Language) 是为了使JSP写起来更加简单。

表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。


EL表达式只能进行读取数据,

而OGNL不仅可以读取数据,更重要是是可以写入数据(赋值)、调用方法 (对象的一般方法、静态方法等);


OGNL表达式代码是由两部分组成的,分别是roo区域t和contextMap区域 ,root是对象栈,context是map值栈,这两个栈合并使用才算是一个完整的OGNL表达式,如下图所示:

注意:OGNL并不是struts本身的组件,是一个独立的技术。

struts2框架中使用的表达式并不是EL表达式,不是不能用,而是struts2有自己的一套御用的表达式,名字就叫OGNL表达式,这是struts直接把ognl直接拿过来用了,但并不是struts本身的。


下面通过实例代码在java代码中看如何从root区获取数据

要在Myeclipse中建立一个java project 并且建一个lib的文件夹导入ognl 的jar包。

1,从root区获取数据

主要实例如下:

其中person实体类有:

public class Person {
  private String name;
  private Integer age;
  private String sex;
  private String mobile;
  private Address address;
  private List<String> favorites;
  private Map<String,Integer> scores;
getter 和setter方法,构造方法省略

Address实体类有:

public class Address {
  private String street;
  private String zipCode;
getter 和setter方法,构造方法省略

然后测试类如下:

import com.macw.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ognl.Ognl;
import ognl.OgnlException;
import com.macw.entity.Address;
import com.macw.entity.Person;
public class TestOgnl1 {
  public static void main(String[] args) throws OgnlException {
    //通过ongl从root区(对象)中获取属性值
    Address address = new Address("丰乐路博颂路","450000");
    Person p = new Person("xushy",18,"男","18530031576",address);
    //获取name属性
    p.getName();
    //获取street子属性
    p.getAddress().getStreet();
    //获取root区的属性
    System.out.println(Ognl.getValue("name", p));
    //获取root区对象的属性的子属性
    System.out.println(Ognl.getValue("address.street", p));
    List<String> favorites = new ArrayList<String>();
    Collections.addAll(favorites, "唱","跳","rap","篮球");
    p.setFavorites(favorites);
    //获取p对象的List集合属性的某一个元素
    System.out.println(Ognl.getValue("favorites[0]", p));
    Map<String,Integer> scores = new HashMap<String,Integer>();
    scores.put("语文", 100);
    scores.put("数学",60);
    scores.put("英语", 85);
    p.setScores(scores);
    //获取Map属性的键值对数据
    System.out.println(Ognl.getValue("scores[\"语文\"]", p));
    System.out.println(Ognl.getValue("scores['语文']", p));
    //Ognl的运算
    /*
     * 数学运算 + - * / %
     * 比较运算 > >= < <= == != 
     * 逻辑运算 && || !
     * 三目运算符:         ? :
     */
    System.out.println(Ognl.getValue("age > 16", p));
    System.out.println(Ognl.getValue("age + 16", p));
    System.out.println(Ognl.getValue("age >= 18 ? '青年':'少年'", p));
    //Ognl表达式调用方法
    System.out.println(Ognl.getValue("name.toUpperCase()",p));
    System.out.println(Ognl.getValue("name.length()", p));
    System.out.println(Ognl.getValue("favorites.size()", p));
    System.out.println(Ognl.getValue("name.charAt(0)", p));
  }
}

从中可以看到,ognl表达式获取数据语法为:

Ognl.getValue("属性名", 对象)

2,从从contextMap中获取数据

实体类还和上面的一样,用person对象和address对象

public class TestOgnl2 {
  public static void main(String[] args) throws OgnlException {
    //contextMap区  map集合
    Address address = new Address("河南农业大学","450000");
    Person p = new Person("macw",18,"男","13598051718",address);
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("p", p);
    System.out.println(Ognl.getValue("#p", map, new Object()));
    System.out.println(Ognl.getValue("#p.name", map,new Object()));
    System.out.println(Ognl.getValue("#p.address.zipCode", map,new Object()));
    List<String> favorites = new ArrayList<String>();
    Collections.addAll(favorites, "唱","跳","rap","篮球");
    p.setFavorites(favorites);
    System.out.println(Ognl.getValue("#p.favorites[0]", map,new Object()));
    Map<String,Integer> scores = new HashMap<String,Integer>();
    scores.put("语文", 100);
    scores.put("数学",60);
    scores.put("英语", 85);
    p.setScores(scores);
    System.out.println(Ognl.getValue("#p.scores['英语']", map,new Object()));
  }
}

获取ContextMap中的数据:

Ognl.getValue("#对象名", map,new Object()

1.到contextmap区域获取ognl表达式的语法需要以#为前缀。

2.#后面跟map里面的key。

3.Key后面跟root区域取数据的语法是一模一样的。

目录
相关文章
|
6月前
|
安全 Swift iOS开发
switf定义和语法
switf定义和语法
64 2
|
6月前
|
SQL Oracle 关系型数据库
SQL 中的运算符与别名:使用示例和语法详解
IN运算符允许您在WHERE子句中指定多个值,它是多个OR条件的简写
249 0
|
6月前
|
SQL 数据库
SQL LIKE 运算符:用法、示例和通配符解释
SQL中的LIKE运算符用于在WHERE子句中搜索列中的指定模式。通常与LIKE运算符一起使用的有两个通配符: 百分号 % 代表零个、一个或多个字符。 下划线 _ 代表一个单个字符。 以下是LIKE运算符的用法和示例:
299 0
|
存储 安全 编译器
GNU C 扩展语法:指定初始化与语句表达式
GNU C 扩展语法:指定初始化与语句表达式
298 0
|
编译器
java--Lambda(2)表达式语法
最基本的 Lambda 表达式,它由三部分组成具体格式是这样子的:参数 -> 具体实现;Lambda表达式格式:()->{}是一段带有输入参数的可执行语句块。可选类型声明: 不需要声明参数类型,编译器可以自动识别参数类型和参数值。可选的参数圆括号: 一个参数可以不用定义圆括号,但多个参数需要定义圆括号;可选的大括号: 如果函数主体只包含一个语句,就不需要使用大括号;可选的返回关键字: 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指明表达式返回了一个数值。
142 0
java--Lambda(2)表达式语法
|
SQL Oracle 关系型数据库
Sql 语句空字符串和NUll值的区别及使用技巧
Sql 语句空字符串和NUll值的区别及使用技巧
801 0
Sql 语句空字符串和NUll值的区别及使用技巧
|
安全 Java API
表达式引擎--OGNL
OGNL (Object Graph Navigation Language) 是一个开源的表达式引擎。通过使用OGNL,我们能够通过表达式存取Java对象树中的任意属性和调用Java对象树的方法等。也就是说,如果我们把表达式看成是一个带有语义的字符串,那么OGNL就是这个语义字符串与Java对象之间沟通的催化剂,通过OGNL,我们可以轻松解决在数据流转的过程中所碰到的各种问题。
725 0
|
Java Kotlin
【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )
【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )
300 0
【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )
Pathon语法
之前学pathon写的一些总结
Pathon语法
|
测试技术
F#库FParsec解析表达式
本文用F#解析器库FParsec对数学公式进行解析,如将(x+2)^7 => Pow (Add (Var "x", CstF 2.0), CstF 7.0),此转换操作对于数学公式的后续推导以及求值等都具有重要的作用。
961 0
F#库FParsec解析表达式