OGNL表达式存取值

来源:互联网 发布:中国云计算领军人物 编辑:程序博客网 时间:2024/05/17 20:33
1.OGNL表达式:OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可以通过某种表达式语法,
存取Java对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。如果把表达式看作是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。




2.借助s:property标签输出内容到浏览器
a)导入标签库:
<%@ taglib uri="/struts-tags" prefix="s" %>
<s:property value="OGNL表达式" />

b)把一个OGNL表达式看成是字符串的方式是:
<s:property value="OGNL表达式" /> 或者<S:property value="'OGNL表达式'" />



c)OGNL表达式创建集合:
<s:radio name="gender" list="{'男','女'}" label="性别"/>

d)OGNL表达式创建map集合:
<s:radio name="gender" list="#{'male':'男','female':'女'}" label="性别"/>


3.ContextMap:它是OGNL上下文对象,是struts2中封装数据最大的对象.我们一次请求中所有用到的信息都可以在里面找到,它
是一个Map结构的对象,其中key是字符串,value是一个Object,封装的数据如下:


Map的key(类型是String)Map的Value (类型是Object) 说明信息
application Java.util.Map<String,Object> 封装的应用域中的所有数据
    session Java.util.Map<String,Object> 封装的会话域中的所有数据
    request Java.util.Map<String,Object> 封装的请求域中的所有数据
    valueStack(特殊)com.opensymphony.xwork2.ognl.OgnlValueStack 它是List结构
    parametersJava.util.Map<String,String[]> 封装的是请求参数
    attr Java.util.Map<String,Object> 封装的是四大域的组合数据,从最小的域开始搜索
    action com.opensymphony.xwork2.ActionSupport 当前执行的动作类对象



4.ActionContext:它是一个工具类,是struts2框架提供给我们的,可以让我们调用其中的方法,快速的操作ContextMap。用它操作OGNL上下文对象,比直接操作ContextMap要方便很多。
ActionContext就相当于对ContextMap进行了一次再封装。由于ActionContext是操作的ContextMap,而ContextMap中封了我们一次请求的所有数据,所以它的创建应该是每次请求访问Action时,
即核心控制器(StrutsPrepareAndExecuteFilter)的doFilter方法执行时,每次创建ActionContext时,把对象绑定到当前线程上。想了解更多可以去查看一下源码.


5.使用OGNL表达式获取Map中的数据:


1、使用OGNL表达式获取Map中的数据 需要借助s:property
获取map的数据:都是根据Key获取value,所以我们要提供的是key。
如何表示key:使用#,后面的内容就表示key


获取ContextMap中的数据:<s:property value="#contextMap"/>
<hr/>
2、使用OGNL表达式获取三大域中的数据
也需要使用s:property标签
写法就是
#key.key
 
获取key为application的map中的数据
<s:property value="#application.applicationMap"/><br/>
<s:property value="#application.applicationAttr"/>




6.ValueStack对象:ValueStack是Struts的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的实现类,客户端发起一个请求struts2架构会创建一个action实例同时创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个 Action 的生命周期。
它是ContextMap中的一部分,里面的结构是一个List,是我们可以快速访问数据一个容器。它的封装是由struts2框架完成的。
1.通常情况下我们是从页面上获取数据。它实现了栈的特性(先进后出)。



2.一般情况下,我们都是根据debug标签中显示的Property Name来获取Property Value。当然我们也可以获取栈顶对象


3.在Action定义一个私有属性,并且提供公有get/set方法,那么该属性就会出现在值栈的Property Name中。显示的名称是根据get/set方法后面的内容决定的,与私有成员变量名称叫什么无关。



4.获取值栈中的数据,需要借助struts2的标签s:property
明确的事情:
1、获取值栈中的数据,我们只能根据值栈中对象的property name获取property value。
2、获取值栈中的数据,都是直接写属性名称,获取的就是值,并不需要使用任何符号。
它是把value属性的取值作为值栈中对象的property name,在值栈中从栈顶逐个查找,只要找到了就返回结果,并且不再继续查找。






7.El表达是增强:
a)Struts2框架中对EL表达式做了如下改变:
EL表达式原来的搜素顺序: 
page Scope——>request Scope——>sessionScope——>application Scope
EL表达式改变后的搜索顺序:
page Scope—>request Scope—>valueStack—>contextMap—>sessionScope—>application Scope


b)struts2框架对request对象进行了包装,并且对getAttribute方法进行了增强

8.OGNL表达式中的符号总结:
#:1、获取大Map中数据,把后面的内容看成是key。
2、在使用struts2标签,创建Map对象时使用。<s:radio list="#{}">


%:1、使用%{''}把OGNL表达式强制看成是普通字符串
2、使用%{}把普通字符串强制看成是OGNL表达式


$:1、使用EL表达式的标识
2、在struts的配置文件中使用OGNL表达式