Struts2_值栈

1.什么是值栈?
    值栈:就是对应每一个请求对象的轻量级的内存数据中心。Strust2由值栈来统一管理数据,供Action、Result
拦截器等Struts2的其他部分使用。
2.值栈能做什么?
     值栈能够线程安全地位每个请求提供公共的数据存取服务。
     每一个新的请求到来就创建一个新的值栈,也就是请求和值栈是一一对应的,不同的请求,其值栈也不相同;而
值栈封装了一次请求所有需要操作的相关数据。
    正由于他们之间的一一对应关系,才决定了值栈能保证线程安全地为每个请求提供公共的数据存取服务。
3.值栈的分类:狭义值栈和广义值栈
  A:狭义值栈:是指实现了com.opensymphony.xwork2.util.ValueStack接口的对象,在目前的struts2的版本中也
               就只有com.opensymphony.xwork2.ognl.OgnlValueStack对象。
       它的作用主要是用来存取动态的EL运算所需要的值和结果,而OgnlValueStack则主要是用于支持OGNL运算的。
      狭义值栈中存放的供OGNL运算的数据有:
  a: Action的实例,可以通过OGNL来访问Action实例中的属性值
  b:OGNL表达式运算的值,可以设置到值栈中,可以主动访问值栈对象
  c:OGNL表达式产生的中间变量。如 使用循环标签时,所产生的循环变量就是存放在值栈中
  B:广义值栈:通常是指ActionContext。它是Action运行的上下文,他包含着Action运行需要的数据,如请求参数
    、会话等。ActionContext是线程安全的,每个线程有一个独立的ActionContext。
4.ActionContext的使用:
  A.获取:两种方式
   a:通过ActionInvocation(实现拦截器时):
      ActionContext actionContext = invocation.getInvocationContext()
   b:直接通过ActionContext的静态方法getContext()方法:
      ActionContext actionContext = ActionContext.getContext()
  B.使用:ActionContext主要是用来存放数据的,所以它有以下方法
     a.get(String key):根据key从ActionContext当前的存储空间里获取对应的值
  b.put(String key,Object value):把值存进ActionContext的存储空间里
  c.Map<String,Object> getApplication():返回ActionContext中的值
  d.Map<String,Object> getSession():返回HttpSession中存储的值
  e.Map<String,Object> getContextMap():返回当前context存储的值
  f.Map<String,Object> getParameters():返回HttpServletRequest对象里存储的值,客户端提交的参数。
  g.ValueStack getValueStack():获取OGNL的值栈
5.ValueStack的使用
   A.获取:ValueStack vs = ActionContext.getValueStack()
   B.常用方法:
       a.Object findValue(String expr):在value stack中,按默认的访问顺序获取值
    b.void setValue(String expr,Object value):按默认的访问顺序向 value stack中设置值
    c.Object peek():获取value stack中的顶层对象,不修改value stack对象
    d.Object pop():获取value stack中的顶层对象,并把这个对象从value stack中移除
    e.Object push(Object o):将对象加入到value stack对象中,并设置为顶层对象。
   

猜你喜欢

转载自blog.csdn.net/calvex880714/article/details/8915979