本文主要介绍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表达式实例详解等。