10 OGNL 表达式

Struts 2支持以下几种表达式语言

  1. OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
  2. JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言。
  3. Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性
  4. Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。

Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:

  1. 支持对象方法调用,如xxx.doSomeSpecial();
  2. 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;
  3. 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
  4. 访问OGNL上下文(OGNL context)和ActionContext;
  5. 操作集合对象

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个符号:#、%、$

  1. #符号
  • 访问非根对象属性,例如#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’}。
  1. %符号

%符号的用途是在标志的属性为字符串类型时,计算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" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值