Struts2中的ognl,是一种非常强大的表达式语言,和JSP 中的EL表达式很类似,但是ognl表达式的功能远远强于EL表达式。ognl主要用于数据绑定和数据转移,通过ognl表达式可以很容易获取到valueStack中的数据,通过和Struts2的标签的结合,可以完全替代jsp页面中的Java代码和jsp标签。ognl应用:
(1)支持基本类型属性
假如value stack 中有一个id属性并且值为2,则可以通过"id"来获取id的值,但是要和strut2标签使用才有效,如<s:property value="id"/>
(2)支持数组和list
如Array[0],list[1],例如value stack中一个name的数组,User类型的list,如果要想获取name[1]的值,和user[1]中的usename的值,则可以如下获取<s:property value="name[1]"/>,<s:property value="user[1].name"/>
(3)支持Map
如map.key或者map['key']
(4)支持基本运算 +-/*
(5)方法的调用
例如"hello.toUpperCase",将会得到“HELLO”
(6)调用静态方法
例如@java.lang.Math@abs("-125"),将会得到125
(7)支持创建list和map类型
如list类型:{1,2};map类型:{'name':'zhangsan','age':'24'}
(8)关联属性、投影和过滤
关联属性:user[0].name 获取use类型数组的第一个元素的name属性;投影:users.{name}获取users实例中的name的集合;过滤:users.{?this.age>28}获取users中age大于28的user集合。关联属性、投影和过滤不是很常用。
ognl表达式中有时候需要用到%{ognl表达式},假如要一个链接地址为www.localhost:8080/struts2/list.action中传递一个id参数时,<a href="www.localhost:8080/struts2/list.action?id=%{id}" title="click me">hello</a> 其中%{}是告诉struts2大括号里的内容为ognl表达式。在配置struts.xml中可能会用到${ognl表达式},#ognl表达式表示将ognl表达式中的值放到Stack Context中。
类型转换器:一般Http请求发送的参数都是字符串的形式,但是想要把传递的参数转换成javabean属性的类型,这个时候 就需要类型转换器。struts2中提供内建的类型转换器有boolean/Boolean char/Character int/Interger List Map Data Array等,但是有些时候我们需要自己创建类型转换器。
自定类型转换器的步骤
(1)编写一个继承DefaultTypeConverter类或者StrutsTypeConverter类,重写convertValue方法,例如重写public Object convertValue(Map context, Object value, Class toClass)的方法,注意类型转换是双向的,所以重写convertValue时,需要根据toClass进行判断,是将value转换成你想要的类型还是将你想要的类型转换成特定格式的字符串。struts2中StrutsTypeConverter类中convertValue代码如下:
public Object convertValue(Map context, Object o, Class toClass) {
if (toClass.equals(String.class)) {
return convertToString(context, o);
} else if (o instanceof String[]) {
return convertFromString(context, (String[]) o, toClass);
} else if (o instanceof String) {
return convertFromString(context, new String[]{(String) o}, toClass);
} else {
return performFallbackConversion(context, o, toClass);
}
}
(2)注册类型转换器:一般有三种方法:①通过java注释类来实现,此处不做介绍。
②通过编写一个ActionName-conversion.properties文件,在文件中填写 “你要进行类型转换的属性”=“你编写的类型转换器的详细包路径”,文件和你编写的ActionName类处在同一个目录下。此处为局部注册
③通过编写一个xword-conversion.properties文件,在文件中填写 “你要进行类型转换的属性”=“你编写的类型转换器的详细包路径”,文件放在web-inf下的classes路径下。注:此处为全局注册。
由于本人水平有限,欢迎高手指正。