Struts2的ValueStack(值栈)

来源:互联网 发布:淘宝弹力椅套 编辑:程序博客网 时间:2024/05/18 01:29
1.什么是ValueStack
Struts2的Action 类通过属性可要获得所有相关的值,如请求参数属性值相等。要获得这些参数值,我们要做的唯一一件事情
就是在Action类中声明与参数同名的属性。在Struts2调用Action类的Action方法(默认是execute方法)之前,就为相应的action属性赋值。
要完成这个功能,很大的程度上,Struts2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期,每个Action类的对象实例会拥有一个
Valuestack对象
当Struts2接收到一个action的请求后,会建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack的顶层节点中。
(ValueStack对象相当于一个栈)。只是所有的属性值都是默认的值, 如String类型的属性值为null,int类型的属性值为0等。在处理完上述的工作后,Struts2就会
调用拦截器链中的拦截器,这些拦截器 根据用户请求参数去更新valueStack对象顶层节点的相应属性的值,最后才会传到Action对象,并将这些ValueStack对象中的
属性值,赋给Action类的相应属性。当调用完所有的拦截器后,才会调用action类的Action方法。valueStack会在请求开始的时候被创建,请求结束时消亡。


2为什么要使用valueStack
在Struts1中,Action为了能将处理的结果传递给一个页面进行显示,通常需要借助request对象。而Struts2会自动将ValueStack与Action中的属性关联,
基于这一点,可在Aciton中定义某个属性,转发到JSP页面后,直接从ValueStack中取出数据,并显示。

3.如何使用valueStack
对于大部分Web应用程序而需要获得请求Action的处理结果,例如,在线购物系统需要查询某个种类下的商品信息,则Action调用业务逻辑组件的相关方法得到该种类下的全部商品,
而JSP页面则获取该Action的处理结果,并将全部结果迭代输出。再次修改LoginAction业务逻辑控制器,实现。如果用户成功登陆,则获取某个系列的全部商品,并交由JSP页面输出。
为了让Action可以获取这些商品,需要创建一个业务逻辑组件,命名为shopservice.java:
代码如下:
public class ShopService{
//构造一个shopservice静态对象,实现单例工厂模式
private static ShopService shopService=new ShopService();
//构造函数私有,做成为单例模式
private ShopService()
{

}
//定义静态方法,实例化自己
public static ShopService newInstance()
{
return ShopService;
}

//定义一个方法,用于获取某个系统的所有商品
public String[] getShopNames()
{
//模拟从数据库查询出的某系列商品的集合
String[] shops={"彩电","空调","微波炉","电冰箱"};
return shops;
}
}


再次修稿LoginAction业务控制器的代码,在其中使用ShopService业务组件,代码如下:
public class LonginAction{
private String[] shops;
//封装用户请的请求参数的uid属性
private String uid;
//封装用户请求的pwd属性
private String pwd;
//处理用户请求的execute方法
public String execute() throws Exception{
//调用模型进行业务逻辑错误
UserInfo userInfo =UserService.newInstance().login(this.uid,this.pwd);
if(userInfo!=null){
//将UserInfo的信息,添加到会话中
ActionContext.getContext().getSession().put("userInfo",userInfo);
//调用业务逻辑,获取商品信息列表
String[] shops=ShopService.newInstance().getShopNames();
//给shops属性赋值
this.setShops(shops);
//转发成功到页面,该success与Struts.xml配置文件中<result>性对应
return "success";
}
//转发失败
return "fail";
}

....
getter()and setter()方法
...
}

当Action设置了某个属性后,Struts2将这些属性值全部封装在一个称作“Struts.valueStack”的请求属性里,为了在JSP页面中输出商品信息,可通过如下代码来获取包含全部输出信息的Valuestack






request.getAttribute("struts.valueStack");

上面代码返回一个ValueStack对象,该对象封装全部的输出信息,从数据结构上来看,ValueStack有点类似Map结构,但它比Map结构更加强大。Action所有的属性都被封装到了ValueStack对象中,
Action的属性名可以理解为ValueStack中的value的名称。下面重新修改idex.jsp页面,在该页面中,从ValueStack中获取商品信息并显示。代码如下:




<%
//从请求中获取valueStack对象
ValueStack vs=(ValueStack)request.getAttribute("struts.valueStack");
//调用ValueStack的findValue方法获取Action中的shops属性值
String[] shops=(String[])vs.findValue("shops");
//迭代输出所有shop值
for(int i=0;i<shops.lenth;i++){
out.println(shops[i]+"<br/>");
}
%>
事实上,Struts2不是通过属性字段名与ValueStack关联,而是通过Getter、setter方法,所以上述的LoginAciton可以修改成以下代码:
public class LoginAction{
//封装用户请求参数的Uid
private String uid;

private String pwd;

public String execute() Throws Exception{
UserInfo userInfo=UserService.newInstance().login(this.uid,this.pwd);
if(userInfo!=null){
ActionContext.getContext().put("userInfo",userInfo);

return "success";
}
return "fail";
}
}

.....
getter()and sertter()方法
public String[] getShops(){
//调用业务逻辑组件,获取商品信息列表
return ShopService.newInstance().getShopNames();
}
public String getPwd(){
return pwd;
}
......
......
...









0 0
原创粉丝点击