文档章节

Struts2值栈学习

H
 Henrykin
发布于 2017/05/31 09:18
字数 1264
阅读 14
收藏 0

1:简单的说,值栈是对应每一个请求对象的轻量级的数据存储中心,在这里统一管理着数据,供Action、Result、Interceptor等Struts2的其他部分使用,这样数据被集中管理起来而不凌乱。

      简单的说,值栈能够线程安全的为每个请求提供公共的数据存取服务。

      当有请求的时候,Struts2会为每个请求创建一个新的值栈,也就是说,栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。

     正是因为值栈和请求的对应关系,因此值栈能保证线程安全的为每个请求提供公共的数据存取服务。

 

2:狭义值栈

     通常是指com.opensymphony.xwork2.util.ValueStack接口的对象,目前就是com.opensymphony.xwork2.ognl.OgnlValueStack对象。

     狭义值栈主要用来存放动态EL(表达式语言)运算需要的值和结果,当然OgnlValueStack对象主要是用来支持OGNL(对象图导航语言)运算的。

     狭义值栈中存放着一些OGNL可以访问的数据,如下:

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

        b:OGNL表达式运算的值,可以设置到值栈中,可以主动访问值栈对象,强行设置。

        c:OGNL表达式产生的中间变量,比如使用Struts2标签的时候,使用循环标签,自然会有循环的变量,这些都放在值栈中。

 

3:广义值栈

   通常是ActionContext对象,ActionContext是Action运行的上下文,每个ActionContext是一个基本的容器,包含着Aciton运行需要的数据,比如请求参数,会话等。

  ActionContext也是线程安全的,每个线程都有一个独立的ActionContext,这样就不用担心值栈中值得线程安全问题了。

  ActionContext里面存储着很多值,如下:

     a:Request的Parameters,请求中的参数,注意这里的数据是从数据对象中复制来的,因此这里的数据的变化是不会影响到请求对象里面的参数的值的。

     b:Request的Attribute,请求中的属性,这里是一个Map,存放着请求对象的属性数据,这些数据和请求对象的Attribute是联动的。

     c:Application的Attribute,应用的属性,这里是一个Map,存放着应用对象的属性数据,这些数据和应用对象的attribute是联动的。

     d:ValueStack,也就是狭义值栈,ActionContext是以value stack作为被OGNL访问的根,简单的说,OGNL在没有特别指明的情况下,访问的就是value stack的值。

     e:attr,在所有的属性范围中获取值,依次搜索page, request, session 和applicaion

 

4:ActionContext的使用

   获取,通过两种方式,第一种,使用ActionContext自身的方法来获取

     ActionContext ctx = ActionContext.getContext();

   第二种,使用ActionInvocation来获取

     ActionContext ctx = actionInvocation.getInvocationContext();

   它的典型方法如下:    

Objectget(String key):Returns a value that is stored in the current ActionContext by doing a lookup using the value's key.

  void put(String key,Object value):Stores a value in the current ActionContext.

  Map<String,Object>getApplication():  Returns a Map of the ServletContext when in a servlet environment or a generic application level Map otherwise.

                                         即返回ServletContext中返回的值

  Map<String,Object>getSession():Gets the Map of HttpSession values when in a servlet environment or a generic session map otherwise.

  Map<String,Object>getContextMap():Gets the context map.

  Map<String,Object>getParameters(): Returns a Map of the HttpServletRequest parameters when in a servlet environment or a generic Map of parameters otherwise.

  

5:ValueStack的使用

   ValueStack有一个特点,如果访问的值栈里有多个对象,且相同的属性在多个对象中同时出现,则值栈会按照从栈顶到栈底的顺序,寻找第一个匹配的对象。

   ValueStack的获取:直接由ActionContext对象的getValueStack()方法即可获得。

   使用函数: 

   ObjectfindValue(String expr): Find a value by evaluating the given expression against the stack in the default search order.

    voidsetValue(String expr,Object value):  Attempts to set a property on a bean in the stack with the given expression using the default search order.

     Object peek():Get the object on the top of the stack without changing the stack.

     Objectpop():Get the object on the top of the stack and remove it from the stack.

     voidpush(Object o):Put this object onto the top of the stack

6:例子,修改用户输入的参数信息,如下图所示,

  

      图:用户输入了aa的username

 

                   图:用户提交后发现username属性的值发生了变化

 

实现:

  首先定义一个实现PreResultListener接口的类:MyPreResultListener

 

import com.opensymphony.xwork2.ActionInvocation;  
import com.opensymphony.xwork2.interceptor.PreResultListener;  
  
public class MyPreResultListener implements PreResultListener {  
  
    @Override  
    public void beforeResult(ActionInvocation invocation, String resultCode) {  
        System.out.println("现在处理Result执行前的功能, result=" + resultCode);  
          
        //在Result处理之前修改value stack里面的username对应的值  
        invocation.getInvocationContext().getValueStack().setValue("username", "被修改了");  
  
    }  
  
}  

 

然后在相应的Action中进行注册:

  

import com.capinfotech.listener.MyPreResultListener;  
import com.opensymphony.xwork2.ActionContext;  
import com.opensymphony.xwork2.ActionSupport;  
  
public class PreResultAction extends ActionSupport {  
  
    private String username;  
    private String password;  
  
    public String getUsername() {  
        return username;  
    }  
  
    public void setUsername(String username) {  
        this.username = username;  
    }  
  
    public String getPassword() {  
        return password;  
    }  
  
    public void setPassword(String password) {  
        this.password = password;  
    }  
      
    public String execute() {  
        System.out.println("用户输入的参数为,username:" + username + ", password:" + password);  
          
        ActionContext context = ActionContext.getContext();  
        MyPreResultListener preListener = new MyPreResultListener();  
        context.getActionInvocation().addPreResultListener(preListener);  
          
        return "success";  
          
    }  
  
}  

 

本文转载自:http://blog.csdn.net/woshisap/article/details/7272062

共有 人打赏支持
H
粉丝 4
博文 95
码字总数 12737
作品 0
广州
私信 提问
ognl-值栈基本操作

一 OGNL概述 1 之前web阶段,学习过EL表达式,EL表达式在jsp中获取对象里面的值 2 OGNL是一种表达式,这个表达式功能更加强大 (1)在Struts2里面操作值栈数据 (2)一般在Struts2里操作ogn...

Bbigbug
2017/10/16
0
0
SSH框架之struts2专题3:Struts2核心之获取Servlet API、OGNL和值栈

1 在Action中获取Servlet API 为了避免与Servlet API耦合,Struts2对HttpServletRequest、HttpSession、ServletContext进行了封装,构造了三个Map对象来代替这三种对象。当然,也可以获取到真...

极客微信条
01/08
0
0
Struts2中OGNL,valueStack,stackContext的学习

[/color]学习Struts2,一直不明白表单中的值是怎么传给Action的,上网查了些资料,基本了解了!下面基本是从几个人的BOLG转载过来,以后记不清了再来看~ [color=red]先看看我做的实验jsp页面...

杨松坤
2012/07/19
0
0
struts2之OGNL和struts2标签库和ValueStack对象

OGNL简介:    (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。      struts2框架默认就支持Ognl表达式语言(所以struts必须引用的包:...

别叫小伙
2017/03/07
0
0
Struts2学习整理

Struts2的相关配置文件 default.properties -- 在org/apache/struts2/目录下,代表的是配置的是Struts2的常量的值 struts-default.xml -- 在Struts2的核心包下,代表的是Struts2核心功能的配...

Lunqi
2015/09/10
6.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Eureka Server启用 https服务指北

文章共 591字,阅读大约需要 2分钟 ! 概 述 在我的前文《Eureka Server 开启Spring Security Basic认证》中已经给 Eureka Server 开启了最基本的鉴权措施,本文则让 HTTPS加持于 Eureka Ser...

CodeSheep
33分钟前
6
0
OSChina 周二乱弹 —— 其实我在地板也睡不着

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @witt-z :分享歌词: 阴天 在不开灯的房间,当所有思绪都一点一点沉淀。 分享莫文蔚的单曲《阴天》: 《阴天》- 莫文蔚 手机党少年们想听歌,...

小小编辑
55分钟前
204
6
微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
3
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部