ValueStack对象
ValueStack, 即值栈对象。
值栈对象:
是整个struts数据存储的核心,或者叫中转站。
用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象;
然后把Action对象放入值栈中;
最后再把值栈对象放入request中,传入jsp页面。
(key: struts.valueStack);
开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。 (ActionContext是给开发者用的,便于学习与使用。)
OgnlContext与ValueStack对象的关系?
每个ActionContext都会对应一个ValueStack,
Action对象放入值栈中,而ActionContext创建的实例对象其实就是一个OgnlContext.
OgnlContext就是一个上下文对象的Map, Struts标签默认使用OGNL方式。
每个Action对象的实例都会有一个ValueStack值栈对象,这个对象贯穿Action的整个生命周期。
每一次Struts2接受的奥一个action请求时,会第一时间创建一个值栈对象,但是不会马上调用Action()方法,而是将Action中对应的属性放到值栈的顶层节点。
值栈是OGNL的根,所以我们使用OGNL访问Action的属性时可以省略#,直接获取。
数据回显:
这里我们项实现的是访问一个action,然后跳转到一个login.jsp界面,然后登录表单中实现数据回显。
方法一:我们可以利用ActionContext对象获取request集合,然后将数据存入其中,然后在页面中取出来。
首先我们建立一个活动UserAction
import java.util.Map;
import cn.itcast.validation.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class UserAction extends ActionSupport{
public String viewUpdata(){
User userInfo=new User();
userInfo.setUserName("张三");
userInfo.setPwd("123456");
ActionContext context=ActionContext.getContext();
Map<String,Object> request=(Map<String,Object>)context.get("request");
request.put("userInfo", userInfo);
return "viewUpdata";
}
}
然后对活动进行注册~(此处省略了在web.xml配置struts2的核心过滤器)
<struts>
<package name="databack" extends="struts-default" >
<action name="user_*" class="cn.itcast.databack.UserAction" method="{1}">
<result name="viewUpdata">/viewUpdata.jsp</result>
</action>
</package>
</struts>
最后是我们要进行数据回显的界面viewUpdate.jsp
<body>
<%@taglib uri="/struts-tags" prefix="s" %>
<s:form action="#">
<s:textfield name="user.userName" value="%{#request.userInfo.userName}" label="用户名"></s:textfield>
<s:textfield name="user.pwd" value="%{#request.userInfo.pwd}" label="密码"></s:textfield>
</s:form>
</body>
我们访问 user_viewUpdate 得到数据回显后的界面~
方法二:使用值栈 ValueStack
相比起获取request的map往其中存值,再取值,使用值栈就显得方便多了,我们一起来看看。
步骤一:依旧是UserAction的活动界面
public class UserAction extends ActionSupport{
public String viewUpdata(){
User userInfo=new User();
userInfo.setUserName("张三");
userInfo.setPwd("123456");
ValueStack vs=ActionContext.getContext().getValueStack(); //获取值栈对象
vs.push(userInfo); //将需要回显的数据对象入栈
return "viewUpdata";
}
}
步骤二:活动的配置同上,(此处省略)
步骤三:在界面中获取回显的数据 (必须注意的是,一定要使用struts标签)
<body>
<%@taglib uri="/struts-tags" prefix="s" %>
<s:form action="#">
用户名:<s:textfield name="userName" ></s:textfield> //name值要与回显数据的名称相对应
密码:<s:textfield name="pwd"></s:textfield>
<input type="submit" value="提交">
</s:form>
</body>
运行出来同样可以实现数据的回显~