Struts2中ActonContext和ValueStack

Struts2中ActonContext和ValueStack

 

     在Struts2中,采用标准命名的上下文(Context)来处理OGNL表达式。处理OGNL的顶级对象是一个Map(也叫context map),而OGNL在这个context中就是一个顶级对象(root)。在用法上,顶级对象的属性访问,是不需要任何标记前缀的。而其它非顶级的对象访问,需要使用#标记。

     Struts2框架把OGNL Context设置为我们的ActionContext。并且ValueStack作为OGNL的根对象。除value stack之外,Struts2框架还把代表application、session、request这些对象的Map对象也放到ActionContext中去。(这也就是Struts2建议在Action类中不要直接访问Servlet API的原因,他可以通过ActionContext对象来部分代替这些(Servlet API)功能,以方便对Action类进行测试!)

     Action的实例,总是放到value stack中。因为Action放在stack中,而stack是root(根对象),所以对Action中的属性的访问就可以省略#标记。但是,要访问ActionContext中其它对象的属性,就必须要带上#标记,以便让OGNL知道,不是从根对象,而是从其它对象中去寻找。

 

      那么访问Action中的属性的代码就可以这样写

      <s:property value="postalCode"/>

 

      其它ActionContext中的非根对象属性的访问要像下面这样写:

      <s:property value="#session.mySessionPropKey"/>

 

      另外,可以使用通配符来选择collection对象的子集。

       ?  ---------- 所有匹配选择逻辑的元素

      ^ ---------- 只提取符合选择逻辑的第一个元素

      $ ---------- 只提取符合选择逻辑的最后一个元素

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

 

       以下为补充摘录的一些问题:

     

       提问:在Struts2中,如何使用自身的Tag读取Action中的变量?

     Struts2自身的Tag会根据value中的OGNL表达式,在ValueStack中寻找相应的     对象。因为action在ValueStack的顶部,所以默认情况下,Struts2的Tag中的OGNL表达式将查找action中的变量。请注意,value中的内容直接是OGNL表达式,无需任何el的标签包装。

例如:<s:property value="user.name" />

 

     提问:在Struts2中,如何使用自身的Tag读取HttpServletRequest,HttpSession 中的变量?

     在上面的知识中,我们知道,Struts2中OGNL的上下文环境中,包含request,session,application等servlet对象的Map封装。既然这些对象都在OGNL的上下文中,那么根据OGNL的基本知识,我们可以通过在表达式前面加上#符号来对这些变量的值进行访问。

例如:<s:property value="%{#application.myApplicationAttribute}" />

 

     提问:设值计算

     Struts2中使用OGNL进行设值计算,就是指View层传递数据到Control层,并且能够设置到相应的Java对象中。这个过程从逻辑上说需要分成两步来完成:

     1. 对于每个请求,都建立一个与相应Action对应的ActionContext作为OGNL的上下文环境和ValueStack,并且把Action压入ValueStack

     2. 在请求进入Action代码前,通过某种通用的机制,搜集页面上传递过来的参数,并调用OGNL相关的代码,对Action进行设值。

       上面的第一个步骤,在处理URL请求时完成,而第二个步骤由struts2内置的拦截器完成。

 

 

 

 

猜你喜欢

转载自erictao9001.iteye.com/blog/1129999