1.标准的OGNL要求设定一个根对象(root对象)。现在假定使用标准OGNL表达式求值,若OGNL上下文中有两个对象A(设置为root),B。根对象可以直接访问,非根对象需要加#:
- A.xxx 返回A的属性值,即A.getXxx();
- #B.xxx 返回B的属性值,即B.getXxx();
- xxx 因为A为根对象,使用返回A.getXxx();
2.在Strut2中 值栈 是OGNL的根对象。 Struts2 OGNL从值栈顶部元素开始往下搜索!现在假设值栈有两个对象teacher(栈顶,有两个属性name、salary),student(name、age);
- salary == teacher.getSalary();
- age == student.getAge();
- name == teacher.getName(); 这里相同属性从栈顶开始搜索,所以是teacher。
- [1].name == student.getName();可以用索引访问。
3.在Struts2中 OGNL Context就是ActionContext;值栈(root)就是OGNL的根对象。
Context包含:
- application对象:用于访问ServletContext.如#application.userName == 调用Servlet的getAttribute(“userName”);
- session:访问HttpSession,#session.userName == session.getAttribute(“userName”);
- request:访问HttpServletRequest属性的map,#request.userName == request.getAttribute(“userName”);
- parameters:访问HTTP请求的参数的map,#parameters.userName == request.getParameter(“userName”);
- attr:用于按request,session,application的顺序访问各种作用域内的属性
Map request = (Map)ActionContext.getContext().get("request");
request.put("username",username);
//将request对象的username属性的值通过代码存入。
欢迎您,<s:property value="#request.username"/>!
<!--使用request对象的username属性-->
4.OGNL集合
- List:逗号分隔。例:{‘apple’,’banana’}
- Map:#开头,键值对用冒号分隔,不同键值对用逗号分隔。#{0:’apple’,1:’banana’};
- in或者not in:判断每个元素是否存在在指定集合对象中。
- ?:获取所有符合逻辑的元素。
- ^:获取符合逻辑的第一个元素.
- $:获取符合逻辑的最后一个元素.例:{?#this.genden == ‘male’}获取’所有’男性