一,概述
struts2中默认会对1995-07-08这种日期类型的数据进行类型转换,转换为Date类型,但是有时用户在jsp页面提交表单时提交的是19950708、1995年07月08日这种类型的话,那么就会转换出错。解决方法当然就是自定义类型转换器了。
二,自定义局部类型转换器
1)注册页面提交数据
<form action="${pageContext.request.contextPath }/user_register" method="post">
用户名:<input type="text" name="user.username"/><br/>
密码:<input type="password" name="user.pwd"/><br/>
年龄:<input type="text" name="user.age"/><br/>
生日<input type="text" name="user.birth"/><br/>
<input type="submit" value="注册"/><br/>
</form>
2)对应的JavaBean
package com.bighuan.d_type;
import java.util.Date;
public class User {
private String username;
private String pwd;
private int age;
private Date birth;
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
3)acting类
package com.bighuan.d_type;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String register(){
System.out.println(user.getUsername());
System.out.println(user.getPwd());
System.out.println(user.getAge());
System.out.println(user.getBirth());
return SUCCESS;
}
}
4)配置action,使用的是全局配置,注册成功跳转到index.jsp.
<package name="type" extends="struts-default">
<global-results>
<result name="success">/index.jsp</result>
</global-results>
<action name="user_*" class="com.bighuan.d_type.UserAction"
method="{1}">
</action>
</package>
5)自定义转换器类,要继承StrutsTypeConverter类.
package com.bighuan.d_type;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import org.omg.CORBA.StructMemberHelper;
/**
* 自定义类型转换器
* @author bighuan
*
*/
public class MyConverter extends StrutsTypeConverter {
// 新需求: 要求项目中要支持的格式,如: yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日..
// 先定义项目中支持的转换的格式
DateFormat[] df = { new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyyMMdd"),
new SimpleDateFormat("yyyy年MM月dd日") };
/**
* 把String转换为指定的类型 【String To Date】
*
* @param context
* 当前上下文环境
* @param values
* jsp表单提交的字符串的值
* @param toClass
* 要转换为的目标类型
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
// 判断: 内容不能为空
if(values.length== 0 || values == null){
return null;
}
// 判断类型必须为Date
if(Date.class != toClass){
return null;
}
// 迭代:转换失败继续下一个格式的转换; 转换成功就直接返回
for (int i=0; i<df.length; i++) {
try {
return df[i].parse(values[0]);
} catch (Exception e) {
continue;
}
}
return null;
}
@Override
public String convertToString(Map arg0, Object arg1) {
// TODO Auto-generated method stub
return null;
}
}
6)配置局部转换器,命名格式为:Action名称-conversion.properties.Action就是为那个Action类准备转换器的那个Action的名字.当前转换器的名字为UserAction-conversion.properties,
里面的内容为:
user.birth=com.bighuan.d_type.MyConverter
需要注意的是,转换器必须和目标转换器类(UserAction)在同一个包下,转换器的命名格式是有一定规则的,必须是Action名称-conversion.properties.
三,自定义全局类型转换器
1)上面那种方式只对UserAction有效,如果其他的Action也要进行类型转换的话,还要写过一个局部类型转换器.但是使用全局类型转换器就只要配置一个即可.
2)在src目录下,新建一个xwork-conversion.properties,名称固定哦,就是这个名字.properties文件内容为:
java.util.Date=com.bighuan.d_type.MyConverter
这样一个全局类型转换器就完成了.