值栈与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张图片

OGNL表达式

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

值栈与ognl_第2张图片

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.size colors.size ()
      • 可以通过使用 isEmpty () 方法或专用关键字 isEmpty 来得知给定的 List 是不是空 . colors.isEmpty colors.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 的键值对的个数
       • 可以使用 isEmpty isEmpty () 检查某给定 Map 是不是空 .
       • 可以使用如下语法来创建一个 Map:
       #{key1:value1,key2:value2,........,keyn:valuen}



你可能感兴趣的:(值栈与ognl)