ognl表达式和el表达式,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=min10/param

param name=max100/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表达式实例详解等。

ognl表达式和el表达式,ognl调用方法