什么是OGNL
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
- OGNL:对象导航语言,比EL强大很多倍的语言。
- EL:从域对象中获取数据,从EL的11个对象中获取。{pageContext.request.contextPath}。
- OGNL:调用对象的方法,获取Struts2的值栈中获取数据。OGNL是第三方表达式语言。
为什么学习OGNL
-
支持运算符(如±*/),比普通的标志具有更高的自由度和更强的功能;
-
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
-
支持对象方法调用,如xxx.doSomeSpecial();
-
支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;
-
支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(price*discount),这个表达式会返回80;
-
访问OGNL上下文(OGNL context)和ActionContext;
操作集合对象。 -
可以直接new一个对象
使用OGNL的要素
- 表达式
- 根对象
- context对象
1、OGNL的Struts2环境入门
标签库的引入
<%@ taglib uri="/struts-tags" prefix="s" %>
1.1访问对象的方法
<h3>调用对象的方法</h3>
<!-- value中写OGNL表达式 -->
<s:property value="'struts'.length()"/>
1.2访问对象的静态方法
<h3>调用对象静态的方法</h3>
<!--struts2中默认把访问静态方法关闭-->
<!--
开启
<constant name="struts.ognl.allowStaticMethodAccess" value="true">
-->
<s:property value="@java.Lang.Math@random()"/>
2、 OGNL中的特殊字符
2.1 #号
- 获取context的数据
<% reuqest.setAttribute("name","a") %> <s:property value="#request.name"/>
- 构建Map集合
<s:iterator value="list"> <s:property value=""/> </s:iterator> <s:iterator var="i" value="{'a','b','c'}"> <s:property value="i"/> -- <s:property value="#i"><br/> </s:iterator> <s:iterator var="i" value="#{'a':'1','b':'2','c':'3'}"> <s:property value="key"/> -- <s:property value="value"><br/> </s:iterator>
2.2 %号
-
强制解析OGNL
<% reuqest.setAttribute("name","a") %> <!--强制识别{#request.name}为OGNL表达式--> <s:textfield name="name" value="%{#request.name}"/>
-
强制不解析OGNL
2.3 $号
- 在配置文件中使用OGNL
- 属性文件(国际化中)
- XML
- 文件下载
- 配置:
<action name="download" class="xxx.downloadAction"> <result type="stream"> <param name="Content-Type"/></param> <param name="Content-Disposition"/></param> </result> </action>
- 配置:
- 文件下载