Ongl表达式讲义.docx_第1页
Ongl表达式讲义.docx_第2页
Ongl表达式讲义.docx_第3页
Ongl表达式讲义.docx_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

浅析struts2中的OGNL和 ValueStack 要了解Struts2与OGNL表达式的关系,我们必须先搞清楚以下三个概念:(1)ActionContext 它是Action运行的上下文环境,Action的多项设置都存放在次,我们每一次Action调用都会创建一个ActionContext 。通常情况下我们可以通过静态方法getContext()来获得Action上下文,进而进行其它操作,比如说可以得到request session application (2)ValueStack 此对象主要是由OGNL框架实现,具体的实现类是com.opensymphony.xwork2.Util.ValueStack; 它主要包含了一个Map类型的Context对象,和最重要的getValue与findValue方法,以及peek、pop等栈所特有的方法。Strut 2的Action类通过属性可以获得所有相关的值,如请求参数、Action配置参数、向其他Action传递属性值(通过chain结果)等等。要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts 2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。 要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,并且将Action类的对象实例压入ValueStack对象中(实际上,ValueStack对于相当一个栈),而ValueStack类的setValue和findValue方法可以设置和获得Action对象的属性值。Struts 2中的某些拦截器正是通过ValueStack类的setValue方法来修改Action类的属性值的。如params拦截器用于将请求参数值映射到相应成Action类的属性值。在params拦截器中在获得请求参数值后,会使用setValue方法设置相应的Action类的属性。 从这一点可以看出,ValueStack对象就象一个传送带,当客户端请求.action时,Struts 2在创建相应用Action对象后就将Action对象放到了ValueStack传送带上,然后ValueStack传送带会带着Action对象经过若干拦截器,在每一拦截器中都可以通过ValueStack对象设置和获得Action对象中的属性值。实际上,这些拦截器就相当于流水线作业。如果要对Action对象进行某项加工,再加一个拦截器即可,当不需要进行这项工作时,直接将该拦截器去掉即可。需要注意的是我们访问这类对象时是不需要加入#的,因为它是根对象,所以不能加#,加了以后就不能访问到了。比如我们在Action中做了如下操作ActionContext.getContext().getVlaueStack().setVlaue(“MM”,”这是信息”),然后在页面就只可以通过就可以了。(3) Stack Context(map): stack上下文,它包含一系列对象,包括request/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,它实际上是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 value) context.put(key, value); 我们可以看到这个ValueStack同样设置到了上下文对象中实际上使用的ValueStack中的context属性。 而ValueStack中除了这个Map以外,还维护一个ComponentRoot对象,它实际上用来存放我们的一个List集合,它还要维护一个栈即Stack, 以期让我们进行后续的操作。Struts2框架把我们的ActionContext设置为OGNL 的上下文环境,凡是此环境中的值我们都应该通过#key的方式来进行访问,所以request,session等需要加前缀,又因为Struts2将我们的ValueStack作为OGNL的根对象,所以我们访问其中的内容只能通过非#的方式来进行。 Action的实例,总是放到value stack中。因为Action放在stack中,而stack是root(根对象),所以对Action中的属性的访问就可以省略#标记。但是,要访问ActionContext中其它对象的属性,就必须要带上#标记,以便让OGNL知道,不是从根对象,而是从其它对象中去寻找。具体的代码可以这样理解:而我们直接通过ActionContet.getContext().put(“属性名”,“值”);放入的数据放在了一个ActionContext 的context对象(OGNL上下文)和ValueStack对象的context对象共同引用的一个Map对象中,所以我们既可以通过#key也可以直接通过key来进行访问。那么访问Action中的属性的代码就可以这样写 其它ActionContext中的非根对象属性的访问要像下面这样写: or or 对Collection的处理,内容就很简单。 这是处理List。这个代码在页面上建立一个下拉选项,内容是list中的内容,默认值是name2.处理map 需要注意的是,判断一个值是否在collection中。我们要使用in或者not in来处理。 muhahaha boo 另外,可以使用通配符来选择collection对象的子集。 ?所有匹配选择逻辑的元素 只提取符合选择逻辑的第一个元素 $只提取符合选择逻辑的最后一个元素person.relatives.? #this.gender = male 设值计算 Struts2中使用OGNL进行设值计算,就是指View层传递数据到Control层,并且能够设置到相应的Java对象中。这个过程从逻辑上说需要分成两步来完成: 1. 对于每个请求,都建立一个与相应Action对应的ActionContext作为OGNL的上下文环境和ValueStack,并且把Action压入ValueStack 2. 在请求进入Action代码前,通过某种通用的机制,搜集页面上传递过来的参数,并调用OGNL相关的 2. 在请求进入Action代码前,通过某种通用的机制,搜集页面上传递过来的参数,并调用OGNL相关的 代码,对Action进行设值。 上面的第一个步骤,在处理URL请求时完成,而第二个步骤由struts2内置的拦截器完成。“#”主要有三种用途:1. 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性: 名称 作用 例子 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) application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute(userName) attr 用于按request session application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止. 用于过滤和投影(projecting)集合,如books.?#this.price100; 3. 构造Map,如#foo1:bar1, foo2:bar2。 “%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。既字符串不是输出到页面,而是作为某个属性的取值,如下面的url就是一个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论