Struts2在OGNL基础上的增强

 1、值栈 (ValueStack)
     Struts2 OGNL 上下文设置为 Struts2 中的 ActionContext( 内部使用的仍然是 OgnlContext) ,并将值栈设为 OGNL 的根对象。
    我们知道, OGNL 上下文中的根对象可以直接访问,不需要使用任何特殊的 标记 ,而引用上下文中的其他对象则需要使用 “#” 来标记。由于值栈是上下文中的根对象,因此可以直接访问。那么对于值栈中的对象该如何访问呢? Struts2 提供了一个特殊的 OGNLPropertyAccessor ,它可以自动查找栈内的所有对象 ( 从栈顶到栈底 ) ,直接找到一个具有你所查找的属性的对象。也就是说,对于值栈中的任何对象都可以直接访问,而不需要使用 “#”
    假设值栈中有两个对象: student employee ,两个对象都有 name 属性, student 有学号属性 number ,而 employee 有薪水属性 salary employee 先入栈, student 后入栈,位于栈顶,那么对于表达式 name, 访问的就是 student name 属性,因为 student 对象位于栈顶;表达式 salary ,访问的就是 employee salary 属性。正如你所见,访问值栈中的对象属性或方法,无须指明对象,也不用 “#” ,就好像值栈中的对象都是 OGNL 上下文中的根对象一样。这就是 Struts2 OGNL 基础上做出的改进。
  2、 [N] 语法
    如上所述,如果想要访问 employee name 属性,应该如何写表达式呢?我们可以使用 [N].xxx(N 是从 0 开始的整数 ) 这样的语法来指定从哪一个位置开始向下查找对象的属性,表达式 [1].name 访问的就是 employee 对象的 name 属性。
    在使用 [N].xxx 语法时,要注意位置序号的含义,它并不是表示 获取栈中索引为 N 的对象 ,而是截取从位置 N 开始的部分栈。
  3、 top 关键字
     top 用于获取栈顶的对象,结合 [N].xxx 语法,我们就可以获取栈中任意位置的对象。
    如: [0].top,[1].top
  4、访问静态成员
    除了使用标准的 OGNL 表达式访问静态字段和静态方法外, Struts2 还允许你不指定完整的类名,而是通过 “vs” 前缀来调用保存在栈中的静态字段和静态方法。
     @vs@FOO_PROPERTY
     @vs@someMethod()
     @vs1@someMethod()
     vs 表示 ValueStack ,如果只有 vs ,那么将使用栈顶对象的类;如果在 vs 后面跟上一个数字,那么将使用栈中指定位置处的对象类。

 

  struts2 中默认提供了一些访问静态成员的方式,但是默认是关闭的,所以应该在struts2的配置文件中先设置

   <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

   设置之后就可以用以下的表达式来访问静态成员了。

  1 访问静态方法

     <s:property value="@com.netsdar.song.manager.util.AppUtil@getName()"/>

  2 访问静态常量

     <s:property value="@com.netsdar.song.manager.util.AppUtil@Index_Title"/>

 

  5、值栈中的 Action 实例
     Struts2 框架总是把 Action 实例放在栈顶。因为 Action 在值栈中,而值栈又是 OGNL 中的根,所以引用 Action 的属性可以省略 “#” 标记,这也是为什么我们在结果页面中可以直接访问 Action 的属性的原因。
  6、 Struts2 中的命名对象
     Struts2 还提供了一些命名对象,这些对象没有保存在值栈中,而是保存在 ActionContext 中,因此访问这些对象需要使用 “#” 标记。这些命名对象都是 Map 类型。
    parameters
    用于访问请求参数。如: #parameters['id'] #parameters.id ,相当于调用了 HttpServletRequest 对象的 getParameter() 方法。
    注意, parameters 本质上是一个使用 HttpServletRequest 对象中的请求参数构造的 Map 对象,一量对象被创建 ( 在调用 Action 实例之前就已经创建好了 ) ,它和 HttpServletRequest 对象就没有了任何关系。
    request
    用于访问请求属性。如: #request['user'] #request.user ,相当于调用了 HttpServletRequest 对象的 getAttribute() 方法。
    session
    用于访问 session 属性。如: #session['user'] #session.user ,相当于调用了 HttpSession 对象的 getAttribute() 方法。
    application
    用于访问 application 属性。如: #application['user'] #application.user ,相当于调用了 ServletContext getAttribute() 方法。
    attr
    如果 PageContext 可用,则访问 PageContext ,否则依次搜索 request session application 对象。

使用OGNL集合操作符

<s:if test="''foo'' in {''foo'',''bar''}">

   muhahaha

</s:if>

<s:else>

   boo

</s:else>

<s:if test="''foo'' not in {''foo'',''bar''}">

   muhahaha

</s:if>

<s:else>

   boo

</s:else>

除了innot in之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有以下3个相关操作符。

? ?:获得所有符合逻辑的元素。

? ^:获得符合逻辑的第一个元素。

? $:获得符合逻辑的最后一个元素。

例如代码:

person.relatives.{? #this.gender == ''male''}

该代码可以获得person的所有性别为malerelatievs集合。

你可能感兴趣的:(struts2)