zoukankan      html  css  js  c++  java
  • 值栈与ognl

    ValueStack (值栈):

    1、贯穿整个Action的生命周期(每个Action类的对象实例都拥有一个ValueStack对象).相当于一个数据的中转站.在其中保存当前Action对象和其他相关对象.
    2、Struts2框架把ValueStack对象保存在名为“struts.valueStack的请求属性中
    3、ValueStack对象的内部有两个逻辑部分:

           –ObjectStack: Struts Action 相关对象压入 ObjectStack

           –ContextMap: Struts把各种各样的映射关系(一些Map 类型的对象)压入 ContextMap实际上就是对ActionContext的一个引用

    4、Struts2会把下面这些映射加入到ContextMap

          –parameters:Map 中包含当前请求的请求参数

          –request: Map 中包含当前 request对象中的所有属性

          –session: Map 中包含当前 session对象中的所有属性

         –application:Map 中包含当前 application  对象中的所有属性

         –attr: Map 按如下顺序来检索某个属性: request, session, application

    OGNL表达式

    1、JSP 页面上可以可以利用OGNL(Object-Graph NavigationLanguage: 对象-图导航语言)访问到值栈(ValueStack)里的对象属性
    2、若希望访问值栈中
    ContextMap中的数据,需要给OGNL表达式加上一个前缀字符#.如果没有前缀字符#,搜索将在 ObjectStack里进行.
    3、property标签Struts2property 标签用来输出值栈中的一个属性值.


    4、使用ognl读取ObjectStack里的对象的属性

          a、若想访问 Object Stack里的某个对象的属性. 可以使用以下几种形式之一

                object.propertyName

                object[ 'prpertyName' ]

                object[ " prpertyName " ]

          b、ObjectStack里的对象可以通过一个从零开始的下标来引用.

                ObjectStack里的栈顶对象可以用[0] 来引用,它下面的那个对象可以用 [1]引用. 若希望返回栈顶对象的message 属性值[0].message[0][ “message” ][0][‘ message’ ]

          c、若在指定的对象里没有找到指定的属性,则到指定对象的下一个对象里继续搜索.[n]的含义是从第 n 个开始搜索,而不是只搜索第n 个对象

          d、若从栈顶对象开始搜索,则可以省略下标部分,即 直接写为 : message

          e、结合property标签,可以写为 <s:property value=" [0].message ">  或 <s:property value=" message ">

    5、使用ognl读取ContextMap里的对象的属性

          a、若想访问ContextMap里的某个对象的属性,可以使用以下几种形式之一

                # object.propertyName

                #object[ 'prpertyName' ]

                #object[ " prpertyName " ]

          b、示例:

                –返回session中的code 属性: #session.code
                –返回request中的customer 属性的 name 属性值: #request.customer.name
                –返回域对象(request, session, application 的顺序)lastAccessDate属性: #attr.lastAccessDate
    6.  调用字段和方法

         a、可以利用 OGNL 调用
                  –任何一个 Java类里的静态字段或方法.
                  –被压入到 ValueStack栈的对象上的公共字段和方法.
         b、默认情况下, Struts2 不允许调用任意 Java 类静态方法需要重新设置struts.ognl.allowStaticMethodAccess标记变量的值为true,即
     <!-- 打开静态方法的OGNL调用 -->
       <constant name="struts.ognl.allowStaticMethodAccess " value="true"/>
         c、调用静态字段或方法需要使用如下所示的语法:
                  –@fullyQualifiedClassName@fieldName:   @java.util.Calendar@DECEMBER
                  –@fullyQualifiedClassName@methodName(argumentList)@app4.Util@now()
         d、调用一个实例字段或方法的语法,其中 object Object Stack 栈里的某个对象的引用:        
                  –.object.fieldName: [0].datePattern
                  –.object.methodName(argumentList): [0].repeat(3, “Hello”);
    7、访问数组类型的属性     
            有些属性将返回一个对象数组而不是单个对象,可以像读取任何其他对象属性那样读取它们.这种数组型属性的各个元素以逗号分隔,并且不带方括号
            可以使用下标访问数组中指定的元素: colors[0]
            可以通过调用其length字段查出给定数组中有多少个元素:colors.length
    <!-- 访问数组对象的属性 --> 
       <%
          String[] names=new String[]{"aa","bb","cc","dd"};
          request.setAttribute("names", names);
       %>
       
       length:<s:property value="#attr.names.length"/>
       names[2]: <s:property value="#attr.names[2]"/>
    8、访问List类型的属性

          •有些属性将返回的类型是java.util.List,可以像读取任何其他属性那样读取它们.这种 List 的各个元素是字符串, 以逗号分隔,并且带方括号
          •可以使用下标访问List中指定的元素: colors[0]
          •可以通过调用其size方法或专用关键字 size 的方法查出给定List 的长度:colors.sizecolors.size()
          •可以通过使用isEmpty()方法或专用关键字 isEmpty来得知给定的List 是不是空.colors.isEmptycolors.isEmpty()
           •还可以使用OGNL表达式来创建List,创建一个 List 与声明一个 Java 数组是相同的:{“Red”,“Black”, “Green”}
    9、访问Map 类型的属性
           •读取一个Map 类型的属性将以如下所示的格式返回它所有的键值对:
            {key1=value1,key2=value2,key3=value3,........,keyn=valuen}
           •若希望检索出某个Map的值, 需要使用如下格式:map[key]
           •可以使用size size() 得出某个给定的Map 的键值对的个数
           •可以使用isEmptyisEmpty() 检查某给定 Map 是不是空.
           •可以使用如下语法来创建一个Map:
           #{key1:value1,key2:value2,........,keyn:valuen}



  • 相关阅读:
    oracle 例外
    Help with Intervals(集合的交并补,线段树)
    Mex(线段树的巧妙应用)
    hdu4578Transformation(线段树多个lz标记)
    Coder(线段树)
    Ice-cream Tycoon9(线段树)
    Partition(线段树的离线处理)
    ACM学习大纲(转)
    Codeforces Round #250 (Div. 1)
    记次浙大月赛 134
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293743.html
Copyright © 2011-2022 走看看