OGNL简单的struts 2专用表达式Word格式.docx
- 文档编号:21960657
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:10
- 大小:17.60KB
OGNL简单的struts 2专用表达式Word格式.docx
《OGNL简单的struts 2专用表达式Word格式.docx》由会员分享,可在线阅读,更多相关《OGNL简单的struts 2专用表达式Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
}
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)"
/>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OGNL简单的struts 2专用表达式 OGNL 简单 struts 专用 表达式