OGNL简单的struts 2专用表达式Word格式.docx

上传人:b****7 文档编号:21960657 上传时间:2023-02-02 格式:DOCX 页数:10 大小:17.60KB
下载 相关 举报
OGNL简单的struts 2专用表达式Word格式.docx_第1页
第1页 / 共10页
OGNL简单的struts 2专用表达式Word格式.docx_第2页
第2页 / 共10页
OGNL简单的struts 2专用表达式Word格式.docx_第3页
第3页 / 共10页
OGNL简单的struts 2专用表达式Word格式.docx_第4页
第4页 / 共10页
OGNL简单的struts 2专用表达式Word格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

OGNL简单的struts 2专用表达式Word格式.docx

《OGNL简单的struts 2专用表达式Word格式.docx》由会员分享,可在线阅读,更多相关《OGNL简单的struts 2专用表达式Word格式.docx(10页珍藏版)》请在冰豆网上搜索。

OGNL简单的struts 2专用表达式Word格式.docx

}

publicvoidsetTeamname(Stringteamname){

this.teamname=teamname;

publicPersongetPerson(){

returnperson;

publicvoidsetPerson(Personperson){

this.person=person;

publicintgetPersonnum(){

returnpersonnum;

publicvoidsetPersonnum(intpersonnum){

this.personnum=personnum;

}

//定义人员类

classPerson{

//姓名

privateStringname;

//年龄

privateintage;

//人员出生日期

privateDatebirthday;

publicStringgetName(){

returnname;

publicvoidsetName(Stringname){

this.name=name;

publicintgetAge(){

returnage;

publicvoidsetAge(intage){

this.age=age;

publicDategetBirthday(){

returnbirthday;

publicvoidsetBirthday(Datebirthday){

this.birthday=birthday;

代码8.1所示内容定义了两个复合类型:

团队(team)和人员(person)类型。

使用OGNL表达式示例,如代码8.2所示。

代码8.2使用OGNL表达式示例

importjava.util.HashMap;

importjava.util.Map;

importognl.Ognl;

importognl.OgnlException;

publicclassTestOGNL{

publicstaticvoidmain(String[]args){

//定义一个Map对象

Mapm=newHashMap();

//定义一个Team对象

Teamteam1=newTeam();

team1.setTeamname("

团队1"

);

//定义一个Person对象

Personperson1=newPerson();

person1.setName("

pla1"

//添加team元素

team1.setPerson(person1);

Teamteam2=newTeam();

team2.setTeamname("

团队2"

Personperson2=newPerson();

person2.setName("

pla2"

team2.setPerson(person2);

//添加Map元素

m.put("

team1"

team1);

team2"

team2);

try{

System.out.println(Ognl.getValue("

team1.teamname"

m));

team2.person.name"

teamname"

team2));

person.name"

}catch(OgnlExceptione){

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

图8.1嵌套属性示意图

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

团队1

pla2

团队2

★说明★

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

8.2Struts2的OGNL

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

8.2.1Struts2的OGNL表达式

标准的OGNL会设定一个根对象(root对象)。

假设使用标准OGNL表达式来求值(不使用Struts2的OGNL表达式),如果OGNL上下文(OgnlContextMap类型)有两个对象:

foo对象,在OgnlContext中名称为foo;

bar对象,在OgnlContext中名称为bar。

同时foo对象被设置为根对象(root)。

则利用下面的OGNL表达式求值:

//返回foo.getBlah()

#foo.blah

//返回bar.getBlah()

#bar.blah

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

blah

使用OGNL是非常简单的,如果要访问的对象不是根对象,如示例中的bar对象,则需要使用命名空间,用“#”来标识,如“#bar”;

如果访问一个根对象,则不用指定命名空间,可以直接访问根对象的属性。

在Struts2框架中,值栈(ValueStack)就是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

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

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

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

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

Struts2中的OGNLContext是ActionContext,如图8.2所示。

图8.2Struts2的OGNLContext结构示意图

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

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

//获得值栈中的foo属性

${foo}

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

?

application对象:

用于访问ServletContext,例如#application.userName或者#application['

'

userName'

],相当于调用Servlet的getAttribute("

username"

)。

session对象:

用来访问HttpSession,例如#session.userName或者#session['

],相当于调用session.getAttribute("

userName"

request对象:

用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['

],相当于调用request.getAttribute("

parameters对象:

用于访问HTTP的请求参数,例如#parameters.userName或者#parameters['

],相当于调用request.getParameter("

attr对象:

用于按page-request-session-application顺序访问其属性。

8.2.2OGNL的集合操作

如果需要一个集合元素的时候(例如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和notin两个元素符号。

其中,in表达式用来判断某个元素是否在指定的集合对象中;

notin判断某个元素是否不在指定的集合对象中,如代码8.3所示。

代码8.3使用OGNL集合操作符

<

s:

iftest="

foo'

in{'

'

bar'

}"

>

muhahaha

/s:

if>

else>

boo

notin{'

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

?

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

^:

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

$:

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

例如代码:

person.relatives.{?

#this.gender=='

male'

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

8.2.3Lambda表达式

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

例如:

Fibonacci:

ifn==0return0;

elseifn==1return1;

elsereturnfib(n-2)+fib(n-1);

fib(0)=0

fib

(1)=1

fib(11)=89

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

propertyvalue="

#fib=:

[#this==0?

0:

#this==1?

1:

#fib(#this-2)+#fib(#this-1)],#fib(11)"

/>

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1