OGNL表达式与struts2整合应用

来源:互联网 发布:openstack网络模式 编辑:程序博客网 时间:2024/05/21 02:21

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}

0 0