Struts2扩展自WebWork,为简化界面编程Struts2沿用WebWork标签的风格,以OGNL为标签属性值进行动态存取,大大增强Struts2标签的功能及易用性。
那OGNL到底为何物件呢?
1.OGNL(Object Graph Navigation Language)即对象图形导航语言。该语言并非计算机编程语言,只是对对象
的值进行运算的(或对对象变量进行进行赋值运算的)表达式中的一种。是对λ(Lampda)表达式语言的扩展。功
效与原sun公司的JSTL的EL表达式一样,但更强大。
2.OGNL的语法特点:
1)、OGNL操作的都是对象,是为对象赋值的一种表达式。
2)、OGNL的作用域离不开Struts2的Stack Context,Stack Context又分为:Value Stack、Application、
Request、Session、Parameters、Atrr子域,其中OGNL都是以Value Stack域的对象为表达式操作的根对
象,且OGNL对自己的根对象的访问直接访问就行,对其它作用域对象的访问都必须使用"英镑"符号作为对
象引用的前缀,如:obj(表示Value Stack域的对象obj),#application.obj(表示Application域的对象
obj),#request.obj,#session.obj,#request.parameter.obj(HttpReqest.getParameter("obj")),而
#attr.obj是依次从page>request>session>application遍历寻找obj对象,找不到返回null。OGNL以Map
的格式来存储操作结果,其中对象的变量名映射Map的"key",对象的变量值映射Map的"value",由出可以
推断出在每个子域中OGNL对对象的操作可以是多个而不仅仅是单个。
3)、OGNL的运算符
"#":非根对象引用的前缀。
".":对象引用链式指针。
"[]":属性索引标识符。
"^":查询以某标识符开头的对象。
"$":查询以某标识符结尾的对象。
"?":匹配某个标识符的一个或多个对象。
"%":扩展自WebWork的表达式标识符,多与一对"{"、"}"一起使用,"{"、"}"中可以有0个或多个对象,
没内容表示""字符串,一个表示单个对象,多个以","分隔,表示List、Set或String[]数组。而"%#
{'':'','':''}"是Map的表现形式。"%{abc}"表示abc对象的引用,"%{'abc'}"表明abc是字符
串"abc"本身。
3.OGNL的使用示例
如何分辨栈顶、非栈顶元素
1)、Struts2应用程序中凡ActionContext.getContext().put("obj",obj);的操作,obj都是栈顶元素。其它操
作obj都是非栈顶元素。
2)、JSP页面中,当前PC计数器指针指向的执行单元都是栈顶的执行元素。
<body>
<s:bean name="cn.yogreen.action.Name"var="nameBean"><!--对应应用程序的JavaBean-->
<s:paramname="firstName" value="'LEE'"/>
<s:param name="lastName">Yogreen</s:param>
<!--访问同个执行单元的属性元素-->
<s:property value="lastName">
</s:bean>
<s:bean name="cn.yogreen.action.EntityAction" var="entityBean">"<!--对应应用程序的JavaBean-->
<!--当前执行单元引用到非当前执行单元的对象nameBean-->
<s:param name="name" value="#nameBean"/>
<s:param name="age" value="25"/>
</s:bean>
<!--"%"使用示例"-->
<s:property value="%{#entityBean.name.firstName}"/><br/>
<!--不使用"%"示例"-->
<s:property value="#entityBean.name.lastName"/><br/>
<s:property value="#entityBean.age"/><br />
<!--当前执行单元引用到非当前执行单元的对象nameBean的属性-->
<s:property value="#nameBean.firstName"/><br />
<s:property value="#nameBean.lastName"/><br />
</body>
依照注解细细品味OGNL的这一特性
3)、所有Struts2标签属性值都是用OGNL表达式来表示的。