JavaWeb框架_Struts2_(四)----->表达式语言OGNL

1. 表达式语言OGNL

  • OGNL简介
  • OGNL基本语法
    • 常量
    • 操作符
    • OGNL表达式
  • OGNL基础
    • OGNL上下文
    • OGNL值栈
    • OGNL的访问

2. 具体内容

2.1 OGNL简介

  OGNL(Object-Graph Navigation Language)对象图导航语言的缩写,OGNL是一种表达式语言(Expression Language, EL)。可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

  OGNL是一种对java对象的getter和setter属性的表示和绑定语言。通常,OGNL使用简单一致的表达式语法去存取对象的属性。

2.2 OGNL基本语法

2.2.1 常量

  • 字符串常量:以单引号或双引号括起来的字符串。支持转义字符"\";
  • 字符常量:以单引号括起来的字符,例如‘C‘;
  • 数值常量:java中的int、long、float和double;
  • 布尔常量:true和false;
  • null常量。

  JSP页面中输出常量的示例代码如下:

<%@ taglib prefix="s" uri="/struts-tags" %>            <!--加入Struts2的标签库-->

  <s:property value = "‘you said,\"Hello World\".‘"/><br>
  <s:property value = "true"/><br>
  <s:property value = "null"/><br>
  <s:property value = "12.3f"/>

2.2.2 操作符

  OGNL的逗号支持所有的Java操作符(+、-、*、/、++、--、!=、==、=等)与java类似还提供了一些特有的操作符号。下面介绍OGNL的一些特有的操作符号。

1. 逗号(,)或序列操作符

  逗号被用来分隔两个或者多个独立的表达式,整个表达式的值是最后一个表达式的值;例如:

  team1.person.name, team2.teamname;

  整个表达式的值是第二个表达式的值。

2. 大括号操作符{};

  大括号操作符用于创建表(数组)。使用大括号将元素括起来,元素之间使用逗号分隔开。例如:

  {"mayun","liyanhong","mahuateng"}[1];

  此表达式创建了一个带有三个元素的列表,并且访问其中第二个元素,在JSP页面中输出第二个元素值的代码如下:

 <s:property value="{‘mayun‘,‘liyanhong‘,‘mahuateng‘}[1]"/>

3. in和not in的操作符

  in和not in用来判断一个值是否属于一个集合中。例如:

  teamname in {‘team1‘,‘team2‘};

  此表达式判断teamname是否在数组{‘team1‘,‘team2‘}中,在返回true,不在返回false。

2.2.3 OGNL表达式

  使用OGNL表达式可以访问属性、方法、静态属性和方法、构造方法、数组以及集合等。

1. 访问属性

  OGNL访问属性示例代码如下:

<!--访问属性-->
<s:property value = "uname"/>

<!--访问对象属性(get和set)-->
<s:property value = "user.age"/>
<s:property value = "employee.manager.uname"/>

2. 访问方法

  OGNL访问方法示例代码如下:

<!--访问对象的方法-->
<s:property value = "employee.eat()"/>
<!--访问action的方法-->
<s:property value = "add()"/>

3. 访问静态属性和方法

  OGNL支持调用类中的静态方法和静态字段,可以使用如下语法格式:@[email protected](args);@[email protected];其中,class必须给出完整的类名,如@[email protected](5)。如果省略class,则默认使用类java.lang.Math。示例代码如下:

<!--访问静态方法-->
<s:property value = "@[email protected]()"/>
<!--访问静态属性-->
<s:property value = "@[email protected]"/>
<!--访问Math的静态方法-->
<s:property value = "@@max(4,7)"/>

  需要注意的是,在配置文件(Struts.xml)中,添加如下常量(夹在<struts>标签中,<package>标签上方),OGNL才能访问静态属性和方法:

<constant name = "Struts.ognl.allowStaticMethodAccess" value = "true"/>

  如下图所示:

4. 访问构造方法

  OGNL访问构造方法的示例代码如下:

<!--访问构造方法-->
<s:property value = "new com.my.org.User(44)"/>

5. 访问集合和数值

  可以使用OGNL语言直接生成集合元素(如List对象或Map对象);利用下式代码可以直接生成一个List对象:

  {e1,e2,e3};

  可以使用如下代码直接生成一个Map对象:

  # {key1:value1 , key2:value2 , key3:value3};

  Map集合对象,使用key-value格式定义,每个key-value元素使用冒号标识,多个元素之间采用逗号隔开。对于集合类型OGNL可以使用in和not in两个元素符号,判断元素是否在指定的集合内。

  需要注意的是,OGNL能够引用集合的一些特殊的属性,这些属性不是JavaBeans模式,如size。当表达式引用这些属性时, OGNL 会调用相应的方法,这就是伪属性。

  OGNL中特殊的集合伪书性如下表所示:

集合类型 伪属性 OGNL表达式 Java代码
List,Set,Map size;isEmpty list.size;set.isEmpty list.size();set.isEmpty
List,Set iterator list.iterator;set.iterator list.iterator();set.iterator()
Map keys,values map.keys;map.values map.keySet();map.values()
Iterator next,hasNext it.next;it.hasNext it.next();it.hasNext()

6. 投影

  OGNL中提供了一种简单的方式在一个集合中对每一个元素调用相同的方法,或抽取相同的属性,并将结果保存为一个新的集合,称为投影。

  假设employees是一个包含了employee对象的列表,那么:

 # employees.{name}    // 表示返回所有雇员的名字的列表

  在投影期间,使用 # this变量来引用迭代中的当前元素。例如:

  Object.{#this instanceof String? #this: #this.toString()}

7. 选择

  OGNL提供了一种简单的方式来使用表达式从集合中选择某些元素,并将结果保存到新的集合中,称为选择。其中选择表达式中的关于选择的特殊字符说明如下:

  • ?:选取匹配逻辑的所有元素;
  • ^:选取匹配选择逻辑的第一个元素;
  • $:选取匹配的最后一个元素;

  示例代码如下:

  <!--将返回薪水大于3000雇员的列表-->
  # employees.{?#this.salary > 3000}
  <!--将返回第一个薪水大于3000的雇员-->
  # employees.{^#this.salary > 3000}
  <!--将返回最后一个薪水大于3000的雇员-->
  # employees.{$#this.salary > 3000}

8. OGNL表达式符号

  在Struts2 OGNL中的#和%符号用法说明如下:

(1) #符号

  • 访问非根对象属性,如 #session.msg表达式,# 相当于ActionContext.getContext();
  • 用于选择和投影集合,如person.{?#this.age>30};
  • 用来构造Map集合,如 #{0:男,1:女}

(2) %符号

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

  <s:set name = "foobar" value="# {‘foo1‘:‘bar‘,‘foo2‘:‘bar2‘}"/>
  <s:url value="%{#foobar[‘fool‘]}"/>

2.3 OGNL基础

2.3.1 OGNL上下文

  OGNL的计算都是围绕上下文进行的,OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类(实现了java. util. Map接口)来表示。

  Struts2将OGNLContext设置为ActionContext,即在Struts2中OGNL上下文(Context)的实现为ActionContext。Struts2将ValueStack(值栈)作为OGNL的根对象。

  当Struts2接受一个请求时,会迅速创建ActionContext(上下文),ValueStack(值栈),action。然后把action存进ValueStack,所以action的实例变量可以被OGNL访问。在Struts2中,OGNL表达式需要配合Struts2标签才可以使用,如下所示:

 <s:property value = "uname"/>

2.3.2 值栈

  值栈作为OGNL的根对象(root对象),类似于正常的栈,符合”后进先出“的特点,可以在值栈中放入、删除、查询对象,值栈是Struts2的核心。

  如果要访问根对象(即ValueStack)中的对象的属性,则可以省略 # 命名空间,直接访问该对象的属性既可。如下,读取栈中的数据。

  <!--按照后进先出的方式,读取栈中元素-->
  <s:property value="#root[0].loginname"/>
  <s:property value="#root[1].loginname"/>
  <s:property value="#root[2].loginname"/>

2.3.3 OGNL的访问

  由于ValueStack是Struts2中的OGNL的根对象。如果用户需要访问值栈中的对象,在JSP页面可以通过输入如下表达式语言(EL)访问ValueStack中对象的属性:

  <!--获得值栈中某个对象的foo属性-->
  $ {foo}

  <!--也可以通过Struts标签访问ValueStack中的对象-->
  <s:property value="foo"/>

  如果访问其他Context中的对象,由于它们不是根对象,所以在访问时,需要添加 # 前缀。具体如下:

  1. application对象:用于访问ServletContext,如 # application.userName 或者 # application[‘userName‘],相当于调用了ServletContext 的 getAttribute("username");
  2. session对象:用来访问HttpSession,如 # session.userName 或者 # session[‘userName‘],相当于调用了session .getAttribute(‘userName‘);
  3. request对象:用来访问HttpServletRequest属性的Map,如 # request.userName 或者 # request[‘userName‘],相当于调用request.getAttribute("userName");
  4. parameters对象:用来访问HTTP的请求参数,如 # parameters.userName 或者 # parameters[‘userName‘],相当于调用 requst.getParameter("userName")。
时间: 2024-08-28 14:58:23

JavaWeb框架_Struts2_(四)----->表达式语言OGNL的相关文章

JavaWeb框架_Struts2_(七)-----&gt;文件的上传和下载

这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 1. 章节目录 Struts2文件上传 单文件上传 拦截器实现文件过滤 文件上传常量配置 Struts2多文件上传 Struts2文件下载 2.  具体内容 2.1Struts2文件上传 2.1.1单文件上传 本小节通过一个示例讲解Struts2如何实现单文件的上传. (1) 先写一个选择上传单文件页面(select.jsp) <%@ taglib prefix="s&quo

JavaWeb框架_Struts2_(五)-----&gt;Struts2的标签库

1. Struts2的标签库 标签库概述 数据标签 流程控制标签 表单标签 非表单标签 2. 具体内容 2.1 Struts2标签库概述 Struts2的标签库可以分为以下3类:用户界面标签.非用户界面标签.AJAX标签; 2.1.1 Struts2标签库的分类和使用 1.  从上图中可以看出,标签的分类如下: (1) 用户界面标签(UI标签) UI标签主要用来生成HTML元素的标签,又分为表单标签和非表单标签.表单标签主要用于生成HTML页面的form元素,以及普通表单元素的标签.非表单元素标

JSP简明教程(四):EL表达式语言、JavaBean、Cookie、Session

EL表达式语言 EL就是Expression Language,目的是简化JSP的语法.来看几个例子就明白了. ${test} 会翻译成<%=test%> ${test.name} 会翻译成 <%=test.getName()%> ${sessionScope.username}} 会翻译成 <%=session.getAttribute("username")%> 只有sessionScope.requestScope等才会翻译成getAttrib

OGNL表达式语言网上转来的

1.概念:OGNL是ObjectGraphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言. 2.功能: (1)支持对象方法调用,如xxx.sayHello(): (2)支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@[email protected]('foo%s', 'bar')或@[email protected]_NAME: (3)操作集合对象

Spring学习总结(四)——表达式语言 Spring Expression Language

SpEL简介与功能特性 Spring表达式语言(简称SpEL)是一个支持查询并在运行时操纵一个对象图的功能强大的表达式语言.SpEL语言的语法类似于统一EL,但提供了更多的功能,最主要的是显式方法调用和基本字符串模板函数. 同很多可用的Java 表达式语言相比,例如OGNL,MVEL和JBoss EL,SpEL的诞生是为了给Spring社区提供一个可以给Spring目录中所有产品提供单一良好支持的表达式语言.其语言特性由Spring目录中的项目需求驱动,包括基于eclipse的SpringSou

Struts2标签库汇总和OGNL表达式语言

Struts2标签分类 UI标签:主要用于生成HTML元素的标签 非UI标签:主要用于数据访问.逻辑控制的标签 Ajax标签:用于支持Ajax的标签 表单标签(属于UI标签):用于生成HTML页面的form标签及普通表单元素的标签 非表单标签(属于UI标签):用于生产页面上的树.Tab页等标签 流程控制标签(属于非UI标签):主要包含用于实现分支.循环等流程控制的标签 数据访问标签(属于非UI标签):主要包含用于操作值栈和完成国际化功能的标签. OGNL表达式语言 (Object-Graph N

6、Struts2中的国际化、Ognl(对象图导航语言)表达式语言

Struts2中的国际化.Ognl(对象图导航语言)表达式语言 回顾:Servlet 中国际化: 1). 写资源文件 基础名.properties [默认的语言环境的配置] 基础名语言简称国家简称.properties 2). 读取资源文件,再使用 程序:ResourceBundle Jsp: jstl提供的格式化与国际化标签库. 一.Struts2中国际化: 1. 写资源文件 (同servlet) 2. 读资源文件 程序:ResourceBundle (同servlet) JSP: 1)jst

Struts2之OGNL表达式语言

1.OGNL是Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能.其中OGNL用得最多的地方就是和Struts2的标签绑定,也可以在配置文件中通过${}使用OGNL表达式. 2.OGNL表达式中有几个常用的符号,下面介绍这三种符号的使用: (1).OGNL中$号的使用:第一种,可以在国际化资源文件中引用OGNL表达式.第二种,可以在st

Struts2中使用OGNL表达式语言访问静态方法和静态属性以及我遇到的问题和解决方法

1.上一篇文章,我介绍了OGNL表达式语言,本来想在那篇文章上加上一个使用OGNL访问静态方法和静态属性的例子,但是昨天晚上我写代码时,报了一个警告,获取得到静态属性的值,却获取不到静态方法的返回值,所以今天特别的写篇文章来介绍一下. 2.这里我先附上这个例子,来了解如何使用OGNL表达式访问静态方法和属性. (1).其中访问静态方法或者静态属性的语法分别为:@类的路径@方法名,@类的路径@属性名,语法中类的路径,即包名+类名. (2).对于OGNL来说,java.lang.Math是其默认的类