OGNL
首先了解下OGNL的概念:OGNL是Object-Graph NavigationLanguage的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
OGNL中重要的3个符号:#、%、$:
#:
- 用来访问值栈中的Context区域.
- 用来构造Map(在struts的标签库使用,如:checkbox,radio,select标签),eg:
#{‘key1’:‘value1’, ‘key2’:‘value2’}。
%:
- 用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。
$:
- 在xml文件中获取Action类中字段的值(提供getter方法)
ValueStack
值栈是对应每一个请求对象的轻量级的内存数据中心。
每一次请求的时候,都会创建一个新的ValueStack对象(Action也是新的),该ValueStack对象封装了这一次请求相关的数据信息.
1).ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础。
2).ValueStack贯穿整个Action的生命周期(一次请求):每个Action类的实例都拥有一个ValueStack对象。
ValueStack相当于数据的中转站,在其中保存该次请求和当前Action对象和其他相关对象信息。
3).Struts2框架把ValueStack对象保存在名为“struts.valueStack”的request属性中(意味着可用ActionContext对象去获取)。
- ValueStack内部结构(可通过标签<s:debug/>在网页中查看):
root: 类型: CompoundRoot extends ArrayList : 表示栈的数据结构(后进先出)
context: 类型: Map: : 上下文
如图:
- 获取ValueStack对象的三种方式:
- 在root区域存放数据:
在jsp取数据:
若:放入root中的数据,没有属性名:<s:property value="[0].top"/>
若:放入root中的数据有属性名: <s:property value="属性名"/>
如:
<!-- 方式一,二: -->
<s:property value="[0].top"/>
<!-- 方式三,四: -->
<s:property value="[hello1"/>
<s:property value="hello2"/>
注意:key同名会覆盖value,建议使用方式3和4时,不要使用方式1和2因为不能保证数据在栈顶.!!!同时也推荐使用方式3和4比较方便
- 在Context区域存放数据:
- 在jsp取数据:
<%@ taglib uri="/struts-tags" prefix="s"%>
<s:property value="#hello1"/><br/>
<s:property value="#hello2"/><br/>
<s:property value="#session.USER_IN_SESSION"/>
<s:property value="#application.username"/>
<hr/>
<!--EL可以访问ValueStack中的数据,但不推荐-->
${requestScope.hello1}<br/>
${hello2}<br/>
${sessionScope.USER_IN_SESSION}
${applicationScope.username}
Struts2的标签库:
标签库详细演示可参考此博客:https://blog.youkuaiyun.com/yaerfeng/article/details/51279409
(或在struts2的官方文档中查看)
- 通用标签
- 表单标签