zoukankan      html  css  js  c++  java
  • Struts2(五)之OGNL、contextMap

    一、OGNL

      1.1、定义

        OGNL是Object-Graph Navigation Language的缩写,它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。它是一种功能强大的表达式语言,

        通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

      1.2、OGNL的功能

        1.2.1、支持普通方法的调用

          基础:<s:property value="">类似于jsp中的表达式(jsp表达式是<%= %>,el中的表达式是${}),把value的值直接输出到页面上

          value的属性值就是OGNL的表达式,注意它不是一个字符串。如果想把value中的值当作普通的字符串,请加引号。

          

          注意:el表达式只能调用静态的方法,而ognl可以访问普通方法就像上面的length方法

        1.2.2、访问静态成员(静态属性、静态方法)

            1.OGNL访问静态属性

              方式:@全类名@静态属性名称

              

                  

            2.OGNL访问静态方法

              方式:@全类名@静态方法名

              

              注意:在struts2中,OGNL默认禁用静态方法,在default.properties中struts.ognl.allowStaticMethodAccess=false之控制,

                所以我们要在struts.xml中配置

              

              

         1.2.3、OGNL操作map和list集合

            

              

         1.3、OGNL的功能实现   

          1、存取对象的任意属性,简单说就是对javabean进行操作(重要)

          2、调用对象方法。

          3、调用类的静态方法

          4、索引数组元素

          5、操作集合(重 要)

        

        操作之前必须知道如何使用OGNL表达式,并且了解OGNL表达式的取值范围只能在其context和root中,格式为

             Ognl.getValue(expression,context,root);

             //expression:为我们编写的ognl表达式,从后两个参数中获取值,获取规则会从下面的例子中详细讲解

             //context:ognl的上下文,类型为map,

             //root:ognl的根,可以为javabean、list、map、.... 等等很多值

        

        1、对javabean进行操作

            User.java

                

            Address.java

                

            获取javabean中的属性值

                

            获取javabean中的对象的属性值

                    

            对javabean中的属性进行赋值操作

                

             

            2、调用对象方法

                 

            3、调用类的静态方法或属性

                

            

             4、索引数组元素

                

             5、操作集合

                操作list集合,list结合本质就是一个数组,所以从list中读取数据跟对数组的操作是一样的。

                      

                操作map集合

                      

                创建list集合

                      

                创建map集合

                      

    二、ccontextMap(重点)

      2.1、动作类的生命周期

        明确:动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。与Struts1的区别是,struts1的动作类是单例的。

      2.2、请求动作的数据存放    

      每次请求时,都会产生一些请求数据,这些数据存放到哪里去了?
      明确:
      在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
      这两个对象存储了整个动作访问期间用到的数据。并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。

      

      2.3、contextMap存储数据

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

        

      

      注意:除了value stack之外,全是map,而contextMap也是一个map。其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)

      

      2.4、查看contextMap中的数据

      在jsp中引入struts2的核心标签库,然后使用<S:debug />    

       

      

        测试存入数据

        

        

    三、contextMap中的数据操作

        

      3.1、存数据

        需要熟悉ActionContext和valueStackAPI.框架会为我们存数据

        3.1.1、使用ActionContext存数据

        

        在demo1.jsp点击dubug时

        

        3.1.2、使用ValueStack存数据

          

          结果:

            

        ValueStacj中的getRoot()方法

        

        CompoundRoot类是什么:

          

      在动作类中写一个栈操作

        

      3.2、取数据

        用Struts2的标签(OGNL表达式)在JSP上(用的最多)
        使用OGNL表达式来去,struts2的OGNL表达式必须写在struts2标签中。

        3.2.1、取得contextMap中的数据,需要是要#

        使用s:property取数据

        

        在demo1.jsp中

        

     问了一下同学,原来是自己的结果视图中,把type类型设置成了redirect,导致数据丢失了。下次一定要注意。

      3.2.2、取ContextMap里面ValueStack中对象的属性:直接写属性名

        

        结果:

        

        如果遇有对象属性重名,可以通过OGNL表达式,选择查找的起始位置

      

      

       

      3.3、OGNL的使用总结

      取根中的对象属性不使用#

      取contextMap中的key的值,要使用#

      3.4、ValueStack的其他方法

        1.setValue()方法

      

      jsp中

         结果:

      在debug中

                        

    Stack Context

      2.set方法

        

      

        

      

        

             

          

          

      

  • 相关阅读:
    团队项目-第一阶段冲刺7
    团队项目-第一阶段冲刺6
    Spring Boot 揭秘与实战(七) 实用技术篇
    Spring Boot 揭秘与实战(七) 实用技术篇
    Spring Boot 揭秘与实战(六) 消息队列篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(四) 配置文件篇
  • 原文地址:https://www.cnblogs.com/cxyzyh2017/p/6629220.html
Copyright © 2011-2022 走看看