`
k_lb
  • 浏览: 838157 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

struts2中的ognl和jstl中的el的区别 OGNL基础知识

 
阅读更多
jstl是JSP标签,有点像html的标签。
ognl与el功能类似,都是表达式语言。
ognl是在webwork2.0和struts2.x中取代el的。
以下转自 :http://blog.csdn.net/sooneasy/article/details/4386522

OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,OGNL是一个开源项目,读者可以访问其官方站点www.ognl.org以获得源代码和相关资料。OGNL是一种功能强大的EL(Expression Language,表达式语言),可以通过简单的表达式来访问Java对象中的属性。

OGNL先在WebWork项目中得到应用,也是Struts 2框架视图默认的表达式语言,可以说,OGNL表达式是Struts 2框架的特点之一。

8.1 OGNL基础知识

8.1.1 OGNL的优势

同以往的技术相比,OGNL有哪些优势呢?总结起来有如下几个方面。

— OGNL是将视图元素(例如textfield、combobox等)同模型对象绑定在一起的一种语言。使用OGNL的类型转换功能,会使类型转换变得更加简单(例如将一个字符串类型转换为一个整数类型)。

— 表格元素同Swing TableModel对应的一种数据源语言。

— 可以将Web页面元素同后台服务器业务对象对应起来。

— 比JSTL(JSP标准标签库)表达更加丰富。

8.1.2 OGNL语法

基本的OGNL语法是十分简单的,当然OGNL支持丰富的表达式,一般情况下,不用担心OGNL的复杂性。例如有一个man对象,该对象有一个name属性,那么使用OGNL来获得该name属性可以使用如下表达式:

man.name

OGNL表达式的基础单元称为导航链,简称为链。一个最简单的链由如下部分组成。

— 属性名称:如上述示例中的name。

— 方法调用:hashCode()返回当前对象的hash code。

— 数组元素:listeners[0]返回当前对象的监听器列表中的第一个元素。

★ 说明 ★

OGNL表达式基于OGNL上下文中的当前对象,一个“链”将使用上一个“链”的处理结果,开发者可以任意扩展该链的长度,OGNL没有限制。

(1.2.3.4.5 是先执行1.2然后执行(1.2).3 然后执行 ((1.2).3).4 这样的)

例如,一个OGNL表达式如下:

name.toCharArray()[0].numericValue.toString()

该表达式将按照如下步骤求值。

(1)获得OGNL Context中初始对象或者是根对象(root对象)的name对象。

(2)调用toCharArray()方法,返回一个String类型对象。

(3)获得该String对象的第一个字符。

(4)获得该字符的numericValue属性(该字符为一个Character对象,该对象有一个getNumericValue()方法,该方法返回一个Integer类型值)。

(5)将获得的Integer对象转换为一个String类型值(使用toString()方法)。

8.1.3 一个使用OGNL的示例

下面笔者以一个简单的示例来帮助读者理解OGNL表达式。使用OGNL表达式,需要在www.ognl.org网站下载一个ognl.jar插件包,将该文件复制到classpath路径下即可。建立一个复合类型,如代码8.1所示。

代码8.1 定义复合类型

package ch8;

import java.util.Date;

//团队类

public class Team {

// 团队名称

private String teamname;

// 定义团队人员属性

private Person person;

// 团队人数

private int personnum;

//属性的gettersetter方法

public String getTeamname() {

return teamname;

}

public void setTeamname(String teamname) {

this.teamname = teamname;

}

public Person getPerson() {

return person;

}

public void setPerson(Person person) {

this.person = person;

}

public int getPersonnum() {

return personnum;

}

public void setPersonnum(int personnum) {

this.personnum = personnum;

}

}

// 定义人员类

class Person {

// 姓名

private String name;

// 年龄

private int age;

// 人员出生日期

private Date birthday;

//属性的gettersetter方法

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

}

代码8.1所示内容定义了两个复合类型:团队(team)和人员(person)类型。使用OGNL表达式示例,如代码8.2所示。

代码8.2 使用OGNL表达式示例

package ch8;

import java.util.HashMap;

import java.util.Map;

import ognl.Ognl;

import ognl.OgnlException;

public class TestOGNL {

public static void main(String[] args) {

//定义一个Map对象

Map m = new HashMap();

//定义一个Team对象

Team team1 = new Team();

team1.setTeamname("团队1");

//定义一个Person对象

Person person1 = new Person();

person1.setName("pla1");

//添加team元素

team1.setPerson(person1);

//定义一个Team对象

Team team2 = new Team();

team2.setTeamname("团队2");

//定义一个Person对象

Person person2 = new Person();

person2.setName("pla2");

//添加team元素

team2.setPerson(person2);

//添加Map元素

m.put("team1", team1);

m.put("team2", team2);

try {

System.out.println(Ognl.getValue("team1.teamname", m));

System.out.println(Ognl.getValue("team2.person.name", m));

System.out.println(Ognl.getValue("teamname", team2));

System.out.println(Ognl.getValue("person.name", team2));

} catch (OgnlException e) {

}

}

}

代码8.2所示内容定义了一个Map类型的嵌套属性,如图8.1所示。

图8.1 嵌套属性示意图

运行该示例,控制器显示如下信息:

团队1

pla2

团队2

pla2

★ 说明 ★

OGNL可以使用非常简单的表达式来访问多层嵌套属性,为开发者提供了一个有力的工具。

8.2 Struts 2的OGNL

OGNL是Struts 2框架的默认表达式语言,增强了Struts 2的数据访问能力,同时简化了代码。

8.2.1 Struts 2的OGNL表达式

标准的OGNL会设定一个根对象(root对象)。假设使用标准OGNL表达式来求值(不使用Struts 2的OGNL表达式),如果OGNL上下文(OgnlContext Map类型)有两个对象:foo对象,在OgnlContext中名称为foo;bar对象,在OgnlContext中名称为bar。同时foo对象被设置为根对象(root)。则利用下面的OGNL表达式求值:

// 返回foo.getBlah()

#foo.blah

//返回bar.getBlah()

#bar.blah

//返回foo.getBlah() ,因为foo为根对象

blah

★ 说明 ★

使用OGNL是非常简单的,如果要访问的对象不是根对象,如示例中的bar对象,则需要使用命名空间,用“#”来标识,如“#bar”;如果访问一个根对象,则不用指定命名空间,可以直接访问根对象的属性。

在Struts 2框架中,值栈(Value Stack)就是OGNL的根对象,假设值栈中存在两个对对象实例:Man和Animal,这两个对象实例都有一个name属性,Animal有一个species属性,Man有一个salary属性,假设Animal在值栈的顶部,Man在Animal后面,下面的代码片断会帮助读者更好地理解OGNL表达式:

// 调用animal.getSpecies()

species

// 调用man.getSalary()

salary

// 调用animal.getName(),因为Animal位于值栈的顶部

name

最后一行示例代码,返回的是animal.getName()返回值,即返回了Animal的name属性,因为Animal是值栈的顶部元素,OGNL将从顶部元素搜索,所以会返回Animal的name属性值。如果要获得Man的name值,则需要如下代码:

man.name

Struts 2允许在值栈中使用索引,示例代码如下所示:

[0].name // 调用animal.getName()

[1].name // 调用man.getName()

说明注意

使用索引,并不是直接获得指定的元素,而是从指定的索引位置搜索。

Struts 2中的OGNL Context是ActionContext,如图8.2所示。

图8.2 Struts 2的OGNL Context结构示意图

★ 说明 ★

图8.2只是说明Struts 2的OGNL Context结构,实际上Context还包含其他对象。

由于值栈是Struts 2中OGNL的根对象,如果用户需要访问值栈中的对象,则可以直接通过下面的代码访问值栈中的属性:

//获得值栈中的foo属性

${foo}

如果访问其他Context中的对象,由于不是根对象,在访问时,需要加#前缀。

— application对象:用于访问ServletContext,例如#application.userName或者#application['userName'],相当于调用Servlet的getAttribute("username")。

— session对象:用来访问HttpSession,例如#session.userName或者#session['userName'],相当于调用session.getAttribute("userName")。

— request对象:用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['userName'],相当于调用request.getAttribute("userName")。

— parameters对象:用于访问HTTP的请求参数,例如#parameters.userName或者#parameters['userName'],相当于调用request.getParameter("username")。

— attr对象:用于按page-request-session-application顺序访问其属性。

8.2.2 OGNL的集合操作

如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。

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

{e1,e2,e3…}

该OGNL表达式中,直接生成了一个List对象,该List对象中包含3个元素:e1、e2和e3。如果需要更多的元素,可以按照这样的格式定义多个元素,多个元素之间使用逗号隔开。

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

#{key1:value1,key2:value2,…}

Map类型的集合对象,使用key-value格式定义,每个key-value元素使用冒号标识,多个元素之间使用逗号隔开。

对于集合类型,OGNL表达式可以使用in和not in两个元素符号。其中,in表达式用来判断某个元素是否在指定的集合对象中;not in判断某个元素是否不在指定的集合对象中,如代码8.3所示。

代码8.3 使用OGNL集合操作符

<s:if test="'foo' in {'foo','bar'}">

muhahaha

</s:if>

<s:else>

boo

</s:else>

<s:if test="'foo' not in {'foo','bar'}">

muhahaha

</s:if>

<s:else>

boo

</s:else>

除了in和not in之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有以下3个相关操作符。

— ?:获得所有符合逻辑的元素。

— ^:获得符合逻辑的第一个元素。

— $:获得符合逻辑的最后一个元素。

例如代码:

person.relatives.{? #this.gender == 'male'}

该代码可以获得person的所有性别为male的relatievs集合。

8.2.3 Lambda表达式

OGNL支持基本的Lambda表达式语法,通过Lambda表达式语法,可以在OGNL中使用一些简单的函数。例如:

Fibonacci:

if n==0 return 0;

elseif n==1 return 1;

else return fib(n-2)+fib(n-1);

fib(0) = 0

fib(1) = 1

fib(11) = 89

开发者可以使用Lambda表达式语法:

<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />

8.3 Struts 2中使用OGNL

在这里,笔者以一个示例来演示Struts 2如何使用OGNL表达式。

分享到:
评论

相关推荐

    ognl和el区别

    在Struts2中,EL常用于简单的视图层展示,而OGNL则在Action和拦截器等更深层的逻辑处理中使用。根据实际项目需求和性能考虑,合理选择使用这两种语言。 6. **总结** OGNL和EL都是为了简化数据绑定和表达式处理,...

    JSP+Struts+JSTL+EL学习实例

    Struts2是其后续版本,引入了更多先进的特性,例如拦截器(Interceptors)和OGNL(Object-Graph Navigation Language)表达式语言,但在此实例中,我们讨论的是较早的Struts1版本。 JSTL(JavaServer Pages ...

    JSTL、EL、ONGL、Struts标签的区别

    **与 JSTL 的区别**: OGNL 是 Struts2 的一部分,主要用于对象图导航,而 JSTL 是一组标准标签库,用于控制流和数据操作。 #### 四、Struts 标签 **定义**: Struts 标签是 Struts 框架提供的用于简化 JSP 页面开发...

    struts1和struts2的区别

    - **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...

    Struts1和Struts2的区别和对比

    Struts1和Struts2是两个非常著名的Java Web框架,它们在设计模式、可测试性、输入处理和表现层等方面存在显著的区别。 首先,Action类的设计有所不同。在Struts1中,Action类需要继承一个抽象基类,这限制了Action...

    留言板留言板struts2留言板struts2

    JSP中可以使用EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)标签库,结合OGNL来显示Action返回的数据。 8. **表单处理**:Struts2提供了强大的表单处理能力,可以自动绑定请求参数到...

    转:struts1与struts2的区别

    - **Struts1**: Struts1集成了JSTL,使用JSTL的表达式语言(EL),支持基本的对象图遍历,但对于集合和索引属性的支持较弱。 - **Struts2**: Struts2不仅支持JSTL,还可以使用更强大、更灵活的表达式语言OGNL...

    struts1和struts2区别

    Struts1和Struts2是两个非常著名的Java Web框架,它们在处理MVC(Model-View-Controller)架构方面有着显著的区别。以下是关于这两个框架在关键特性上的对比: 1. **Action类**: - **Struts1**:要求Action类继承...

    struts1.x和struts2.x区别

    Struts1.x主要依赖于标准的JSP页面作为视图展示,虽然也支持JSTL和EL,但功能相对有限。Struts2.x则引入了ValueStack概念,使得数据的传递和视图的渲染更加灵活高效。Struts2.x还支持多种视图技术,包括JSP、...

    Struts2和Struts1的区别,详细点,主要说说Struts2

    ### Struts2与Struts1的主要区别 #### Struts2架构设计与实现方式 - **Struts2**在设计上采用了更加灵活的方式,每个请求都对应一个实例化的Action对象,而不是像**Struts1**那样在整个请求周期内共享同一个Action...

    Struts2与Struts1区别

    - Struts1 使用 JSTL 的 EL(Expression Language),而 Struts2 引入了自己的 OGNL(Object-Graph Navigation Language),提供了更强大的数据访问和操作能力,允许在视图层更自由地访问和操作模型数据。...

    struts2 与 struts1的区别

    值得注意的是,在Struts2中,Action接口并不是强制性的,任何包含`execute`标记的方法所在的POJO都可以用作Action对象。 #### 二、线程安全模型 - **Struts1** 中的Action采用的是单例模式,这意味着对于所有的...

    OGNL表达式

    - **$**:在JSP页面中表示EL表达式的开头,但在Struts2中通常不直接使用,而是通过#符号配合使用。 #### 五、示例代码详解 为了更好地理解OGNL表达式的使用,我们来看一个具体的示例。假设我们在开发一个简单的Web...

    Struts1与Struts2本质区别

    - **Struts 1**:整合了JSTL的EL(Expression Language)表达式语言,支持基本的对象图遍历,但对于复杂的集合操作和索引属性的支持有限。 - **Struts 2**:使用更强大的OGNL(Object Graph Notation Language)...

    struts2配置详解

    从 Struts1 升级到 Struts2: 1、Struts1 里使用 ActionServlet 作为控制器; Struts2 使用了一个过滤器作为控制器 2、Struts1 中每个 ...5、Struts2 在页面里使用 OGNL 来显示各种对象模型, 可以不再使用 EL 和 JSTL

    struts2中核心知识点(职场必备)

    以下是Struts2的一些核心知识点,掌握这些内容能够帮助你在面试中表现出色。 1. **MVC模式的优势**: MVC模式将应用程序分为三个层次:视图(View)、模型(Model)和控制器(Controller)。这种分离有利于项目...

    struts2综合复习习题

    - OGNL(对象图导航语言)是一种强大的表达式语言,用于在Struts2中访问和操作对象。OGNL的根对象是`ValueStack`,它是Struts2框架内部用于存储请求作用域中的所有对象的容器。 #### 九、在jsp页面中可以通过Struts2...

Global site tag (gtag.js) - Google Analytics