收藏 分享(赏)

Ongl表达式讲义.docx

上传人:11xg27ws 文档编号:4565631 上传时间:2019-01-02 格式:DOCX 页数:5 大小:20.47KB
下载 相关 举报
Ongl表达式讲义.docx_第1页
第1页 / 共5页
Ongl表达式讲义.docx_第2页
第2页 / 共5页
Ongl表达式讲义.docx_第3页
第3页 / 共5页
Ongl表达式讲义.docx_第4页
第4页 / 共5页
Ongl表达式讲义.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、浅析 struts2 中的 OGNL 和 ValueStack 要了解 Struts2 与 OGNL 表达式的关系,我们必须先搞清楚以下三个概念:(1)ActionContext 它是 Action 运行的上下文环境,Action 的多项设置都存放在次,我们每一次 Action 调用都会创建一个 ActionContext 。通常情况下我们可以通过静态方法getContext()来获得 Action 上下文,进而进行其它操作, 比如说可以得到 request session application (2)ValueStack 此对象主要是由 OGNL 框架实现,具体的实现类是com.opens

2、ymphony.xwork2.Util.ValueStack; 它主要包含了一个 Map 类型的 Context 对象,和最重要的 getValue 与findValue 方法,以及 peek、pop 等栈所特有的方法。Strut 2 的 Action 类通过属性可以获得所有相关的值,如请求参数、 Action 配置参数、向其他 Action 传递属性值(通过 chain 结果)等等。要获得这些参数值,我们要做的唯一一件事就是在 Action 类中声明与参数同名的属性,在 Struts 2 调用 Action 类的 Action 方法(默认是 execute 方法)之前,就会为相应的 Acti

3、on 属性赋值。要完成这个功能,有很大程度上,Struts 2 要依赖于 ValueStack 对象。这个对象贯穿整个Action 的生命周期(每个 Action 类的对象实例会拥有一个 ValueStack 对象) 。当 Struts 2 接收到一个.action 的请求后,会先建立 Action 类的对象实例,并且将 Action 类的对象实例压入 ValueStack 对象中(实际上,ValueStack 对于相当一个栈) ,而 ValueStack 类的 setValue和 findValue 方法可以设置和获得 Action 对象的属性值。Struts 2 中的某些拦截器正是通过Va

4、lueStack 类的 setValue 方法来修改 Action 类的属性值的。如 params 拦截器用于将请求参数值映射到相应成 Action 类的属性值。在 params 拦截器中在获得请求参数值后,会使用setValue 方法设置相应的 Action 类的属性。从这一点可以看出,ValueStack 对象就象一个传送带,当客户端请求.action 时,Struts 2在创建相应用 Action 对象后就将 Action 对象放到了 ValueStack 传送带上,然后 ValueStack传送带会带着 Action 对象经过若干拦截器,在每一拦截器中都可以通过 ValueStack

5、对象设置和获得 Action 对象中的属性值。实际上,这些拦截器就相当于流水线作业。如果要对Action 对象进行某项加工,再加一个拦截器即可,当不需要进行这项工作时,直接将该拦截器去掉即可。需要注意的是我们访问这类对象时是不需要加入#的,因为它是根对象,所以不能加#,加了以后就不能访问到了。比如我们在 Action 中做了如下操作 ActionContext.getContext().getVlaueStack().setVlaue(“MM”,”这是信息 ”),然后在页面就只可以通过就可以了。(3) Stack Context(map ): stack 上下文,它包含一系列对象,包括 req

6、uest/session/attr/application map 等,也是用来存值的。struts2 对 OGNL 上下文的概念又做了进一步扩充,在struts2 中,OGNL 上下文通常如下所示:|-request |-application context map-|-OgnlValueStack(root) user, action, OgnlUtil, . |-session |-attr |-parameters 在 Struts2 中,采用标准命名的上下文(Context) 来处理 OGNL 表达式。处理 OGNL 的顶级对象是一个 Map(也叫 context map,它实际上

7、是 ActionContext 中的一个对象,也叫context) ,在这个 contxt 属性中我们分别放置了 context.put(“常量 REQUEST”,new HashMap(); context.put(“常量 APPLICATION”,new HashMap();等等,同样我们在其中也放置了一个名叫 vsMap 的对象( 自己随便取了个名字): 来看下面两个相关的方法 public void setValueStack(ValueStack stack) put(VALUE_STACK, stack); public void put(String key, Object va

8、lue) context.put(key, value); 我们可以看到这个 ValueStack 同样设置到了上下文对象中实际上使用的 ValueStack 中的context 属性。 而 ValueStack 中除了这个 Map 以外,还维护一个 ComponentRoot 对象,它实际上用来存放我们的一个 List 集合,它还要维护一个栈即 Stack, 以期让我们进行后续的操作。Struts2 框架把我们的 ActionContext 设置为 OGNL 的上下文环境,凡是此环境中的值我们都应该通过#key 的方式来进行访问,所以 request,session 等需要加前缀,又因为 S

9、truts2 将我们的 ValueStack 作为 OGNL 的根对象,所以我们访问其中的内容只能通过非#的方式来进行。 Action 的实例,总是放到 value stack 中。因为 Action 放在 stack 中,而 stack 是 root(根对象),所以对 Action 中的属性的访问就可以省略#标记。但是,要访问 ActionContext 中其它对象的属性,就必须要带上#标记,以便让 OGNL 知道,不是从根对象,而是从其它对象中去寻找。具体的代码可以这样理解:而我们直接通过 ActionContet.getContext().put(“属性名”,“值”);放入的数据放在了一

10、个 ActionContext 的 context 对象(OGNL 上下文)和 ValueStack 对象的 context 对象共同引用的一个 Map 对象中,所以我们既可以通过 #key 也可以直接通过 key 来进行访问。那么访问 Action 中的属性的代码就可以这样写 其它 ActionContext 中的非根对象属性的访问要像下面这样写:oror对 Collection 的处理,内容就很简单。这是处理 List。这个代码在页面上建立一个下拉选项,内容是 list 中的内容,默认值是 name2.处理 map需要注意的是,判断一个值是否在 collection 中。我们要使用 in

11、或者 not in 来处理。muhahahaboo另外,可以使用通配符来选择 collection 对象的子集。?所有匹配选择逻辑的元素只提取符合选择逻辑的第一个元素$只提取符合选择逻辑的最后一个元素person.relatives.? #this.gender = male 设值计算 Struts2 中使用 OGNL 进行设值计算,就是指 View 层传递数据到 Control 层,并且能够设置到相应的 Java 对象中。这个过程从逻辑上说需要分成两步来完成: 1. 对于每个请求,都建立一个与相应 Action 对应的 ActionContext 作为 OGNL 的上下文环境和ValueSt

12、ack,并且把 Action 压入 ValueStack 2. 在请求进入 Action 代码前,通过某种通用的机制,搜集页面上传递过来的参数,并调用 OGNL 相关的 2. 在请求进入 Action 代码前,通过某种通用的机制,搜集页面上传递过来的参数,并调用 OGNL 相关的 代码,对 Action 进行设值。 上面的第一个步骤,在处理 URL 请求时完成,而第二个步骤由 struts2 内置的拦截器完成。“#”主要有三种用途:1. 访问 OGNL 上下文和 Action 上下文,#相当于 ActionContext.getContext();下表有几个 ActionContext 中有用

13、的属性: 名称作用例子parameters包含当前 HTTP 请求参数的 Map#parameters.id0作用相当于 request.getParameter(“id“)request包含当前 HttpServletRequest 的属性(attribute) 的 Map#request.userName 相当于 request.getAttribute(“userName“)session包含当前 HttpSession 的属性(attribute )的 Map#session.userName 相当于 session.getAttribute(“userName“)applicatio

14、n包含当前应用的 ServletContext 的属性(attribute)的 Map#application.userName 相当于 application.getAttribute(“userName“)attr用于按 request session application 顺序访问其属性(attribute)#attr.userName 相当于按顺序在以上三个范围(scope)内读取 userName 属性,直到找到为止. 用于过滤和投影(projecting)集合,如 books.?#this.price%的用途$符号 $符号主要有两个方面的用途。(1) 在国际化资源文件中,引用 OGNL 表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在 $min同$max之间。(2) 在 Struts 2 框架的配置文件中引用 OGNL 表达式,例如下面的代码片断所示:10100BAction-test 校验:数字必须为$min 为$max 之间!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报