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路径下。注:此处为全局注册。

由于本人水平有限,欢迎高手指正。

posted on 2013-03-08 18:23  在异乡  阅读(544)  评论(0编辑  收藏  举报