Struts2(五)之OGNL、contextMap

1、OGNL

  1.一、定义

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

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

  1.二、OGNL的功能

    1.2.一、支持普通方法的调用

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

      value的属性值就是OGNL的表达式,注意它不是一个字符串。若是想把value中的值看成普通的字符串,请加引号。安全

      

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

    1.2.二、访问静态成员(静态属性、静态方法)

        1.OGNL访问静态属性jsp

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

          

              

        2.OGNL访问静态方法spa

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

          

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

            因此咱们要在struts.xml中配置

          

          

     1.2.三、OGNL操做map和list集合

        

 

          

     1.三、OGNL的功能实现   

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

      二、调用对象方法。

      三、调用类的静态方法

      四、索引数组元素

      五、操做集合(重 要)

    

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

         Ognl.getValue(expression,context,root);

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

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

         //root:ognl的根,能够为javabean、list、map、.... 等等不少值

    

    一、对javabean进行操做

        User.java

            

        Address.java

            

 

        获取javabean中的属性值

            

        获取javabean中的对象的属性值

                

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

            

         

 

        二、调用对象方法

             

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

            

        

         四、索引数组元素

            

         五、操做集合

            操做list集合,list结合本质就是一个数组,因此从list中读取数据跟对数组的操做是同样的。

                  

            操做map集合

                  

            建立list集合

                  

            建立map集合

                  

2、ccontextMap(重点)

  2.一、动做类的生命周期

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

  2.二、请求动做的数据存放    

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

  

 

 

  2.三、contextMap存储数据

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

    

  

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

  

  2.四、查看contextMap中的数据

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

   

  

    测试存入数据

    

 

    

3、contextMap中的数据操做

    

 

  3.一、存数据

    须要熟悉ActionContext和valueStackAPI.框架会为咱们存数据

    3.1.一、使用ActionContext存数据

    

    在demo1.jsp点击dubug时

    

 

    3.1.二、使用ValueStack存数据

      

      结果:

        

    ValueStacj中的getRoot()方法

    

    CompoundRoot类是什么:

      

  在动做类中写一个栈操做

    

 

 

 

 

  3.二、取数据

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

    3.2.一、取得contextMap中的数据,须要是要#

    使用s:property取数据

    

    在demo1.jsp中

    

 问了一下同窗,原来是本身的结果视图中,把type类型设置成了redirect,致使数据丢失了。下次必定要注意。

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

    

    结果:

    

    若是遇有对象属性重名,能够经过OGNL表达式,选择查找的起始位置

  

  

 

   

  3.三、OGNL的使用总结

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

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

  3.四、ValueStack的其余方法

    1.setValue()方法

  

  jsp中

     结果:

  在debug中

 

                    

Stack Context

  2.set方法

    

 

 

  

 

    

  

 

 

    

         

      

 

      

  

相关文章
相关标签/搜索