`
mizhihua
  • 浏览: 53848 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2 值栈

 
阅读更多
众所周知,Strut 2的Action类通过属性可以获得所有相关的值,如请求参数、Action

配置参数、向其他Action传递属性值(通过chain结果)等等。要获得这些参数值,我

们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts 2调用Action

类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。

  要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯

穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当

Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用

Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点

(ValueStack对象相当于一个栈)。只是所有的属性值都是默认的值,如String类型的

属性值为null,int类型的属性值为0等。

  在处理完上述工作后,Struts 2就会调用拦截器链中的拦截器,当调用完所有的拦

截器后,最后会调用Action类的Action方法,在调用Action方法之前,会将ValueStack

对象顶层节点中的属性值赋给Action类中相应的属性。大家要注意,在这里就给我们带

来了很大的灵活性。也就是说,在Struts 2调用拦截器的过程中,可以改变ValueStack

对象中属性的值,当改变某个属性值后,Action类的相应属性值就会变成在拦截器中最

后改变该属性的这个值。

  从上面的描述很容易知道,在Struts 2的的Action类可以获得与属性同名的参数值

就是通过不同的拦截器来处理的,如获得请求参数的拦截器是params,获得Action的配

置参数的拦截器是staticParams等。在这些拦截器内部读取相应的值,并更新

ValueStack对象顶层节点的相应属性的值。而ValueStack对象就象一个传送带,将属性

值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传

到Action对象,并将ValueStack对象中的属性的值终值赋给Action类的相应属性


无意中发现,属性没有写set get 方法,依然会注入值和取到值.

甚是不解,求助于网上依然没有得到解决!

花了点时间看了下源码!

发现:

struts2 参数拦载器在注入值的时候,有两种机制,(调用ognl)

这是OgnlRuntime 类中一段源码 hasSetMethod( context, target, targetClass,

name ) || hasField( context, target, targetClass, name );

他会先查看你的action 中有没有对应的方法,如果发现无此方法,他会利用第二种方法

直接给属性覆值,而无需对应的set方法!(当然都是通过反射机制实现的)

如果action 中属性过多的话,我觉得就不用写set get 方法了!(不知道这个会不会给以

后维护带来问题).

个人总结:OGNL中的值栈相当于一个数据的中转站,或者叫数据的缓冲存储中心。另外,OGNL除了有值栈(VS)这个特别的对象外,它的表达式语言也自成一派。




值栈和session都是在ActionContext的全局领域内的,按我个人通俗的说法就是ActionContext最大,并且ActionContext中包含值栈和session这些全局的容器,因为actioncontext是线程级的,那么session就是线程安全的。

下面介绍如何引用值栈中的对象(又称属性或者值,什么叫法不重要,重要的是知道我们是引用值栈内的东西):

我们在jsp页面是直接面向值栈操作,所以值栈的内容可以直接用名字来引用。值栈外的如session就要用OGNL语法中的#来操作。

对于值栈来说,struts2有专门的tag叫<s:property >来引用值栈内容,如下例:

<s:property value="artist.bio" />

session是值栈外的(全局的,或称根级别),所以要用OGNL的#符号表达式来引用session里的对象,如

<s:property value="#session['artistBio']" />

可以先把一个变量级别升高成为全局,然后用#符号来引用值,那么用s:set标签来做,如

<s:set name="artistName" value="artist.name" /> =====》级别提高了哦,YEAH!!

<s:set name="artistBio" value="artist.bio" /> ======》老子级别也高了,YEAH!!
<b>Album Title :</b> <s:property value="title" /> <br>
<b>Artist Name :</b> <s:property value="#artistName" />
<br> <b>Artist Bio :</b> <s:property value="#artistBio" /> ===》级别高了,不在值栈内就不能直接引用了。。。。。需要加#号

假如想让对象不但级别高了(全局的)在整个session周期内持久,就要加上scope,如

<s:set name="artistName" value="artist.name" scope="session" />

<s:set name="artistBio" value="artist.bio" scope="session" />
<b>Album Title :</b> <s:property value="title" /> <br>
<b>Artist Name :</b> <s:property value="#session['artistName']" /> <br>
<b>Artist Bio :</b> <s:property value="#session['artistBio']" /> <br>
下面还有push标签,用来把对象放到值栈顶端:
<b>Album Title :</b> <s:property value="title" /> <br>
<s:push value="artist">
<b>Artist Name :</b> <s:property value="name" /> <br>
<b>Artist Bio :</b> <s:property value="bio" /> <br>
</s:push>
那么<s:bean>这个标签,用来在页面实例化一个bean放在值栈中,它的生存周期就是到了</s:bean>为止就结束了,所以说假如要用<s:property>这个标签来引用该bean的属性的话,一定要在<s:bean>和</s:bean>标签之中用。如下面例子:
<s:bean name="vaannila.CurrencyConverter">
    <s:param name="dollars" value="100" />
100Dollars =
<s:property value="rupees" />
Rupees
</s:bean>
那么假如在bean标签之外引用呢,因为这时候这个bean的生命周期结束了,已经不在值栈内了,所以要用的话,需要事先在前面bean的声明地方加上一个变量声明,使其成为全局的对象,然后再像引用session变量那样的方式来引用它,如下例:
<s:bean name="vaannila.CurrencyConverter" var="converter">
<s:param name="dollars" value="100"></s:param>
</s:bean>
100 Dollars =
<s:property value="#converter.rupees" />
分享到:
评论

相关推荐

    Struts2值栈的理解

    Struts2 值栈的理解 Struts2 值栈是 Struts2 框架中的一种核心机制,负责存储和管理 Action 中的数据。在 Struts2 中,每个 Action 类都有一个 ValueStack 对象,该对象贯穿整个 Action 的生命周期。在 Struts2 ...

    struts2--3.Ognl与值栈

    OGNL(Object-Graph Navigation Language)是Struts2中的表达式语言,而值栈则是OGNL工作的重要机制。这两者是Struts2框架的核心组件,使得数据绑定和动态方法调用变得更加便捷。 **OGNL:对象图导航语言** OGNL是...

    struts2的值栈

    用一个小小的flash来形象的演示struts2中值栈的操作过程,非常直观!

    j2ee 培训之Struts2教程

    01 Struts2入门 02 Struts2拦截器 03 Struts2值栈与类型转换 04 Struts2标签 05 Struts2验证和国际化 06 Struts2 CRUD 07 Struts2 研讨

    Struts2 Struts2 超好的Struts2 pdf 文档

    6. **值栈(Value Stack)**:值栈是Struts2中的一个核心组件,它存储了请求中的所有对象。ActionContext提供了对值栈的访问,使得视图能够方便地获取和展示数据。 7. **Freemarker和Velocity模板**:Struts2支持...

    struts2用siftest判断属性和字符串相等时注意双引号和单引号的使用以及%$%#的使用.docx

    `%{}`用来访问Struts2值栈(ValueStack)中的对象,它可以是Action对象或其他存储在栈中的任何对象。例如,如果你的Action对象有一个属性`systemSettingModel`,你可以这样获取其`settingValue`属性的值: ```xml ...

    马士兵Struts2笔记2013

    为了调试目的,可以开启Struts2的值栈调试功能,查看栈中的内容,帮助开发者了解当前请求的状态和数据流。 9. **Struts2访问Web元素** Struts2可以通过OGNL(Object-Graph Navigation Language)轻松地访问和操作...

    struts2模拟

    struts2模拟模拟工具,可以实现action访问,我表单属性的自动封装。提供了页面显示和跌带器,利用struts2值栈(valueStack)和对象栈map栈的思想。可以用来了解struts2的执行过程,纯属个人学习

    struts2核心技术整理

    5. **Value Stack**:值栈是Struts2的一个重要概念,它是一个对象容器,存储Action实例和需要传递到视图的数据。视图可以直接通过OGNL(Object-Graph Navigation Language)表达式访问值栈中的对象。 二、OGNL...

    struts2-core-2.0.11源码

    4. **值栈(Value Stack)**:Struts2的模型部分主要依赖于值栈,它是`org.apache.struts2.util`包的一部分,用于存储Action的属性和结果,方便视图层直接访问。 5. **结果类型(Result Types)**:`org.apache....

    struts2入门demo

    5. **值栈(Value Stack)**:Struts2使用值栈来存储Action实例以及Action属性,方便在视图层(JSP)中直接访问。在JSP页面中,你可以通过OGNL(Object-Graph Navigation Language)表达式来获取值栈中的数据。 6. ...

    struts 2教程资料

    5. **Value Stack**:Struts 2使用值栈来传递数据,Action中的属性可以直接放入值栈,视图层可以直接访问这些属性。 6. **OGNL(Object-Graph Navigation Language)**:Struts 2默认使用OGNL作为表达式语言,用于...

    Struts2环境配置与基本操作演示

    在本教程中,我们将深入探讨Struts2的基础知识,包括环境配置、OGNL(Object-Graph Navigation Language)以及值栈和域的概念。 首先,让我们开始介绍如何配置Struts2环境。安装Struts2需要以下步骤: 1. **添加...

    struts2 OGNL之&lt;s:property&gt;标签访问值栈(value stack)用法

    在这个主题中,我们将深入探讨OGNL(Object-Graph Navigation Language)以及如何通过`&lt;s:property&gt;`标签来访问Struts2中的值栈(Value Stack)。值栈是Struts2中一个核心的概念,它是一个存储用户请求数据和应用...

    struts2+JSP

    5. **值栈(Value Stack)**:Struts2使用值栈存储请求中的数据,简化视图层的数据访问。 **JSP技术的基本概念:** 1. **指令元素(Directives)**:如page、include、taglib,它们用于设置全局属性、包含其他页面...

    Struts2框架及注释和用法

    值栈是Struts2中的一种数据管理机制,它存储Action、结果和其他对象,方便在Action之间共享数据。 **5.拦截器(Interceptors)** 拦截器是Struts2的一大特色,它们在Action执行前后进行额外处理,如日志记录、权限...

    Struts2_OGNL

    值栈是Struts2框架中的核心概念之一,它是一个用于临时存储对象的栈结构,这些对象包括Action实例、模型对象、临时对象等。值栈中的对象可以按照以下四种类型划分: 1. 栈顶对象:在程序执行过程中,由容器自动创建...

    Struts2--为Action的属性注入值

    这个特性主要依赖于Struts2的OGNL(Object-Graph Navigation Language)表达式语言和Struts2的核心拦截器栈。OGNL是一种强大的、直观的语言,用于访问和操作对象及其属性。在Struts2中,它用于从HTTP请求中提取参数并...

    Struts2经典小例题

    在Action类中,可以创建一个getter方法来获取存储在session中的用户名,并通过Struts2的值栈(Value Stack)将其传递给JSP页面。在JSP页面上,我们可以使用OGNL(Object-Graph Navigation Language)表达式来访问并...

    struts2完整压缩包

    4. **Value Stack**: 值栈是Struts2中一个重要的概念,它是一个存储对象的栈结构,用于在Action与视图之间传递数据。ActionContext是访问值栈的上下文对象,可以通过它将数据放入栈中供JSP或其他视图技术使用。 5. ...

Global site tag (gtag.js) - Google Analytics