首页 > 技术文章 > Struts2:笔记3

daoxiaobai 2017-03-17 16:28 原文

值栈:(ValueStack)

1)、helloWorld 时,${productName} 读取 productName 值,实际上该属性并不在 request 等域对象中,而是从值栈中获取的。

2)、可以从 ActionContext 中获取值栈对象

3)、值栈分为两个逻辑部分:

  > Map 栈:实际上是 OgnlContext 类型,是个Map,也是对 ActionContext 的一个引用,里边保存着各种 Map:requestMap、sessionMap、applicationMap、parametersMap、attr

  > 对象栈:实际上是 CompoundRoot 类型,是一个使用 ArrayList 定义的栈。里边保存各种和当前 Action 实例相关的对象。是一个数据结构意义的栈。

 

在Jsp 页面上可以利用 OGNL 访问到值栈里的对象属性。

若希望访问值栈中 ContextMap 中的数据,需要给 OGNL 表达式加上一个前缀字符 #。如果没有前缀字符 # ,搜索将在 ObjectStack 里进行。

Struts 的 property 标签用来输出值栈中的一个属性值。

读取 ObjectStack 里的对象的属性:

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

  object.propertyName、object['propertyName']、object["propertyName"]

--ObjectStack 里的对象可以通过一个从零开始的下标来引用。栈顶对象用[0]来引用,它下面那个对象可以用[1]来引用。[0].message

--[n] 的含义是从第 n 个开始搜索,而不是只搜索第 n 个对象。

--若从栈顶对象开始搜索,则可以省略下标部分。 message

--结合 s:property 标签:<s:property value="[0].message"/>  <s:property value="message"/>

默认情况下,Action 对象会被 Struts2 自动的放到值栈的栈顶。

 

读取 ContextMap 里的对象的属性:

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

#object.propertyName、#object['propertyName']、#object["propertyName"]

--示例:

  返回 session 中的 code 属性:#session.code

  返回 request 中的 customer 属性的 name 属性值:#request.customer.name

  返回域对象(按 request、session、application的顺序)的 lastAccessDate 属性:#attr.lastAccessDate

 

可以利用 OGNL 调用:任何一个 Java 类里的静态字段或方法。被压入到 ValueStack 的对象上的公共字段和方法。

--调用静态字段或方法的语法:

  @fullyQualifiedClassName@fieldName

  @fullyQualifiedClassName@methodName(argumentList)

--调用一个实例字段或方法的语法,其中 object 是 ObjectStack 栈里的某个对象的引用

  @.object.fieldName: [0]date

  @.object.methodName(argumentList):[0].repeat(3, "hello");

 

 

访问数组类型的属性:

  可以使用下标访问数组中指定的元素:colors[0]。

  可以通过调用其 length 字段查出给定数组中有多少个元素:colors.length

 

访问 List 类型的属性:

  可以使用下标访问 List 中指定的元素:colors[0]

  可以通过调用其 size 方法或专用关键字 size 的方法查出给定的 List 的长度:colors.size 或 colors.size()

  可以通过使用 isEmpty() 方法或专用关键字 isEmpty 来得知给定的 List 是不是空。colors.isEmpty 或 colors.isEmpty()

  还可以使用 OGNL 表达式来创建 List,创建一个 List 与声明一个 Java 数组是相同的。

 

访问 Map 类型的属性:

  检索某个 Map 的值:map[key]

  得出某个 Map 的键值对的个数:使用 size 或 size()

  检查 Map 是否为空:使用 isEmpty 或 isEmpty()

   

异常处理:

exception-mapping 元素:配置当前 action 的声明式异常处理。

它有两个属性:exception:指定需要补货的异常类型。异常的全类名。

       result:指定一个响应结果,该结果将在补货到指定异常时被执行。

可以通过 global-exception-mapptings 元素为应用程序提供一个全局性的异常捕获映射。但在其元素下 声明的任何 exception-mapping 元素只能引用在 global-results 元素下声明的某个  result 元素。

声明式异常处理机制由 ExceptionMappingInterceptor 拦截器负责处理,该拦截器会向 ValueStack 中天剑两个对象:exception、excepionStack

可以在视图上通过 <s:property> 标签显示异常消息。

 

推荐阅读