值栈与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}



原文地址:https://www.cnblogs.com/elgin-seth/p/5293743.html