struts2 类型转换 (一)
一。struts2 内建的类型转换器。
?
对于大部分的常用类型,开发者根本无需创建自己的类型转换器,
因为struts2可以完成大多数常用的类型转换。这些常用的类型转换
是通过struts2内建的类型转换器完成的,struts2已经内建了字符串
类型和如下类型之间的类型转换器。
?boolean和Boolean: 完成字符串和布尔值之间的转换。
?char和Character: 完成字符串和字符之间的转换。
?int和Integer: 完成字符串和整型值之间的转化。
?long和Long: 完成字符串和长整型值之间的转换。
?float和Float: 完成字符串和单精度浮点值之间的转换。
?double和Double:完成字符串和双精度浮点值之间的转换。
?Date: 完成字符串和日期类型之间的转换,日期格式使用用户请求所在Locale的SHORT格式。
?数组: 在默认情况下,数组元素是字符串,如果用户提供了自定义的类型转换器,也可以是其他符合类型的数组。
?集合: 在默认情况下,假定集合元素类型为String,并创建一个新的ArrayList封装所有的字符串。
?
二。基于 OGNL 的类型转换。
struts2 内建了 OGNl 表达式,可以方便的将我们在页面上输入的字符串数据转换成JavaBean中的Boolean,Float,Integer,Double,Long等数据类型,在无法转换成功时,还可以给出错误提示,非常方便
首先简历JavaBean:
?struts.xml (WEB-INF/classes下)
?信息展示页面:
?我们在资源文件中加入:
xwork.default.invalid.fieldvalue={0}类型转换错误,运行index.jsp.,在三个输入框中都输入admin,则会出现以下提示:
user.password字段类型转换失败
birth字段类型转换失败
在资源文件中定义的是全局转换错误提示的内容,如果想对具体Action中的字段进行提示,则编写ActionName.properties,本文中对应的就是LoginAction.properties,放在和Action同一个目录下,内容格式如下:invalid.fieldvalue.birth (其中birth为action中属性名)
本文LoginAction.properties内容为:invalid.fieldvalue.birth=生日必须为数字:
再次运行index.jsp.结果如下:
user.password字段类型转换失败
生日必须位数字?
注意:
??? 1. 因为 Struts2 是需要直接创建一个复合类(user 类)的实例,所以必须有无参数构造器。
?? 2. 如果希望使用 user.name 请求参数的形式为 Action 实例的 user 属性的 name 属性赋值,则必须 user类中 提供 setName() 方法;Action 提供 setUser() 方法。
?
?
更极端的情况,我们甚至可以直接生成 Collection (List.....) 或者 Map 实例
?
1.map
?2.List
?? 把上面的 MyAction 总的 users 属性改成 List<User> ,我们就可以通过索引来指定请求参数转换成 List 的哪个元素。
jsp如下:
?三。自定义类型转换器。
?
????? 如果用户输入一个 "abc,xyz" 字符串,我们需要将其转换成一个 User 类型的实力,其中 abc 为 User 实例的 name 属性,xyz 为 User 实例的 pass 属性。
??
配置有2种
1.局部类型转换器
ActionName-conversion.properties: ActionName 是需要转换生效的 Action 的类名,后面-conversion.properties 字符串是固定部分
?
上面内容对应的是 LoginAction-conversion.properties,内容是 user=lee.UserConverter
?
LoginAction-conversion.properties 文件应该与 LoginAction.class 放在相同位置。
?
?
2.全局类型转换器
?
?
五。数组属性的类型转换器
?对于前面的事例,一直只处理字符串数组的第一个元素。
如果页面上包含 2 个用户信息请求参数,名称都是 user,这 2 个请求参数必须通过 getParameterValues() 方法来获取,此时 user 请求参数必须是数组类型,或者 List 类型,如下:
??本例完全可以替代 四。 中的例子,因为本例不仅处理了单一请求参数;也处理了多个请求参数
?
?
六。集合属性的类型转换器
五。中的例子,可以把 users 改为 List类型
以上例子 List 必须用泛型
?
七。集合类型转换的高级特性
六。中的例子,List 必须用 泛型,下面不使用泛型:
??
为了让系统的类型转换起作用,2 种方法:
1. 使用泛型来限制集合元素的类型
2. 使用 Struts 2 的配置文件:使用局部类型转换的配置文件来指定集合元素的数据类型。
?
List
LoginAction-conversion.properties
?
在 set 中指定索引属性
LoginAction-conversion.properties
转换成功!<br /><!-- 访问user集合属性里索引属性值为scott的元素的name属性-->用户1的用户名为:<s:property value="user('crazyit').name"/><br /><!-- 访问user集合属性里索引属性值为scott的元素的pass属性-->用户1的密码为:<s:property value="user('crazyit').pass"/><br /><!-- 访问user集合属性里索引属性值为abc的元素的name属性-->用户2的用户名为:<s:property value="user('abc').name"/><br /><!-- 访问user集合属性里索引属性值为abc的元素的pass属性-->用户2的密码为:<s:property value="user('abc').pass"/><br />生日为:<s:property value="birth"/><br />?直接方法 set 元素:集合属性('索引属性值'),上面实例 2 个 user 实例的 name 属性分别是 crazyit 和 abc。
注意: Set 元素用的是() 。数组,list,map 用 []
?
?
?
?
?