OGNL:网上查阅。
Object-Graph-Navigation-Language的缩写,全称对象视图导航语言。在jsp中同EL表达 式有相似之处,但功能较之强大。可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实 现字段类型转化,操作集合等功能。并不属于struts2开发,属于第三方表达式语言。
准备工作:
导包:导入struts2的基本包即可。或者以下:
asm-xxx.jar
asm-commons-xxx.jar
asm-tree-xxx.jar
ognl-xxx.jar
软准备:
准备root和context,此处root为自定义User类型,context为Map类型
Ognl.getValue("String",context,root);
语法:直接使用代码
取值:
System.out.println(Ognl.getValue("name", context, root));
System.out.println(Ognl.getValue("#user1.name", context, root));
赋值:
Ognl.getValue("name='rose'", context, root);
Ognl.getValue("#user1.name='aaa'", context, root);
调用方法:
Ognl.getValue("setName('李磊')", context, root);
Ognl.getValue("#user1.setName('凉快')", context, root);
调用静态方法:全限定名
System.out.println(Ognl.getValue("@myself.web.test.OgnlUtils@echo('hello')", context, root));
访问静态属性:
System.out.println(Ognl.getValue("@myself.web.test.OgnlUtils@field", context, root));
特殊情况:调用Math类的方法或访问其属性,不需要完整类名
System.out.println(Ognl.getValue("@@random()", context, root)); System.out.println(Ognl.getValue("@@PI", context, root));
创建 list |map集合:
List list = (List) Ognl.getValue("{1,2,'as','sd'}", context, root);
Map map = (Map) Ognl.getValue("#{'name':'rose','age':16}", context, root);
OGNL与struts2整和应用:
应用原理:即ValueStack,存在于ActionContext中。ActionContext有ValueStack的引用,ValueStack 也有ActionContext的引用。ValueStack是struts2的接口,OgnlValueStack是ValueStack的实现类,每 当客户端发送一个请求,struts2便会创建一个action实例同时创建一个OgnlValueStack值栈实例
值栈:包括两部分,root和context。
root中默认存放当前请求action的实例对象,以继承ArrayList的形式完成栈结构
context即为ActionContext的引用,在这个ActionContext中又引用了ValueStack(对应上文)
整合应用:
①即前面提到的表单参数接收:
1.属性驱动:
请求到达action之前时,默认20个拦截器中的params拦截器将表单提交的键值对参数作为ognl表达 式来解析。eg:'name'='tom' ,从root中查找name属性,并为name属性赋值为tom
2.对象驱动:
类似于属性驱动。eg:'user.name'='tom' ,从root中找到user属性,再找到user的name属性并赋 值为tom
3.模型驱动:
默认20个拦截器中,modelDriven比params先一步执行。此处action是实现了ModelDriven接口 的,而源码中modelDriven会将action对象获取到,再将action对象中的user,以压栈的形式,压到 root的栈顶。这样当拦截器的params解析参数时,就能从root中查找到user的name属性并赋值了。
②配置文件中使用ognl:比如为重定向附加参数
/
xxx
${name}
action重定向到下一action时,即可带上前者中的属性:
http://xxxxxx:8080/xxx/xxx?name=xxx
③页面标签简介:
1.:jsp中使用,可页面上看到类似超链接的按钮,单击可查看context和root的数据内容
2.:分为map存取(键值对形式)和root存取(属性名)
ServletActionContext.getRequest().setAttribute("name", "requestName");往request中存
页面使用ongl取
3.:遍历
遍历ActionContext中list集合,遍历到的元素,放到root栈顶。
property 标签不写value属性,默认取栈顶元素,遍历完成后root栈恢复
遍历ActionContext中list集合,遍历到的元素,放到root栈顶。
同时,将当前遍历到的元素,以name作键放入ActionContext中(map结构)
4.文本输入框
此处:%强制ognl表达式,回显的是 context中list键对应的索引为1的数据
OGNL特殊符号:
#:#list从context中取值;#{key:value} 创建map集合
%:强制ognl表达式,用于表单数据回显
$:struts.xml中配置附加参数-${name}