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方法

        

      

        

      

        

             

          

          

      

  • 相关阅读:
    ASP.NET中JSON的序列化和反序列化
    Git 本地项目上传至托管平台(OsChina/GitHub)
    Android Gradle 完整指南(转)
    开发错误记录13:java.lang.UnsatisfiedLinkError: Couldn't load xxx.so: findLibrary returned null
    Android其它新控件 (转)
    一个Activity掌握Design新控件 (转)
    一个Activity掌握Android5.0新控件 (转)
    一个Activity掌握Android4.0新控件 (转)
    开发错误日记 12: Unsupported major.minor version 52.0
    Linux 下各个目录的作用及内容
  • 原文地址:https://www.cnblogs.com/cxyzyh2017/p/6629220.html
Copyright © 2011-2022 走看看