当前位置: 首页 > 工具软件 > OGNL > 使用案例 >

OGNL表达式用法详解

汝臻
2023-12-01

表达式通常用来访问页面中的各种变量,进行结果输出.

struts2中共支持以下几种表达式语言(默认的是OGNL):

(1)OGNL:可以方便地操作对象属性的开源表达式语言;

(2)JSTL:(JSP Standard Tag Library):JSP2.0集成的标准表达式语言;

(3)Groovy:基于Java平台的动态语言,它具有时下比较流行的动态语言的一些特性;

(4)Velocity:一种基于Java的模板匹配引擎。

一、什么是OGNL

名称:全称是Object-Graph Navigation Language

用途:是一个用来获取 和设置 java对象属性的表达式语言。

应用场合:通过使用表达式语法导航对象图,而不是直接调用对象的获取和设置方法可以提供许多应用。比如在XML文件 或者脚本文件中嵌入OGNL表达式语法,在JSP页面 使用OGNL表达式语法。

操作对象:基于当前对象的上下文。

二、OGNL引用方式

属性名称:如对象user的属性username,可以使用user.username来获取.

方法调用:可以使用user.hashCode()返回当前对象的哈希码.

数组元素:对于userlist数组对象,可以使用userlist[0]来引用其中的某一个元素.

三、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表达式

1)要使用OGNL表达式,首先需要在web.xml中添加ActionContextCleanUp过滤器

<filter>

<filter-name>struts-cleanup</filter-name>

<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>

</filter>

<filter-mapping>

<filter-name>struts-cleanup</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

五、OGNL中的#、%和$符号

      #、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分。在这里我们简单介绍它们的相应用途。

1.#符号的三种用法

   1)访问非根对象属性,例如示例中的#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。 

      parameters:包含当前HTTP请求参数的Map,#parameters.id[0],等价于request.getParameter("id");

             request:包含当前HttpServletRequest的属性的Map,#request.userName,等价于request.getAttribute("username");

             session:包含当前HttpSession的属性的Map,#session.userName,等价于session.getAttribute("username");

             application:包含当前应用的ServletContext的属性的Map,#application.userName,等价于application.getAttribute("username");

             attr:用于按request→session→application顺序访问某个属性,#attr.userName,等价于按顺序在request,session,application范围内读取                          userName属性,直到找到为止。

 

     2)用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}。         

 

                ? --获取集合中所有满足选择逻辑的对象(拿sql来做比例就是"select * from xxx where age>20")

                ^ --获取集合中第一个满足选择逻辑的对象(拿sql来做比例就是"select top(1) from xxx where age>20")

                $ --获取集合中最后一个满足选择逻辑的对象

     3) 用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

 

2.%符号

 

      %符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:

<h3>构造Map</h3>

    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />

    <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>

    <p>不使用%:<s:url value="#foobar['foo1']" /></p>

   <p>使用%:<s:url value="%{#foobar['foo1']}" /></p>

运行界面如下所示。

he value of key "foo1" is bar1

不使用%:#foobar['foo1']

使用%:bar1

3.$符号

$符号主要有两个方面的用途。

     1) 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

     2) 在Struts 2框架的配置文件中引用OGNL表达式,例如下面的代码片断所示:

<validators>
   <field name="intb">
            <field-validator type="int">
            <param name="min">10</param>
            <param name="max">100</param>
            <message>BAction-test校验:数字必须为${min}为${max}之间!</message>
        </field-validator>
    </field>
</validators>

 

 类似资料: