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标签:
Struts2的property
标签用来输出值栈中的一个属性值.
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}