Struts 2支持以下几种表达式语言
- OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
- JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言。
- Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性
- Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
- 支持对象方法调用,如xxx.doSomeSpecial();
- 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;
- 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
- 访问OGNL上下文(OGNL context)和ActionContext;
- 操作集合对象
OGNL是通常要结合Struts 2的标志一起使用,如<s:property value=“key” />
OGNL 介绍
OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
Struts2将ActionContext作为整个Ognl的上下文对象,然后将ValueStack(值栈)作为ActionContext的根对象,用户每次访问的Action放入到ValueStack的栈顶的位置, 故而我们可以直接访问Action中的属性。
Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
OGNL中重要的3个符号:#、%、$
- #符号
- 访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute(“msg”) 。
- 用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name==‘pla1’}.{age}[0]。
- 用来构造Map,例如示例中的#{‘foo1’:‘bar1’, ‘foo2’:‘bar2’}。
- %符号
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。
3. $符号
$符号主要有两个方面的用途
- 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在 m i n 同 {min}同 min同{max}之间。
- 在Struts 2框架的配置文件中引用OGNL表达式
OGNL中#号的使用
OGNL中的#号可以取出堆栈上下文中存放的对象
名称 | 作用 | 例子 |
---|---|---|
attr | 用于按request>>session>>application顺序访问其属性 | #attr.userName相当于按顺序从三个范围读取userName属性直到找到为止 |
request | 包含当前HttpServletRequest的属性的Map | #request.userName相当于request.getAttribute(“userName”) |
session | 包含当前HttpSession的属性的Map | #session.userName相当于session.getAttribute(“userName”) |
application | 包含当前应用的ServletContext的属性的Map | #application.userName相当于application.getAttribute(“userName”) |
parameters | 包含当前HTTP请求参数的Map | #parameters.id[0]相当于request.getParameter(“id”) |
在OGNL中,可以通过关键字"@“来访问任意勒种的静态方法和静态属性,格式为”@类的完整路径名@属性名称" 和 “@类的完整路径名称@方法名称”
需要注意在struts2 中在2.3.4.1 版本以前是默认开启可以访问静态方法,之后就默认关闭了。我们在使用的时候需要注意版本问题
示例代码
JSP页面
调用静态方法:<s:property value="@com.javaee.struts2.Demo@staticMethod()" /><br/>
调用静态常亮:<s:property value="@com.javaee.struts2.Demo@USER_INFO" />=
struts.xml
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />