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}