ValueStack

Posted zhumengke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ValueStack相关的知识,希望对你有一定的参考价值。

什么是值栈

值栈就是OGNL表达式存取数据的地方,Struts2是在有请求到达的时候为每个请求创建一个新的值栈,这也就是说值栈和请求是一一对应的,值栈封装了一次请求所需要的所有数据,这种一一对应的关系使值栈能够线程安全地为每个请求提供公共的数据存取服务。

值栈的生命周期

值栈可以作为一个数据的中转站,用于在前台-后台之间传递数据。ValueStack贯穿整个Action的生命周期,每个Action类的对象实例 都拥有一个ValueStack对象,在其中保存当前Action对象和其他相关对象。Struts2框架把ValueStack对象保存在名为”struts.valueStack”的request属性中,也就是说,ValueStack与Action的生命周期保持一致,ValueStack的生命周期是随着request的创建而创建,随着request的销毁而销毁。

一、常用的存储数据的方法        

1、向map栈中存数据,即ValueStack中的context(OgnlContext)            

//通过request,session等向map中存储数据                
ServletActionContext.getRequest().setAttribute("username","joey");                
ServletActionContext.getSession().put("pwd","123");    

 

* 直接向map栈中放数据
ActionContext.getContext().put("msg","how you doing");

2、向对象栈中存数据,即ValueStack中的root(CompoundRoot)对象            

* 先得到root,再把数据压入到root中,这中方式是放入到栈底.                
ValueStack valueStack = ActionContext.getContext().getValueStack();                
valueStack.getRoot().add(new Person());    

  

* 先得到root,利用add(index,Object)把一个对象压入到root中指定位置.                
ValueStack valueStack = ActionContext.getContext().getValueStack();                
valueStack.getRoot().add(0,new Person());//这里0,表示压入栈顶.    

 

* 存放一个map到对象栈中                
ValueStack valueStack = ActionContext.getContext().getValueStack();                
valueStack.set("msg","dude"); //先封装成Map,在把Map放入到对象栈中,且放入栈顶.            

 

* 利用valueStack的push方法把一个对象直接压入栈顶                
ValueStack valueStack = ActionContext.getContext().getValueStack();                
valueStack.push(new Person());

二、在jsp中取Action中的数据

1、取普通属性:

${str} 
//或者用struts标签库 
<s:property value="str"/>

2、取对象数据 

<s:property value="user.id" />//${user.id} 
<s:property value="user.name"/><br/>//${user.name} 
${user.id}${user.name}

3、取List集合中的数据

<s:iterator var="u" value="list">//value为Action集合List对象的名称 
    <s:property value="#u.id"/>//${u.id} 
    <s:property value="#u.name"/><br/>//${u.name} 
</s:iterator>

4、取Map集合中的数据   

<s:iterator var="u" value="map"><!-- u is a entry --> 
    //EL取值 
    <s:property value="#u.key"/>//${u.key} 
    <s:property value="#u.value.id" />//${u.value.id} 
    <s:property value="#u.value.name"/><br/>//${u.value.name} 
</s:iterator>

  

 

<%@ page import="com.opensymphony.xwork2.util.*"%>  
<%    
ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");   
List someThing= (List)vs.findValue("someThing");   
%>  

  

以上是关于ValueStack的主要内容,如果未能解决你的问题,请参考以下文章

Struts 中 ActionContext ctx.put()把数据放到ValueStack里之数据传输背后机制:ValueStack(值栈)

ValueStack值栈和ActionContext

Struts_ValueStack,Ognl

Struts2--ActionContext&ValueStack

Struts2 值栈总结(ValueStack)

struts2 ValueStack(值栈)解析