Action参数封装过程中,数据类型转换问题

来源:互联网 发布:春英广场舞网络一线牵 编辑:程序博客网 时间:2024/05/29 09:13

struts接收表单的参数可参见:http://blog.csdn.net/flysun3344/article/details/54176019

下面为参数封装过程中,数据类型的转换问题:

1、 struts2 内部提供大量类型转换器,用来完成数据类型转换问题 

boolean 和 Boolean
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和 Double
Date 可以接收 yyyy-MM-dd格式字符串
数组  可以将多个同名参数,转换到数组中
集合  支持将数据保存到 List 或者 Map 集合

案例: 输入合法年龄和生日可以自动转换
customer.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!-- 引入struts2 标签库 -->    <%@taglib uri="/struts-tags" prefix="s"%>    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><h1>添加一个客户信息</h1><s:fielderror /> <!-- 查看fieldError错误信息 --><form action="${pageContext.request.contextPath }/customer.action" method="post">客户姓名 <input type="text" name="username" /> <br/>年龄 <input type="text" name="age" /> <br/>生日 <input type="text" name="birthday" /> <br/><input type="submit" value="提交" /></form></body></html>
Action:
public class CustomerAction extends ActionSupport {private String username;private int age; // 内建转换器private Date birthday; // yyyy-MM-dd 可以自动转换public void setUsername(String username) {        this.username = username;    }    public void setAge(int age) {        this.age = age;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }@Overridepublic String execute() throws Exception {System.out.println("客户姓名:" + username);System.out.println("年龄: " + age);System.out.println("生日:" + birthday);return NONE;}}
配置:
<action name="customer" class="fly.sun.demo.CustomerAction"><result name="input">/demo/customer.jsp</result></action>
当输入abc 转换为 int类型 age时 
Caused by: java.lang.NoSuchMethodException: fly.sun.demo.CustomerAction.setAge([Ljava.lang.String;
分析: 输入20 ,转换 int类型20  --- setAge(int) 
     输入abc,转换int 出错 ---- setAge(String) ----- 报错方法不存在异常

2、 自定义类型转换器 (了解)

1) 自定义类型转换器 
第一种 实现TypeConverter接口 
convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object target, java.lang.reflect.Member member, java.lang.String propertyName, java.lang.Object value, java.lang.Class toType) 
第二种 继承 DefaultTypeConverter
convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object value, java.lang.Class toType) 
第三种 继承 StrutsTypeConverter
convertFromString(java.util.Map context, java.lang.String[] values, java.lang.Class toClass)  --- 请求封装
convertToString(java.util.Map context, java.lang.Object o)   --- 数据回显 

* 类型转换器 一直都是双向转换 
页面提交请求参数,封装到model --- 需要转换
model数据 需要在页面 回显  ---- 需要转换 
2) 以 1990/10/10 为例,自定义日期转换器,完成转换
public class MyDateConverter extends DefaultTypeConverter {// 覆盖convertValue@Override/** * context 上下文对象 * value 转换前的值 * toType 转换目标类型 */public Object convertValue(Map<String, Object> context, Object value,Class toType) {// 根据toType判断 是请求封装 还是 数据回显DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");System.out.println("自定义转换器 执行了...");if (toType == Date.class) {// 请求参数封装 (value是字符串)String[] params = (String[]) value;String strVal = params[0]; // 转换为 日期类型try {return dateFormat.parse(strVal);} catch (ParseException e) {e.printStackTrace();// 在类型转换过程中如果发生错误,通知struts2框架throw new RuntimeException(e);}} else {// 回显(value是 Date)Date date = (Date) value;return dateFormat.format(date);}}}
3) 注册类型转换器 
局部注册 : 只对当前Action有效 (针对属性) ,在Action类所在包 创建 Action类名-conversion.properties , 格式 : 属性名称=类型转换器的全类名 .
eg:

内容为:birthday = fly.sun.demo.MyDateConverter

全局注册 : 针对所有Action的日期类型有效 (针对类型 ),在src下创建 xwork-conversion.properties ,格式 : 待转换的类型=类型转换器的全类名.
eg:

内容为:java.util.Date = fly.sun.demo.MyDateConverter

3、 类型转换中错误处理 

通过分析拦截器作用,得知当类型转换出错时,自动跳转input视图 ,在input视图页面中 <s:fieldError/> 显示错误信息。但是显示的是英文。可以在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 : invalid.fieldvalue.属性名= 错误信息。
eg:invalid.fieldvalue.birthday=******



原创粉丝点击