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}



  • 相关阅读:
    JavaScript中的闭包
    SQL 备忘
    SqlServer 2005 升级至SP2过程中出现"身份验证"无法通过的问题
    unable to start debugging on the web server iis does not list an application that matches the launched url
    Freebsd 编译内核
    Freebsd 6.2中关于无线网络的设定
    【Oracle】ORA01219
    【Linux】Windows到Linux的文件复制
    【Web】jar命令行生成jar包
    【Linux】CIFS挂载Windows共享
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293743.html
Copyright © 2011-2022 走看看