`
xitong
  • 浏览: 6158405 次
文章分类
社区版块
存档分类
最新评论

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值栈的理解

    struts2的值栈

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

    struts2--3.Ognl与值栈

    struts2--3.Ognl与值栈

    j2ee 培训之Struts2教程

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

    struts2模拟

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

    马士兵Struts2笔记2013

    建立一个Struts2 工程,用Action的属性接收参数,使用Domain Model (实体模型) 接收参数,Struts2_2.1.6版本的中文问题,Struts模块包含,Struts简单数据验证 ,Struts ValueStack(值栈) Debug,Value Stack ...

    linjin101#javaStudy#Struts2中的OGNL和值栈ValueStack1

    1、什么是值栈 2、值栈的内部结构 3、ActionContext和ValueStatck的关系 4、如何获取值栈对象 5、向值栈存数据 6、从值栈中获取数据

    西安领航核心项目Struts2重点、难点总结

    对Struts2框架中的相关知识还有困惑的同学有福了,此次上传的是西安领航何足道老师的核心项目Struts2部分的重点难点的归纳总结,...主要包括的知识有Action的动态调用方法、值栈、拦截器、ActionContext、Ognl表达式等

    Struts2入门教程(全新完整版)

    1.值栈入门 22 2.OGNL入门 24 3.普通方法访问 24 4.静态方法访问 24 5.默认类Math的访问 24 6.调用普通类的构造方法 25 7.集合对象初步 25 8.集合对象进阶 25 9.N语法top语法 26 10.获取Stack Context中的信息 26 11...

    struts2 标签库使用文档

    Struts2标签库的组成 ...数据访问标签:主要包含用于输出值栈(ValueStack)中的值,完成国际化等功能的标签。 流程控制标签:主要包含用于实现分支,循环等流程控制的标签。 AJAX标签:用于支持Ajax效果

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

    struts2 OGNL之标签访问值栈(value stack)用法,希望能对大家有帮助

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

    Struts2入门介绍、环境配置与基本操作演示,包含OGNL,值栈与域概念

    Struts2登录实例--亲测可用

    Struts2登录实例--亲测可用,拦截器,Action,值栈......都用到了

    详解Java的Struts框架中栈值和OGNL的使用

    主要介绍了Java的Struts框架中栈值和OGNL的使用,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下

    struts2标签库的综合应用

    struts2 标签库使用说明.Struts2中通用标签可以分为二类:控制标签和数据标签。控制标签用于呈现页面时控制执行流程,数据标签用于访问值栈中的数据。

    尚硅谷Java视频_Struts2视频教程

    每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。  学习完本Java视频教程,你会真正理解 Struts2 的优雅和简洁,并使你具备开发 Struts2 企业...

    struts2类型转换和验证流程图

    可以详细了解struts2的流程,便于学习和研究struts2,大家可以交流学习。

    栈的简单代码

    值栈(ValueStack)是Struts2的一个核心概念,类似于正常的栈,符合后进先出的 栈的特点,可以在值栈中放入、删除和查询对象。Strtus2对OGNL进行了扩充,将值栈作为OGNL的根对象。 什么是值栈?符合先进后出的特点,能给...

    struts2 标签库 帮助文档

    可以输出值栈、StackContext 、ActionContext中的值。 push:将某个值放入值栈。 set:设置一个新的变量。 text:输出国际化信息。 url:生成一个URL地址。 表单标签: checkbox标签:复选框。 checkboxlist标签...

    Struts2由浅入深学习教程(46集)

    本视频对 Struts2 庞杂的技术点进行抽丝剥茧,提炼出企业开发必备的核心技术和重要技能。每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。

Global site tag (gtag.js) - Google Analytics