值栈与ognl
ValueStack (值栈):
–ObjectStack: Struts 把Action 和相关对象压入 ObjectStack中
–ContextMap: Struts把各种各样的映射关系(一些Map 类型的对象)压入 ContextMap中. 实际上就是对ActionContext的一个引用
–parameters:该Map 中包含当前请求的请求参数
–request:该 Map 中包含当前 request对象中的所有属性
–session:该 Map 中包含当前 session对象中的所有属性
–application:该Map 中包含当前 application 对象中的所有属性
–attr: 该 Map 按如下顺序来检索某个属性: request, session, application
OGNL表达式
2、若希望访问值栈中 ContextMap中的数据,需要给OGNL表达式加上一个前缀字符#.如果没有前缀字符#,搜索将在 ObjectStack里进行.
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、示例:
b、默认情况下, Struts2 不允许调用任意 Java 类静态方法, 需要重新设置struts.ognl.allowStaticMethodAccess标记变量的值为true,即
<!-- 打开静态方法的OGNL调用 --> <constant name="struts.ognl.allowStaticMethodAccess " value="true"/>
<!-- 访问数组对象的属性 --> <% 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类型的属性
#{key1:value1,key2:value2,........,keyn:valuen}