Struts2学习笔记__OGNL上下文和Action上下文

参考:https://blog.csdn.net/qq_35537301/article/details/82020553
参考:https://www.cnblogs.com/zhuxiang1633/p/9718446.html

OGNL上下文ContextMap

是OGNL上下文对象,contextMap是struts2封装好的一次请求可能出现的最大的数据容器。
结构:
是一个Map结构 {String:Object}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ContextMap中封装的数据

Map的key(类型是String) Map的Value (类型是Object) 说明
application Java.util.Map<String,Object> 封装的应用域中的所有数据
session Java.util.Map<String,Object> 封装的会话域中的所有数据
request Java.util.Map<String,Object> 封装的请求域中的所有数据
valueStack(特殊) com.opensymphony.xwork2.ognl.OgnlValueStack 它是List结构
parameters Java.util.Map<String,String[]> 封装的是请求参数
attr Java.util.Map<String,Object> 封装的是四大域的组合数据,从最小的域开始搜索
action com.opensymphony.xwork2.ActionSupport 当前执行的动作类对象

ActionContext(Action上下文)

ActionContext它是一个工具类,是struts2框架提供给我们的,可以让我们调用其中的方法,快速的操作ContextMap。用它操作OGNL上下文对象,比直接操作ContextMap要方便很多。

ActonContext和ContextMap的关系
ActionContext就相当于对ContextMap进行了一次再封装。

在这里插入图片描述

ActionContext什么时候创建
由于ActionContext是操作的ContextMap,而ContextMap中封了我们一次请求的所有数据,所以它的创建应该是每次请求访问Action时,即核心控制器(StrutsPrepareAndExecuteFilter)的doFilter方法执行时

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上下文的其他对象中寻找

详细了解ActionContext:

  1. struts2框架在解析OGNL表达式的时候,OGNL上下文就是ActionContext,而根对象就是Action对象!

    例如:若给出一个OGNL表达式 : “class.user…name”
    首先判断这个OGNL表达式前缀没有带#,所以这个一个根对象,struts2框架会在值栈的栈顶对象中查找 getclass()方法,得到class对象,然后通过class对象,在其中查找getUer()方法,得到user对象,然后值 user对象中查找getName())方法,得到最终的值!

  2. 对于客户端发送的每一次请求,struts2框架都会自动的创建一个ActionContext和值栈对象,请求处理完毕以后这两个对象会自动的销毁!ActionContext对象相当于一个大大的容器,里面包含了application、session、parameters、valueSatck、attr属性。(其中valueStack对象就是值栈对象)

  3. ActionContext中的application、session、parameters等对象都是非根对象,在OGNL表达式中要访问他们,需要在表达式前面加上#前缀!

    例如:
    ① #appliation.userName等于 ActionContext.getContext().getApplication().get(“userName”);
    ② #session.userName等效于ActionContext.getContext().getSession().get(“userName”);
    ③ #parameters.userName等ActionContext.getContext()…getParameters().get(“userName”);

参考:https://blog.csdn.net/super_yc/article/details/61629522

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40803626/article/details/88722973
今日推荐