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

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;
    }
	
	@Override
	public 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=******



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值