Struts2的类型转换
来源:互联网 发布:切图都有哪些软件 编辑:程序博客网 时间:2024/04/27 17:58
如果类型转换中出现未知异常,Struts2的conversionError拦截器会自动处理该异常并在页面上生成提示信息)
内建的类型转换器: (struts2已经内建了字符串和如下类型之间相互转换的转换器)
>boolean和Boolean
>char和Character
>inthe和Integer
>long和Long
>float和Float
>double和Double
>Date (日期格式使用用户请求所在Local的SHORT格式)
>数组 (默认情况下,数组元素是字符串,如果用户提供了自定义类型转换器,也可是其他复合类型的数组)
(按照元素类型单独转换每一个元素,但如果数组元素的类型本身无法完成转换,将出现类型转换错误)
>集合 (默认情况下,假定集合元素类型为String,并创建一个新的ArrayList封装所有的字符串)
基于OGNL的类型转换: (Struts2允许以另一种简单方式将请求参数转换为复合类型)
public class User{private String name;private String pass;//name和pass属性的setter和getter方法...}public class LoginAction implements Action{private User user;//user的setter和getter方法public String execute()throws Exception{ ...}}
<s:form action="login"><!-- 该表单域封装的请求参数名为user.name --><s:textfield name="user.name" label="用户名"/><!-- 该表单域封装的请求参数名为user.pass --><s:textfield name="user.pass" label="密码"/>...</s:form>
注意:
>因为Struts2将通过反射来创建一个复合类(User类)的实例,因此必须为该User类提供无参数构造器
>如果使用user.name的形式为Action实例的user的name属性赋值,则必须为user的name属性提供setter方法
public class LoginAction implements Action{private Map<String , User> users;//users属性的setter和getter方法 public String execute()throwss Exception { ... } }
<s:form action="login"> <s:textfield name="users['one'].name" label="第one个用户名"/> ... </s:form>
指定集合元素类型: (对于集合如果不指定泛型,必须通过局部类型转换文件指定集合类型)
public class LoginAction implements Action{private List users;//(没有指定泛型,必须通过局部类型转换文件指定)//users属性的setter和getter方法public String execute()throws Exception{ ...}}
Element_users=org.wang.app.action.User (局部类型文件放在与Action类相同位置)
局部类型转换文件名为: ActionName-conversion.properties (ActionName为类名,-conversion.properties为固定部分)
List:
局部类型文件格式: Element_ListPropName=ElementType (Element是固定的)
Map:
局部类型转换文件格式:Key_MapPropName=KeyType (Key是固定的)
Element_MapPropName=ValueType (Element是固定的)
自定义类型转换器:
提供类型转换器:
1. (通常需要继承DefaultTypeConverter重写convertValue方法)
public class UserConverter extends DefaultTypeConverter {//类型转换器必须重写convertValue方法,该方法需要完成双向转换public Object convertValue(Map context, Object value, Class toType){//当需要将字符串向User类型转换时if (toType == User.class ){ ...}else if(toType == String.class){...}return null}}
convertValue方法参数和返回值意义:
>第一个参数:context是类型转换环境的上下文
>第二个参数:value是需要转换的参数,随着转换方向的不同而不同
>第三个参数:toType是转换后的类型
(convertValue接收需要转换的值,需要转换的目标类型为参数,然后返回转换后的目标值)
2. (通过继承StrutsTypeConverter抽象类,该类是DefaultTypeConverter的子类convertValue分解为两个方法,更简单)
public class UserConverter extends StrutsTypeConverter {//实现将字符串类型转换成复合类型的方法public Object convertFromString(Map context, String[] values , Class toClass){//创建一个User实例...return user;}//实现将复合类型转换成字符串类型的方法public String convertToString(Map context, Object o){//将需要转换的值强制类型转换为User实例...return "<" + user.getName() + ","+ user.getPass() + ">";}}
方法参数与返回值与上边相同
注册类型转换器: (必须将类型转换器注册在Web应用中,Struts2框架才可以正常使用该类型转换器)
1.局部类型转换器: (使用局部类型转换文件指定,局部类型转换文件命名为ActionName-conversion.properties,与Action在相同位置
只对属性转换一次)
propName=ConverterClass
例: user=org.wang.app.converter.UserConverter
2.全局类型转换器: (不是对指定Action的指定属性起作用,而是对指定类型起作用,转换文件为xwork-conversion.properties,放在类加载路径下即可
如果一个Action是数组或集合,有几个元素就转换几次)
propType=ConverterClass
例:org.wang.app.domain.User=org.wang.app.converter.UserConverter
处理Set集合: (由于Set集合的无序性,Struts2无法准确读取Set集合里的元素,除非Set集合里的元素有一个标识属性)
public class LoginAction extends ActionSupport{private Set users;private Date birth;//user属性的setter和getter方法//birth属性的setter和getter方法...}public class UserConverter extends StrutsTypeConverter {public Object convertFromString(Map context, String[] values, Class toClass){Set result = new HashSet(); ..... return result;}public String convertToString(Map context, Object o){//如果待转换对象的类型是Set...}}public class User{private String name;private String pass;//name属性的setter和getter方法//pass属性的setter和getter方法...public boolean equals(Object obj){...(标识属性为name)}//根据name属性来计算hashCode。public int hashCode(){...}}
LoginAction-convertion.properties: (该文件与LoginAction在同一路径下)
#指定users属性的类型转换器是UserConverter
users=org.crazyit.app.converter.UserConverter
#指定users集合属性里集合元素的索引属性是name
KeyProperty_users=name
<!-- 访问user集合属性里索引属性值为crazyit.org的元素的name属性-->(Set集合用的是圆括号,数组、List、Map用的是方括号)
用户crazyit.org的用户名为:<s:property value="users('crazyit.org').name"/><br/>
<!-- 访问user集合属性里索引属性值为crazyit.org的元素的pass属性-->
用户crazyit.org的密码为:<s:property value="users('crazyit.org').pass"/><br/>
通过局部类型转换文件来指定Set集合元素的标识属性:
keyProperty_SetPropName=keyPropName
类型转换中的错误处理:(当Struts2的类型转换器出现错误,conversionError拦截器负责将对应错误封装成表单域错误(FieldError),并将错误信息放入ActionContext中)
(当conversionError拦截器对转换异常处理后,系统会跳转到名为input的逻辑视图)
(为了让Struts框架处理类型转换的错误,以及使用数据校验机制,Action类应该继承ActionSupport,该类为类型转换和数据校验做了许多工作)
处理类型转换错误:
public class LoginActionextends ActionSupport{private User user;private String tip;//user属性的setter和getter方法//tip属性的setter和getter方法...//execute方法}
<constant name="struts.custom.i18n.resources" value="mess"/><package name="lee" extends="struts-default"><action name="login" class="org.crazyit.app.action.LoginAction"><!-- 配置名为input的逻辑视图,当转换失败后转入该逻辑视图 --><result name="input">/input.jsp</result><result name="success">/welcome.jsp</result><result name="error">/welcome.jsp</result></action></package>
显示错误提示信息:
如果转换错误会进入input.jsp页面,默认<s:fielderror/>标签会输出Invalid field value for field xxx的错误提示信息,其中xxx是Action中属性名
要改变错误提示信息,只需在国际化资源文件中增加如下一行:
xwork.default.invalid.fieldvalue={0}字段类型转换失败!
对特定字段指定特别提示信息: (可通过在Action局部资源文件中增加如下一行)
invalid.fieldvalue.propName=tipMsg (此处propName可支持OGNL表达式)
例: (改变birth属性类型转换失败提示信息)
public class LoginAction extends ActionSupport{private User user//user的setter和getter方法...}
LoginAction_zh_CN.properties: (局部资源文件,与Action相同路径下)
invalid.fieldvalue.user.birth=生日必须满足yyyy-MM-dd格式
处理集合属性的转换错误:
public class LoginAction extends ActionSupport{private List<User> users;//users属性的setter和getter方法...}
有两种方式传入请求参数:
>只传入一个users请求参数,该请求参数是字符串数组形式
>分别传入多个uses[1],users[1]...,这种形式将会充分利用OGNL表达式类型转换规则
<s:form action="login"><s:iterator value="{0, 1, 2}" status="stat"><!-- 将会依次生成多个请求参数 --><s:textfield name="users[%{#stat.index}]" label="第%{#stat.index}个用户信息"/></s:iterator><tr><td colspan="2"><s:submit value="转换" theme="simple"/><s:reset value="重填" theme="simple"/></td></tr></s:form>
- 【Struts2】:Struts2的类型转换
- Struts2的类型转换
- struts2的类型转换
- struts2的类型转换
- Struts2的类型转换
- Struts2的类型转换
- struts2 的类型转换
- struts2的类型转换
- struts2的类型转换
- Struts2的类型转换
- Struts2 的类型转换
- Struts2的类型转换
- Struts2的类型转换
- Struts2的类型转换
- struts2的类型转换
- Struts2的类型转换(0):Struts2的类型转换入门
- 关于struts2的类型转换
- struts2 业务类型的转换
- php多输出换行\n
- 关于Android的目录结构
- Cocos2d-x 打包成APK中文显示乱码
- SVN服务器搭建和使用(一)
- WinForm中双击dataGridView的一行将其显示到另一个窗体的控件中
- Struts2的类型转换
- windows下 perl离线安装 模块
- iOS成功应用的8大法则
- jPlayer插件使用心得 2014/7/3
- SVN服务器搭建和使用(二)
- 如何才是一名优秀的好员工
- sum over用法,以及与group by的区别
- 传智播客C/C++学员荣膺微软&Cocos 2d-x黑客松最佳创新奖
- git忽略文件和文件夹,忽略权限改动