页面所提交过来的数据都是字符串的类型,而model里面的数据类型并不都是字符串,有各种各样的类型int ,Integer,float,String,date…,我们使用servlet来接收数据时都是自己手动转换,struts2可以为我们自动转换,转换的前提是前台提交的字符串和model中的相应的数据类型可以转换。
提交表单时:字符串-------à其他类型
页面展示:其他类型--------à字符串
表单提交时数据类的转换struts给我做了绝大多数,但是时间类型往往需要根据我们自己的需求来转换的。
转换时间类型的过程 :
1.自定义类型转换器继承StrutsTypeConverter做日期转换器
package cn.tx.converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class MyDateConverter extends StrutsTypeConverter {
/**
* 将字符串转换成指定类型(时间类型)
*/
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
Date date = null;
//如果字符串数组不为null并且数组的长度大于0
if(arg1 != null && arg1.length > 0){
//如果要转换的类是Date类就进入
if(arg2 == Date.class){
try {
//将数组中传入的第一个字符串转换成时间类型
date = new SimpleDateFormat("yyyy/MM/dd").parse(arg1[0]);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return date;
}
/**
* 将指定类型(时间类型)转换成字符串类型
*/
@Override
public String convertToString(Map arg0, Object arg1) {
//将Date类型转换成String类型
String dateStr = null;
/*
* 如果欲转换的对象不为空。并且类别是Date类,那就开始转换
*/
if(arg1 != null && arg1.getClass() == Date.class){
dateStr = new SimpleDateFormat("yyyy/MM/dd").format((Date)arg1);
}
return dateStr;
}
}
2.注册日期类型转换器
写好了转换器,还需要注册1.局部注册:
在model类同级包下简历一个属性文件:
文件名字命名规范:
[model类名]-conversion.properties
例如:
模型的类名是PersonModel.java
属性文件名字应该是:PeresonModel-conversion.properties
属性文件中内容:
key:欲转换的属性名,
value:转换器的类的全路径
例如:
birthday=cn.tx.converter.MyDateConverter
2.全局注册:
有时候想要转换的类型很多,不可能写很多的注册文件,这样工作太繁琐了。
这时候,可以选择全局注册
在classpath路径下新建一个文件:
xwork-conversion.properties
文件内容:
java.util.Date=cn.tx.converter.MyDateConverter
3.如何把错误提示信息转换成中文提示:
在Action包下新建一个文件:
1. 在Action类的同级包下创建一个属性文件, 规则:和Action类同名.properties
2. Key: invalid.fieldvlaue.[要转换的表单中文本域的name:birthday],value是中文的提示信息,中文在properties文件中以Unicode的编码的方式