将用户提交的参数(字符串)转换成对应的Java类型。
Struts2的类型转换是基于OGNL表达式的,只要把表单元素的name属性命名为合法的OGNL表达式,就可以充分利用struts2的类型转换机制。
(1)传统的日期转换:字符串àjava.util.Date
SimpleDateFormat sdf = newSimpleDateFormat(“yyyy-MM-DD”);
Date birthday = sdf.parse(“1991-05-28”);
(2)实现类型转换器
Struts2的类型转换是基于OGNL表达式的,在OGNL项目中有一个TypeConverter接口,这个接口就是实现类型转换器必须实现的接口。
这个接口中的方法在复杂,struts2还提供了一个该接口的实现类:DefaultTypeConverter。继承该类就可以实现类型转换器。需重写convertValue方法。
下面是该方法的示例:
为啥从浏览器获取的是字符串数组呢?
因为表单提交的信息中可能有复选框,复选框是一个数组,考虑到通用情形,将所有参数都看成数组。可以认为DefaultTypeConverter是通过HttpServletRequest的getParameterValues(name)方法实现的。
转换器定义完成后,必须配置到WEB应用中才可以正常使用。配置方式有三种:
l 局部类型转换器:只对某一个Action有效。
l 全局类型转换器:对所有的Action都有效。
l 使用jdk1.5的注释来注册类型转换器:通过注解方式生成类型转换器。
局部类型:
提供文件名为如下格式的文件:
ActionName-conversion.properties
内容是:
propertyName=类型转换类
例如,指定LoginAction的user属性需要使用lee.UserConverter类来完成类型转换。
全局类型:
提供文件名为如下格式的文件:
Xwork-conversion.properties文件。
例如,指定lee.User的类型转换器是lee.UserConverter:
lee.User=lee.UserConverter
这个转换器对所有的User都起作用。
(3)基于struts2的转换器
Struts2提供了一个StrutsTypeConverter抽象类,这个抽象类是DefaultTypeConverter的子类。需要分别实现这个类中convertFromString和convertToString方法。分开实现是程序显得更加清晰。
(4)OGNL表达式转换方式:
在Action类中提供User的getter和setter:privateUser user; public void setUser(user);
public User getUser();
在JSP页面中,通过struts2标签,给User中的username和password赋值:
<s:textfield name=”user.username”/>
<s:password name=”user.password”/>
可以将第一个输入框的值赋给Action中User的username属性,将第二个密码框中的值赋给Action中User的password属性。是通过Action中提供的User的setUser方法实现的。
注意:User类必须提供无参的构造器。
必须提供set方法。因为要通过这个方法赋值。
还可以直接给Map赋值。例如:
Private Map user;
Public void setUser(user)
Public User getUser()
在JSP页面中,给Map赋值:
Name=”user[‘one’].name”。
(5)对于List或Map等集合类型,如何让struts2知道里面存储的是什么类型的元素呢?两种方式:
一:通过泛型指定。
二:通过在局部类型转换配置文件中指定集合元素的数据类型。在局部类型转换文件中添加如下key/value对:Element_xxx=复合类型。其中,Element是固定的,xxx是Action中集合的属性名,复合类型是元素类型的全限定名称。
在Map中,需要制定key和value,指定key可以通过Key_xxx=复合类型,指定value可以通过Element_xxx=复合类型
(6)指定集合元素的索引属性
Set集合是无序的,有的时候在里面找我们需要的元素会比较费劲,struts2允许通过指定集合元素的key属性,在集合中唯一标识这个元素。
在局部类型转换文件中增加下列项即可:KeyProperty_集合属性名=集合元素的索引属性名。
例如:在JSP页面中访问user集合属性里索引属性值为scott的元素的name属性:
<s:property value=”user(‘scott’).name”/>
注意:Set集合在访问时使用圆括号,数组,List,Map访问时使用方括号。
(7)struts2的内建转换器
可以实现字符串-- > 基本数据类型的转换(除了byte和short类型)。还支持Date类型转换,日期格式使用用户请求所在的Locale的SHORT格式。还支持数组和集合的转换。
(8)类型转换的错误处理
主要是由用户的错误输入和恶意输入造成的,所以需要进行校验。检验成功后,才将请求发送到服务器进行处理,以避免造成服务器的错误。
Struts2的转换异常处理机制:struts2提供了一个名为conversionError的拦截器,这个拦截器被注册在默认的拦截器栈中。如果类型转换出现错误,这个拦截器将把错误信息封装到表单语错误fieldError,并将这些错误信息放入ActionContext中。conversionError拦截后会返回input处理结果集。
对于封装在fieldError中的错误信息,在JSP页面中通过<s:fielderror />就可以将错误信息输出。
对于集合类型的属性的转换错误,只要struts2可以检测出集合中元素的类型,类型转换器就可以正常起作用。