ognl表达式和el表达式,ognl调用方法,OGNL表达式基本语法与用法详解

ognl表达式和el表达式,ognl调用方法,OGNL表达式基本语法与用法详解

本文主要介绍OGNL表达式的基本语法和用法,具有一定的参考价值。有需要的朋友可以理解。

一OGNL中的#、%和$符号

#、%和$符号经常出现在OGNL表达式中,这三个符号不容易被开发者掌握和理解。这里我们简单介绍一下它们对应的用途。

1#符号的三种用法

1)访问非根对象的属性,例如示例中的#session.msg表达式。因为在Struts 2中值栈被视为根对象,所以在访问其他非根对象时需要加上#前缀。实际上,#相当于action context . get context();#session.msg表达式等效于actioncontext.getcontext()。getsession()。getattribute ('msg ')。

2)用于过滤和投影集合,例如示例中的人。{?#this.age20} .

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

2%符号

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

H3地图/h3建筑

s:set name=' foobar ' value=' # { ' foo 1 ':' bar 1 ',' foo2':'bar2'}' /

p键“foo1”的值为s:属性值='#foobar['foo1']' //p

p不要使用%:s:URL value=' # foobar[' foo 1 ']'//p

使用p %:s:URL value=' % { # foobar[' foo 1 ']} '/p

操作界面如下所示。

键“foo1”的值是bar1

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

使用%: bar1

3$符号

$符号有两个主要用途。

1)在国际资源文件中,参考OGNL表达式,如国际资源文件中的代码:reg.agerange=国际资源信息:年龄必须在

介于${min}和${max}之间。

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

验证器

字段名='intb '

字段验证器类型='int '

param name='min'10/param

param name='max'100/param

messagebactiontestcheck:该数字必须介于${min}和${max}之间!/消息

/字段验证器

/字段

/验证器

二我们一起看一下OGNL常用表达式:

1.当使用OGNL调用静态方法时,您需要根据以下语法编写一个表达式:

@package.classname@methodname(参数)

2.对于OGNL,java.lang.Math是它的默认类。如果调用java.lang.Math的静态方法,不需要指定类名,比如:@@min(4,10);

3.对于OGNL来说,数组和集合一样,都是通过下标索引来访问的。

获取列表:s: propertyvalue=' testlist'/br

获取列表中的元素(可以使用类似于数组中的下标来获取列表的内容):s:property value=' test List[0]'/br

get set:s:property value=' test set '/br

获取集合中的一个元素(由于集合没有顺序,无法通过下标获取数据):s:property value=' test Set[0]'/br

获取映射:s: propertyvalue=' testmap'/br

获取映射中的所有键:s:property value=' test Map . keys '/br

获取映射中的所有值:s:property value=' test Map . values '/br

获取Map中的一个元素(可以通过使用类似于数组中的下标来获取列表的内容):

s:属性值='testMap['m1']'/br

获取列表的大小:s:property value=' test set . size '/br

4.使用OGNL处理地图的语法格式如下:

#{'key1 ':'值1 ',' key2 ':'值2 ',' key3 ':'值3 ' };

5.过滤:收藏。{?表情}

6.OGNL为集合提供了一些伪属性(比如size,isEmpty),这样我们就可以通过属性调用方法(本质原因是集合中的很多方法不符合JavaBean的命名规则),但是我们仍然可以调用方法达到伪属性一样的目的。

7.筛选以获取set: collection中的第一个元素。{表情}

8.筛选以获取set: collection中的最后一个元素。{表情}

9.在使用过滤操作时,我们通常使用#this,它用于表示当前迭代集中的对象(联想增强for循环)

10.投影:收藏。{表情}

11.过滤与投影之间的差别:类比于数据库中的表,过滤是取行的操作,而投影是取列的操作。具体举例如下:

利用选择获取目录中成绩及格的对象:s:属性值='stus .{?#this.grade=60}'/br

利用选择获取目录中成绩及格的对象的用户名:

学生:属性值='stus .{?#this.grade=60}{用户名}'/br

利用选择获取目录中成绩及格的第一个对象的用户名:

学生:属性值='stus .{?#this.grade=60}{用户名}[0]'/br

利用选择获取目录中成绩及格的第一个对象的用户名:

学生:属性值='stus .{^#this.grade=60}.{用户名}'/br

利用选择获取目录中成绩及格的最后一个对象的用户名:

学生:属性值='stus .{$#this.grade=60} .{用户名}'/br

利用选择获取目录中成绩及格的第一个对象然后求大小:

学生:属性值='stus .{^#this.grade=600}.{用户名}。尺寸/br

12.在支柱2中,根对象就是值堆栈。在支柱2的任何流程当中,值堆栈中的最顶层对象一定是行动对象。

13.参数,#参数。用户名

请求,#请求。用户名

会话,#会话。用户名

应用程序,#应用程序。用户名

属性,#属性。用户名

以上几个对象叫做"命名对象"。

14.访问静态方法或是静态成员变量的改进。

@ vs @方法

15.关于支柱2标签库属性值的%与#号的关系:

1).如果标签的属性值是OGNL表达式,那么无需加上%{}。

2).如果标签的属性值是字符串类型,那么在字符串当中凡是出现的%{}都会被解析成OGNL表达式,解析完毕后再与其他的字符串进行拼接构造出最后的字符串值。

3).我们可以在所有的属性值上加%{},这样如果该属性值是OGNL表达式,那么标签处理类就会将%{}忽略掉。

最后一起用代码说话,简单的看一下ognl操作的示例:

1)上下文环境中使用OGNL

公共静态void main(String[] args)

{

MapString,Object context=new HashMapString,Object();

人员人员1=新人();

person1.setName('张三');

人员人员2=新人();

人物2。setname(“Lisi”);

人员人员3=新人();

person3.setName('吴王');

人员人员4=新人();

person4.setName('刘钊');

context.put('person1 ',person 1);

context.put('person2 ',person 2);

context.put('person3 ',person 3);

尝试

{

对象值=ognl。getvalue(' name ',context,person 2);

System.out.println('ognl表达式'名称'求值为: '值');

对象值2=ognl。getvalue(# person 2。姓名',上下文,人物2);

System.out.println('ognl表达式#person2.name '求值为:'值2 ');

对象值3=ognl。getvalue(# person 1。姓名',上下文,人物2);

System.out.println('ognl表达式#person1.name '求值为:'值3 ');

对象值4=ognl。getvalue(' name ',context,person 4);

System.out.println('ognl表达式'名称'求值为:'值4 ');

对象值5=ognl。getvalue(# person 4。姓名',上下文,人物4);

System.out.println('ognl表达式'人员4 .姓名'求值为:'值5 ');

//对象值6=ognl。getvalue(# person 4。姓名',上下文,人物2);

//System.out.println('ognl表达式#person4.name '求值为:‘值6’);

}

2)使用OGNL调用方法

公共静态void main(String[] args)

{

OgnlContext context=new OgnlContext();

人员人员1=新人();

people1.setName('张三');

人员人员2=新人();

人民2。集合名称(“Lisi”);

人员人员3=新人();

people3.setName('吴王');

context.put('people1 ',people 1);

context.put('people2 ',people 2);

context.put('people3 ',people 3);

语境。setroot(人1);

尝试

{

对象值=ognl。getvalue(' name。length()',上下文,上下文。getroot());

System.out.println('people1名称长度为:'值');

目标大写=ognl。getvalue(' # people 2。姓名。toupper case()',上下文,上下文。getroot());

System.out.println('people2名称大写为:'大写');

对象invokeWithArgs=ognl。getvalue(' name。charat(5)’,上下文,上下文。getroot());

系统。出去。println(' people 1 name。charat(5)是:' invokeWithArgs ');

object min=ognl。getvalue(' @ Java。郎。math @ min(4,10)',上下文,上下文。getroot());

System.out.println('min(4,10)为:' min ');

对象E=ognl。getvalue(' @ Java。郎。math @ E ',上下文,上下文。getroot());

system . out . println(" E为:' E ');

}

3)使用OGNL操作集合

公共静态void main(String[] args)引发异常

{

OgnlContext context=new OgnlContext();

教室教室=新教室();

德国戴姆勒集团旗下品牌梅赛德斯教室。获取学生().加('张三');

德国戴姆勒集团旗下品牌梅赛德斯教室。获取学生().add(' Lisi ');

德国戴姆勒集团旗下品牌梅赛德斯教室。获取学生().添加('吴王');

德国戴姆勒集团旗下品牌梅赛德斯教室。获取学生().添加('刘钊');

德国戴姆勒集团旗下品牌梅赛德斯教室。获取学生().添加('千奇');

学生学生=新生();

student.getContactWays().put('homeNumber ',' 110 ');

student.getContactWays().put('companyNumber ',' 119 ');

student.getContactWays().放('手机',' 112 ');

context.put('教室,教室);

context.put('学生,学生);

context.setRoot(教室);

对象集合=Ognl.getValue('学生',上下文,语境。getroot());

System.out.println('学生集合为:'集合');

对象第一学生=ognl。getvalue(' students[0]'),context,context。getroot());

System.out.println('第一个学生是: '第一个学生');

对象大小=ognl。getvalue('学生。size()',上下文,上下文。getroot());

System.out.println('学生集合大小为:' size ');

System.out.println(' -飘逸的分割线- ');

对象映射集合=ognl。getvalue(' # student。联系方式,语境,语境。getroot());

系统。出去。println('地图集合为:‘地图收藏’);

对象第一个元素=ognl。getvalue(' # student。联系方式['住宅号码']',上下文,语境。getroot());

系统。出去。println('联系方式的第一个元素是:“第一个元素”);

System.out.println(' -飘逸的分割线- ');

对象创建集合=ognl。getvalue(' { ' aa ',' bb ',' cc ',' dd'} ',context,context。getroot());

系统。出去。println(创建集合);

object createMapCollection=ognl。getvalue(' # { ' key 1 ':' value 1 ',' key2':'value2'} ',上下文,上下文。getroot());

系统。出去。println(createMapCollection);

}

}

总结

以上就是本文关于OGNL表达式基本语法与用法详解的全部内容,希望对大家有所帮助,有问题的话可以随时留言,小编会及时回复大家的。感兴趣的朋友可以继续参阅:支柱2通过ognl表达式实现投影、Struts2 OGNL表达式实例详解等。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: