Struts2权威指南总结5:Struts2的类型转换

将用户提交的参数(字符串)转换成对应的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可以检测出集合中元素的类型,类型转换器就可以正常起作用。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值