struts2值栈与action上下文

1、值栈的简单定义:

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

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

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

     (4)就是ROOT根对象,ognl访问值栈不用加任何的访问前缀,只需action中声明相应的属性,并且生成属性对应的set和get方法,页面中通过struts2标签就可以存放/取出值栈中的值,EL表达式${username}如果没有加访问范围,访问的也是值栈,这只是最简单的值栈应用

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

 2、actionContext(action上下文)的简单定义:

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

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

      (3)获得ActionContext对象的方式:

                第一种,使用ActionContext自身的方法来获取: ActionContext ctx =ActionContext.getContext();

                第二种,使用ActionInvocation来获取:ActionContext ctx =actionInvocation.getInvocationContext();

     (4)ActionContext里面存储着很多值:

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

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

                c:Session的Attribute,会话中的助兴,这里是一个Map,存放着会话对象的属性数据,这些数据和会话对象的attribute是联动的。            

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

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

     (5)ongl表达式取出action上下文中的值:

                 由于Struts2框架把OGNLContext设置为ActionContext,还把代表application、session、request这些对象的Map对象也放到ActionContext中去。

                 又因为ActionContext为非根对象,所以OGNL表达式访问ActionContext(action上下文)里面的application、session、request、attr对象中的值时,

                 需要加访问前缀#,以便告诉OGNL,寻值不是从根对象中,而是从action上下文的其他对象中寻找

3、再补充一下EL表达式与ognl表达式从值栈与actionContext中取值的方式对比

Action里面定义了一个user属性,定义了一个session作用域的hello
(1)EL表达式:
        取值栈:${user.username}
        取actionContext:${sessionScope.hello}
(2)ognl表达式:
 取值栈:<s:property value="user.username" />
 取actionContext:<s:property value="#session.hello" />
                       或<s:property value="#session['hello']" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值