Struts2的值栈详解

来源:互联网 发布:java yield在Runnable 编辑:程序博客网 时间:2024/05/17 04:06

          ssh中页面和action之间数据存储和传递有多种方式,URL传值,模型驱动,表单传值,以及我们本文要介绍的值栈等。每种方式都有它的特点和适用范围,小编根据自身的适用经验和网 上的查询结果,对值栈的基本原理和适用方法做了一个汇总。

1值栈是什么?

          一句话概括,值栈是对应每一个请求对象的数据存储中心。Struts2的一个很重要的特点就是引入了值栈。之前我们通过缓存或者模型驱动在action和页面之间传递数据,数据混乱,并且

 难以管理,缓存还有时间和数量限制,使用起来非常的困难。值栈的引入解决了这个问题,它可以统一管理页面和action之间的数据,供actionresultinterceptor等使用。我们大多数情

 况下不需要考虑值栈在哪里,里面有什么,只需要去获取自己需要的数据就可以了,大大的降低了开发人员的工作量和逻辑复杂性。

2值栈能干什么?

          值栈能够线程安全的为每个请求提供公共的数据存取服务。每当有请求访问时,Struts2都会为每个请求创建一个新的值栈,也就是说,值栈和请求时一一对应的,不同的请求,值栈也

 不一样,值栈封装了一次请求所有操作的相关数据。正是因为值栈和请求的对应关系,因而值栈能保证每个请求访问数据时的线程安全。

3值栈有什么?

          狭义值栈:主要用力啊存取动态EL运算需要的值和结果,当然ognlValueStack对象主要是用来支持OGNL运算的。狭义值栈中存放着一些OGNL可以存取访问的数据,比如:

          action实例,这样就可以通过OGNL来访问action实例中的属性的值了

          OGNL表达式运算的值

          OGNL表达式产生的中间变量,比如Struts2标签,在JSP中使用标签,可以访问值栈中的数据。

         广义值栈:指的是ActionContext对象,actioncontext对象是action运行的上下文,每个actioncontext都是一个容器,包含着action运行所需要的数据,比如参数,会话等。

         actioncontext中存放了很多的值,比如:

         requestparameters:请求中的参数,这里的参数都是从请求对象中复制出去的。

         requestattribute:请求中的属性,他的数据类型是map,存放着请求对象的属性数据,这些数据和请求对象的attribute是联动的。

         sessionattribute:会话中的属性,数据类型是map这些属性和会话对象的attribute是联动的。

         applicationattribute:应用中的属性,数据类型是map

         valuestack:也就是狭义值栈,actioncontextvaluestackOGNL访问的根,也即是说,在默认情况下,OGNL默认访问valuestack里面的值。

4值栈如何使用?

         valuestack是存放在actioncontext中的,它是通过OGNL表达式来访问的,我们可以在JSP页面通过Struts2标签来访问数据。valuestack首先是一个堆栈,所以他满足堆栈的使用特点, 当值栈中存在多个对象,且有相同属性时,值栈会按照从栈顶到栈底的顺序,寻找第一个匹配的对象。

       获取值栈:ValueStack testValueStack =ActionContext.getContext().getValueStack();

       如何使用:valuestack主要方法如下:

<span style="font-size:18px;">       testValueStack.push(Object arg0); 向栈顶压入一个对象。       testValueStack.pop(); 获取值栈的顶层对象,并且移走这个对象。       testValueStack.peek();   获取顶层对象,但是不移走这个对象       testValueStack.set(String arg0, objectarg1);  向值栈中添加一个对象。       testValueStack.setValue(String arg0,object arg1);  向值栈中添加一个对象。</span>

应用:action中代码:

<span style="font-size:18px;">publicString execute() {// 查询热门商品、放到值栈中List<Product>hotProductList = productService.findHotProduct();ActionContext.getContext().getValueStack().set("hotProductList",hotProductList);return"success"; }</span>

 jsp代码:

定义Struts2标签

<span style="font-size:18px;"><%@tagliburi="/struts-tags" prefix="s"%>  </span>

访问值栈数据

<span style="font-size:18px;"><s:iteratorvar="p" value="hotProductList"></span>


2 0