Struts2-OGNL与值栈
2017-09-06 21:20
302 查看
值栈
可以从值栈中获取栈对象使用${productName}获取值,实际上该属性并不在request等域对象中,而是从值栈中获取的。值栈分为两部分Map栈:实际上是OgnlContext类型,是个Map,也是对ActionContext的一个引用。里面保存着各种Map:requestMap,sessionMap,applicationMap,paramtersMap,attr;parameters: 该 Map 中包含当前请求的请求参数request: 该 Map 中包含当前 request 对象中的所有属性session: 该 Map 中包含当前 session 对象中的所有属性application:该 Map 中包含当前 application 对象中的所有属性attr: 该 Map 按如下顺序来检索某个属性: request, session, application对象栈:实际上是CompoundRoot类型,是一个使用ArrayList定义的栈。里面保存各种和当前Action实例相关的对象。是一个数据结构任意的对象。OGNL
在 JSP 页面上可以可以利用 OGNL(Object-Graph Navigation Language: 对象-图导航语言) 访问到值栈(ValueStack) 里的对象属性.若希望访问值栈中 ContextMap 中的数据, 需要给 OGNL 表达式加上一个前缀字符 #. 如果没有前缀字符#, 搜索将在 ObjectStack 里进行.
property 标签
Struts 的 property 标签用来输出值栈中的一个属性值.读取 ObjectStack 里的对象的属性
若想访问ObjectStack里的某个对象的属性. 可以使用以下几种形式之一:
object.propertyName object['propertyName'] object["propertyName"]
ObjectStack里的对象可以通过一个从零开始的下标来引用.
ObjectStack里的栈顶对象可以用
[0]来引用, 它下面的那个对象可以用
[1]引用. 若希望返回栈顶对象的
message属性值:
[0].message或
[0]["message"]或
[0]['message']若在指定的对象里没有找到指定的属性, 则到指定对象的下一个对象里继续搜索. 即 的含义是从第 n 个开始搜索, 而不是只搜索第 n 个对象若从栈顶对象开始搜索, 则可以省略下标部分
读取 Context Map 里的对象的属性
若想访问 ContextMap 里的某个对象的属性, 可以使用以下几种形式之一:#object.propertyName#object['propertyName']#object["propertyName"]示例:1. 返回
session中的
code属性:
#session.code2. 返回
request中的
customer属性的
name属性值:
#request.customer.name3. 返回域对象(按
request, session, application的顺序)的
lastAccessDate属性:
#attr.lastAccessDate
调用字段和方法
可以利用OGNL调用任何一个
Java类里的静态字段或方法.被压入到
ValueStack栈的对象上的公共字段和方法.默认情况下,
Struts2不允许调用任意
Java类静态方法, 需要重新设置
struts.ognl.allowStaticMethodAccess标记变量的值为
true.调用静态字段或方法需要使用如下所示的语法:
@fullyQualifiedClassName@fieldName:
@java.util.Calendar@DECEMBER
@fullyQualifiedClassName@methodName(argumentList):
@app4.Util@now()调用一个实例字段或方法的语法, 其中
object是
Object Stack栈里的某个对象的引用:
.object.fieldName:
[0].datePattern
.object.methodName(argumentList):
[0].repeat(3, “Hello”);
访问数组类型的属性
有些属性将返回一个对象数组而不是单个对象, 可以像读取任何其他对象属性那样读取它们. 这种数组型属性的各个元素以逗号分隔, 并且不带方括号可以使用下标访问数组中指定的元素: colors[0]可以通过调用其 length 字段查出给定数组中有多少个元素: colors.length<s:property value="#attr.names.length"/><s:property value="#attr.names[2]"/>
访问 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”}访问 Map 类型的属性
读取一个 Map 类型的属性将以如下所示的格式返回它所有的键值对:{key-1=value-1, key-2=value-2,...,key-n=value-n}若希望检索出某个 Map 的值, 需要使用如下格式:
map[key]可以使用
size或
size()得出某个给定的
Map的键值对的个数可以使用
isEmpty或
isEmpty()检查某给定
Map是不是空.可以使用如下语法来创建一个
Map:
#{key-1=value-1, key-2=value-2,...,key-n=value-n}
使用 EL 访问值栈中对象的属性
<s:property value="fieldName">也可以通过
JSP EL来达到目的:
${fieldName}原理:
Struts2<4000/code> 将包装 HttpServletRequest
对象后的 org.apache.struts2.dispatcher.StrutsRequestWrapper对象传到页面上, 而这个类重写了
getAttribute()方法.EL 能做的OGNL都能做,但是OGNL能做的,EL不一定能做。
<s:debug></s:debug><br/>利用$ { name }获取<br/>NAME:${name }<br/>DESC:${desc }<br/>PRICE:${price }<br/><br/>获取字段和方法<br/>PI:<s:property value="@java.lang.Math@PI"/><br/>COS(0):<s:property value="@java.lang.Math@cos(0)"/><br/>person.show():<s:property value="[0].show()"/><br/>读取 ValueStack 里的对象的属性<br/>DESC:<s:property value="[1].desc"/><br/><br/>读取 Context Map 里的对象的属性<br/>DESC:<s:property value="#session.person.desc"/><br/><%String[] str = {"value","stack","object"};request.setAttribute("str", str);%><br/>访问数组类型的属性<br/>LENGHT:<s:property value="#request.str.length"/><br/>OBJECT:<s:property value="#request.str[1]"/><br/><br/><br/>访问Map类型的属性<br/>LENGHT:<s:property value="#request.map.size()"/><br/>isEmpty:<s:property value="#request.map.isEmpty()"/><br/>OBJECT:<s:property value="#request.map.get('Liu')"/><br/>
相关文章推荐
- 框架 day29 Struts2-上传,下载,OGNL与Struts2的结合(值栈与ActionContext),Struts2标签,Token机制
- Struts2中OGNL、ActionContext和值栈及线程安全浅析
- Struts2使用之值栈与OGNL-使用
- Struts2的知识整理总结 (五)——值栈与OGNL表达式
- Struts2 值栈和ognl
- struts2_ognl表达式与值栈
- Struts2学习——(六)值栈与OGNL表达式[结合struts标签]
- 走进Struts2(五)— 值栈和OGNL
- S7.2_Struts2_OGNL OGNL表达式的投影和选择技术范例,OGNL表达式#和$符号的使用范例,以及值栈
- 关于Struts2中的值栈与OGNL表达式
- Struts2之 OGNL表达式和值栈
- Struts2学习记录-Value Stack(值栈)和OGNL表达式
- struts2的总体回想(ACTION、拦截器、值栈、OGNL表达式、ModelDriven方案等)
- Struts2值栈和OGNL
- struts2的整体回顾(ACTION、拦截器、值栈、OGNL表达式、ModelDriven方案等)
- [原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map
- Struts2_07_值栈与 OGNL
- Struts2 值栈和OGNL
- Struts2之OGNL表达式与值栈对象及常用标签的使用
- Struts2使用之值栈与OGNL-使用