struts2之值栈(value stack)(转)
通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求道服务器端 action时,就有个堆栈,如果action在服务器端进行跳转,所有action共用一个堆栈,当需要保存在action中的数据时,首先从栈顶开始 搜索,若找到相同的属性名(与要获得的数据的属性名相同)时,即将值取出,但这种情况可能出现找到的值不是我们想要的值,那么解决此问题需要用TOP语法 和N语法来进行解决。
众所周知,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类的相应属性
个人总结: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"
/>
Rupees
相关推荐
Struts2 值栈的理解 Struts2 值栈是 Struts2 框架中的一种核心机制,负责存储和管理 Action 中的数据。在 Struts2 中,每个 Action 类都有一个 ValueStack 对象,该对象贯穿整个 Action 的生命周期。在 Struts2 ...
OGNL(Object-Graph Navigation Language)是Struts2中的表达式语言,而值栈则是OGNL工作的重要机制。这两者是Struts2框架的核心组件,使得数据绑定和动态方法调用变得更加便捷。 **OGNL:对象图导航语言** OGNL是...
在Struts2中,你可以创建领域对象,通过setter和getter方法来接收和设置请求参数,这些对象可以在多个Action之间共享,提高了代码的复用性。 4. **Struts2_2.1.6版本的中文问题** 在某些版本的Struts2中,可能出现...
6. **值栈(Value Stack)**:值栈是Struts2中的一个核心组件,它存储了请求中的所有对象。ActionContext提供了对值栈的访问,使得视图能够方便地获取和展示数据。 7. **Freemarker和Velocity模板**:Struts2支持...
5. **值栈(Value Stack)**:Struts2使用值栈来存储Action实例以及Action属性,方便在视图层(JSP)中直接访问。在JSP页面中,你可以通过OGNL(Object-Graph Navigation Language)表达式来获取值栈中的数据。 6. ...
1. **Action类**:在Struts 2中,Action类是业务逻辑的载体,负责处理用户的请求。每个Action类对应一个URL,用户通过不同的URL来调用不同的Action。 2. **配置文件**:Struts 2使用XML配置文件(通常为struts.xml...
在Struts2中,我们可以创建一个Action类来处理用户的登录请求。Action类是业务逻辑的载体,通常会有一个`execute()`方法,该方法会被Struts2调用以响应用户的请求。在`execute()`方法中,我们需要验证用户的用户名和...
接下来,我们来谈谈**OGNL**,它是Struts2中的表达式语言,用于访问和操作对象图。OGNL可以方便地在视图层和模型层之间传递数据。例如,你可以使用OGNL在JSP页面中直接访问Action类的属性,或者在Action类中设置请求...
值栈是Struts2中的一种数据管理机制,它存储Action、结果和其他对象,方便在Action之间共享数据。 **5.拦截器(Interceptors)** 拦截器是Struts2的一大特色,它们在Action执行前后进行额外处理,如日志记录、权限...
通过以上介绍,你应该对Struts2中`s:property`标签访问值栈的用法有了深入理解。在实际开发中,结合OGNL的强大功能,`<s:property>`标签可以帮助你方便地展示和操作模型数据,提升Web应用的用户体验。
在Struts2中,Action类是处理用户请求的核心组件,它封装了业务逻辑。为Action的属性注入值是Struts2的一个关键特性,使得我们可以方便地从请求参数中获取数据并绑定到Action实例上,以便后续的业务处理。 这个特性...
3. **Action上下文(Action Context)**:`org.apache.struts2.dispatcher`包下的`ActionContext`类存储了请求处理过程中的上下文信息,如值栈(Value Stack)、session、request、response等。 4. **值栈(Value ...
最后,OGNL(Object-Graph Navigation Language)是Struts2中用于表达式语言的组件,它允许在Action、值栈和视图之间轻松地访问和操作对象属性。例如,我们可以在JSP页面上直接使用OGNL表达式来显示模型数据,或者在...
1. **值栈访问**:Struts2使用值栈存储请求中的所有对象,OGNL可以从值栈顶部找到并访问对象。例如,`#request.user.name`表示从HTTP请求对象中获取`user`属性的`name`。 2. **动态方法调用**:OGNL支持直接调用...
5. **值栈(Value Stack)**:Struts2的值栈是一个存储对象的数据结构,它可以将Action实例、ActionForm对象、OGNL表达式等放入栈中,方便视图层进行数据访问。 6. **OGNL(Object-Graph Navigation Language)**:...
4. **Value Stack**: 值栈是Struts2中一个重要的概念,它是一个存储对象的栈结构,用于在Action与视图之间传递数据。ActionContext是访问值栈的上下文对象,可以通过它将数据放入栈中供JSP或其他视图技术使用。 5. ...
7. **OGNL(Object-Graph Navigation Language)**:OGNL是Struts2中的表达式语言,用于在视图层动态地访问和修改Action或值栈中的数据。 8. **插件体系**:Struts2具有丰富的插件支持,如Tiles插件用于页面布局,...
- 值栈(Value Stack)的作用和实现方式。 - OGNL(Object-Graph Navigation Language)如何用于表达式语言和在Struts2中的应用。 - I18N(国际化)和L10N(本地化)是如何在Struts2中实现的。 - 文件上传和下载机制...
在这个“Struts2登录实例”中,我们将探讨如何利用Struts2的核心概念,如拦截器(Interceptor)、Action和值栈(Value Stack),来实现一个实际的登录功能。 首先,登录功能是Web应用中的基础部分,它验证用户的...
5. **值栈(Value Stack)**:Struts2中的一个重要概念,它存储了Action和结果视图之间的数据。Action中的属性会被放入值栈,视图可以直接访问。 6. **OGNL(Object-Graph Navigation Language)**:Struts2中的...