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 集合
案例: 输入合法年龄和生日可以自动转换
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数据 需要在页面 回显 ---- 需要转换
第一种 实现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=******