`
mapengfei00099
  • 浏览: 13479 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

struts valueStack 解析

阅读更多

Struts2OGNL基础上的增强
  1、值栈(ValueStack)
    Struts2OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext),并将值栈设为OGNL的根对象。
    我们知道,OGNL上下文中的根对象可以直接访问,不需要使用任何特殊的标记,而引用上下文中的其他对象则需要使用“#”来标记。由于值栈是上下文中的根对象,因此可以直接访问。那么对于值栈中的对象该如何访问呢?Struts2提供了一个特殊的OGNLPropertyAccessor,它可以自动查找栈内的所有对象(从栈顶到栈底),直接找到一个具有你所查找的属性的对象。也就是说,对于值栈中的任何对象都可以直接访问,而不需要使用“#”
    假设值栈中有两个对象:studentemployee,两个对象都有name属性,student有学号属性number,而employee有薪水属性salaryemployee先入栈,student后入栈,位于栈顶,那么对于表达式name,访问的就是studentname属性,因为student对象位于栈顶;表达式salary,访问的就是employeesalary属性。正如你所见,访问值栈中的对象属性或方法,无须指明对象,也不用“#”,就好像值栈中的对象都是OGNL上下文中的根对象一样。这就是Struts2OGNL基础上做出的改进。
  2、[N]语法
    如上所述,如果想要访问employeename属性,应该如何写表达式呢?我们可以使用[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后面跟上一个数字,那么将使用栈中指定位置处的对象类。
  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,相当于调用了ServletContextgetAttribute()方法。
   attr
    如果PageContext可用,则访问PageContext,否则依次搜索requestsessionapplication对象。

 

 

使用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解析文件

    - **ValueStack**: Struts2中的ValueStack是一个对象栈,用于存储ActionContext中的数据。它可以简化视图层的数据访问,只需通过OGNL表达式即可访问栈中的对象。 - **OGNL(Object-Graph Navigation Language)**: ...

    struts2源码解析.pdf

    在"struts2源码解析.pdf"文档中,主要探讨了以下几个关键组件及其功能: 1. **ActionContext**: - `ActionContext`是Struts2的核心上下文,它存储了与当前Action执行相关的所有信息,如请求参数、session数据等。...

    struts2核心解析

    在本文中,我们将全面解析Struts2的核心组件、工作原理以及它如何简化MVC(模型-视图-控制器)架构的开发。 1. **Action与ActionMapping** Struts2的核心在于Action类,它是业务逻辑处理的主要载体。每个Action...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理.zip

    《Struts2技术内幕——深入解析Struts2架构设计与实现原理》这本书深入讲解了这些内容,包括但不限于Action的设计模式、Interceptor的实现原理、ValueStack的工作流程、以及Struts2与其他框架的整合策略,对于想要...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理

    Struts2 的核心组件还包括值栈(ValueStack),它是用来在控制器和视图之间传递数据的一个临时存储结构。开发者可以在Action类中将数据压入值栈,然后在JSP页面中使用OGNL(Object-Graph Navigation Language)...

    Struts2源代码与源码解析文档

    5. **ValueStack与Ognl**:ValueStack是Struts2中用于数据传递的机制,而OGNL(Object-Graph Navigation Language)是Struts2的默认表达式语言,用于访问和操作ValueStack中的对象。这部分源码解析会介绍ValueStack...

    struts2源码解析[归纳].pdf

    这份"struts2源码解析[归纳].pdf"文档显然深入探讨了Struts2的核心组件和工作原理。以下是对其中提到的关键概念的详细解释: 1. **ActionContext**: ActionContext是Struts2中一个非常重要的类,它封装了当前请求...

    struts2的深入理解内核解析

    深入理解Struts2的内核解析有助于我们更好地利用这个框架,提高开发效率并优化应用性能。 在用户发起一个URL请求时,Struts2容器开始执行一系列操作: 1. **过滤器Dispatcher**:Struts2的核心是`FilterDispatcher...

    struts2框架面试题及答案02

    根据给定的信息,我们将深入探讨Struts2框架中的一些核心概念,包括OGNL表达式的使用、ValueStack的理解及其数据存取方法,以及拦截器的生命周期等。 ### OGNL表达式及其三要素 #### OGNL简介 OGNL(Object-Graph ...

    struts2入门例子

    6. **运行流程**:当一个请求到达服务器,Struts2框架会解析`struts.xml`中的配置,找到对应的Action并执行。Action执行完毕后,根据返回的结果名找到相应的Result进行页面跳转。在整个过程中,拦截器链会被触发,...

    Struts2面试题

    - 当Struts2接收到请求后,会创建`ActionContext`、`ValueStack`以及`Action`对象,并将`Action`对象存入`ValueStack`,使得Action中的实例变量可以通过OGNL访问。 - `ValueStack`是多实例的,每个请求都有自己的`...

    struts2综合复习习题

    OGNL的根对象是`ValueStack`,它是Struts2框架内部用于存储请求作用域中的所有对象的容器。 #### 九、在jsp页面中可以通过Struts2提供的()标签输出国际化信息 **答案解析:** - 正确答案为 **D.**。 - `&lt;s:text&gt;...

    struts2_ppt

    总的来说,"struts2_ppt"可能包含的内容广泛,从基础概念、核心组件的解释、配置方法、源码解析,到工具使用、安全实践以及与其他框架的整合。对于想要学习或深入了解Struts2的开发者来说,这份资料将是宝贵的资源。

    Struts2_JSON_Demo

    - **JSON ValueStack**:当配置了JSON结果类型,Struts2会自动将ValueStack中的对象转换为JSON格式,无需手动序列化。 4. **返回JSON数据**: - **Action的返回值**:Action的返回值可以是简单的字符串,也可以是...

    Struts2源码

    Struts2是一个基于MVC(Model-View-...在研究struts-2.2.1.1 src这个源码包时,可以关注各个主要组件的实现,如Action、Interceptor、ValueStack等,以及配置解析和请求处理流程,这对于提高Java Web开发技能大有裨益。

    struts2.1-8源码

    - **ValueStack**:ValueStack是Struts2中的数据容器,它用于存储Action对象和其他可展示的值,方便视图层访问。 - **Freemarker或JSP作为视图**:Struts2可以与多种视图技术结合,如Freemarker模板语言或传统的JSP...

    Struts2官方文档

    ValueStack是一个对象栈,存放了Action实例和其他需要传递到视图的数据,方便OGNL表达式的解析。 8. **Struts2的异常处理**:Struts2通过全局异常处理机制,允许开发者统一处理应用中的异常,提高代码的健壮性。 9...

    struts2框架模板

    - **DispatcherServlet**:Struts2的核心控制器,负责接收HTTP请求,解析请求并调用相应的Action。 - **ActionContext**:存储请求和上下文相关的数据,是Action和外部环境通信的桥梁。 - **ValueStack**:用于...

    struts源码struts源码struts源码

    当用户发送请求时,ActionServlet会根据配置文件(struts-config.xml)解析并路由到相应的Action。 2. **ActionMapping**:这个类负责将请求映射到特定的Action。在struts-config.xml中定义,每个ActionMapping包含...

    mldn 李兴华 struts2.0 源代码

    李兴华是一位知名的IT教育专家,他在讲解Struts2.0源代码时,通常会深入解析框架的核心机制、工作流程以及如何通过源码理解其实现原理。在“mldn 李兴华 struts2.0 源代码”这个主题中,我们可以学习到以下几个关键...

Global site tag (gtag.js) - Google Analytics