OGNL (Object Graph Navigation Language),一种强大的表达式语言,能够导航对象结构并访问和设置对象数据
OGNL的核心为OGNL上下文,OGNL上下文相当于一个Map容器.OGNL上下文是OGNL的核心,在OGNL上下文中可以存放多个对象。
可以这样理解,OGNL上下文为一个Map集合,包含了各个对象,通过它中的对象的名字获取对应的对象的属性,一般的,在OGNL上下文中只能有一个对象可以为OGNL上下文的的根。
获取OGNL上下文中的对象的属性:#对象名.属性 相当于调用了该对象的getXXX()方法。当指定对象为根对象的时候,#符号可以舍去
#user.name
#book.name
user.name
据说OGNL比EL更强大,它的特点:
支持对象方法的调用
支持静态方法的调用
支持变量的赋值
可以操作集合数据
Struts2中的OGNL
在Struts2中,OGNL提高了Struts2对数据的访问能力。
在Struts2框架中OGNL上下文作用于ctionContext对象 。ActionContext中包含了对个对象,值栈是OGNL上下文中的根
context中的对象: 值栈(根)、application、session、request、parameters、attr
获取值栈中的对象,因为值栈是Struts2中OGNL上下文的根,所以可以省略, ${user.name} user.name #user.name
获取application中的对象:#application.name #application['name']
获取request对象:#request.name #request['name']
获取session对象:#session.name #session['name']
获取parameters中的值: #parameters.name #parameters['name']
获取attr中的值,如果不指定范围,可以使用attr来获取属性值,其搜索范围按照page、request、session、application的次序依次搜索,attr的使用方法: #attr.name #attr['name']
操作普通的属性和方法
Struts2框架中使用OGNL表达式语言需要借助Struts2标签进行输出,引用struts2标签库: <%@ taglib prefix="s" uri="/struts-tags"%>
获取属性:
<s:property value="user.id"/> <s:property value="user[id]"
对象方法的调用:
<s:property value="user.say()"/>
package com.shensiyuan.struts.bean; public class Student { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String say(){ return "我是一个学生"; } } package com.shensiyuan.struts.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.shensiyuan.struts.bean.Student; public class OGNLAction extends ActionSupport { private String name; private Student student; Map<String,Object> request; @SuppressWarnings("unchecked") public OGNLAction(){ request=(Map<String, Object>) ActionContext.getContext().get("request"); student=new Student(); student.setId(1); student.setName("张三"); setName("tom"); } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public Map<String, Object> getRequest() { return request; } public void setRequest(Map<String, Object> request) { this.request = request; } public String execute(){ request.put("info", "request测试"); return SUCCESS; } public void setName(String name) { this.name = name; } public String getName() { return name; } } <action name="OGNL" class="com.shensiyuan.struts.action.OGNLAction"> <result name="success">/success.jsp</result> </action> <body> <div> <h1>操作普通属性</h1> 属性name值: <s:property value="name"/> <br/><hr/> 学号: <s:property value="student.id"/><br/> <!-- <s:property value="student['id']"/> --> 姓名: <s:property value="student.name"/><br/> <!-- <s:property value="student['name']"/> --> say()方法: <s:property value="student.say()"/> <br/><hr/> request中的info值: <s:property value="#request.info"/> <!-- <s:property value="#request['info']"/> --> </div> </body> <body> <a href="OGNL.action">OGNL普通属性方法测试</a> </body>
访问静态方法以及属性
Struts框架中的OGNL表达式支持对象的静态方法,它类似java语言中的静态引入,需要使用字符@进行标注
Struts2中提供了一个是否允许OGNL调用静态方法的常量struts.ognl.allowStaticMethodAccess,默认值为false,也就是不允许直接调用静态方法。需要允许在struts.xml中加上<constant name="struts.ognl.allowStaticMetodAccess" value="false"/> struts2的常量可以在struts-core.jar的defaut.property中看到一些配置常量的默认值
调用静态属性的方法: @com.bean.Bean@NAME
调用静态方法的方法: @com.bean.Bean@gretting()
访问数组:数组中的每一个元素都有一个角标,通过角标访问其中的某个元素
如:定义了一个arr数组 访问第1个元素:arr[0] 得到数组长度:arr.length
访问List、Set、Map集合
不同的集合,数据存储形式不同,所以其访问形式也存在差异。
List集合,使用角标对其进行访问:
list[0]
Set集合存储方式是无序的,这里没有说如何访问。在java中一般使用迭代或者枚举遍历
。。。。
Map集合以key value形似存储,使用OGNL访问,同归获取key来访问value
map.kay map.['key'] map.keys //获取所有的key map.values //获取所有的value
针对集合:
collection.isEmpty //判断集合元素是否为空 collection.size() //获取集合的长度
投影与选择
投影与选择操作可以轻松的获取集合中某一列数据的集合,也可以通过条件轻松的过滤掉条件中的某些行
投影
投影是对集合中列的操作。将集合中某一列中的数据取出来单独形成一个集合,这一列数据就是原集合中的投影。
例如一个集合中包含多个学生对象,获取这个集合中所有学生的姓名,就是投影操作。OGNL代码实现:list.{name} 如果是非值栈中的对象需要加上#,也就是#list.{name}
选择
选择是对集合中行的操作。选择就是通过一定条件,获取集合中满足着一条件的数据,所获取的行就是对集合中数据的选择操作
如一个集合中包含多个学生对象,获取这个集合中年龄大于10的所有学生,这就是选择操作。在OGNL中通过如下代码实现:
list.{?#this.age>10} 非值栈对象#list.{?#this.age>10}
对于选择操作,OGNL提供的三个操作符号:
? 获取满足指定条件的所有元素
^ 获取满足指定条件的所有元素中的第一个元素
$ 获取满足指定条件的所有元素中的最后一个元素