爱尚实训哈尔滨校区,Java培训,大数据培训,Python培训,人工智能培训,计算机培训,IT培训,软件培训

在线咨询

当前位置: 首页> 学习园地

学习资料

    爱尚实训-ContextMap和OGNL表达式(一)-ContextMap介绍-哈尔滨Java培训

    2018-05-10更新

     

    一、 ContextMap介绍

    ContextMap是一种数据结构,包含ActionContext和ValueStack两种结构

     

    1.1 Struts2的数据存储

    1.问题的产生:每次请求时,产生的数据存储到了何处?

    2.需要明确的2个问题:

    (1)在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContextValueStack对象。且每次动作访问都会创建。

    (2)这两个对象存储了整个动作访问期间用到的数据。并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。StrutsPrepareAndExecuteFilter源码:

     

    (3) ContextMap结构

    Struts2的官方文档对contextMap的说明:

     

    contextMap中存放的主要内容

    Key

    Value

    说明

    value stack (root)

    java.util.List

    没有root这个key。它是一个list。

    application

    java.util.Map<String,Object>

    ServletContext中的所有属性。

    session

    java.util.Map<String,Object>

    HttpSession中的所有属性。

    request

    java.util.Map<String,Object>

    ServletRequest中的所有属性。

    parameters

    java.util.Map

    参数

    attr

    java.util.Map

    把页面、请求、会话、应用范围内的所有属性放到一起。

    说明:

      除了value stack之外,全是map,而ActionContext也是一个map。其实就是Map中又封装的Map。contextMap = ActionContext(本身是一个Map结构,Map里面又套小Map)+ ValueStack(List结构)

     

    查看contextMap中的数据:在页面上使用<s:debug/>

     

    测试存入数据:

     

    root根:List  ValueStack

    元素1

    元素2

    元素3

    元素4

    元素5

     

    ActionContext:Map

    key

    value

    application

    Map

    key

    value

    name

    test

     

    session

    Map

    key

    value

    sessionMap1

    王五

    sessionMap

    李四

     

    request

    Map

    attr

    Map

     

    1.2 ActionContext结构

    ActionContext是一个大Map,里面的request、session、application又套了一个小Map

    1.2.1 获取外层的大Map

     

    1.2.2 获取大Map中request、session、application对应的小Map

    有两种方式:两种方式的操作最终结果都是一样的

    1. 通过ActionContext的API获取Map

     

     

     

     

    2.通过ServletAPI获取域对象

     

    1.2.3 jsp测试页面

    <s:properties />标签说明

     

    1.3 ValueStack结构

    ValueStack是一个List的集合 

     

    1.3.1 代码获取ValueStack的三种方式

    1.通过ServletAPI从request域对象中获取

     

    2. 通过ActionContext从名叫struts.valueStack的小Map中取

     

    3. 调用ActionContext的getValueStack的API (常用)

     

    1.3.2 ValueStack的操作

     

     

     

     

    1. 动作类中本身就有一个属性

     

    2. 压栈操作

     

    3. setValue()方法

     

    4. set()方法

     

    1.3.3 实践以上的方法,用OGNL获取

    <body>

        <%--使用s:property标签,获取ValueStack中的元素。

         value属性的取值是一个OGNL表达式。它只能获取元素中的属性(不能取元素,只能取元素的属性,这些元素是对象)。

         注意:

         取ValueStack中的对象(元素)属性时,不使用"#"。

         它是从栈顶逐个对象(元素)查找指定的属性名称。只要找到了,就不再继续查找。

        --%>

      <s:property value="name"/><br/>

      <%-- 获取ValueStack中指定位置的属性

                     使用:[索引].属性名称

       --%>

      <s:property value="[0].name"/><br/> <!-- 这里面下标是从ValueStack的第几个元素开始找 -->

      <s:property value="[1].name"/><br/> <!-- 从栈顶开始前切掉1个元素,开始查name属性的值-->

      <s:property value="[2].name"/><br/> <!-- 从栈顶开始前切掉2个元素,开始查name属性的值-->

      <s:property value="[3].name"/><br/> <!-- 从栈顶开始前切掉3个元素,开始查name属性的值-->

      <s:property value="[4].name"/><br/> <!-- 从栈顶开始前切掉4个元素,开始查name属性的值-->

       <%--取栈顶map中的元素 --%>

        <s:property value="s1.name" /><br/>

        <%--当s:property什么都不写:

         默认取栈顶元素

         --%>

       <s:property/>

       <br/>

       <% //模拟原理其实实在模拟ValueStack的findValue和findString方法

          ValueStack vs = ActionContext.getContext().getValueStack();

          Object value = vs.findValue("name");

          Object value1 = vs.findValue("[1].name");

          out.print(value);

          out.print(value1);

       %>

      <s:debug/>

    </body>