Struts的类型转换器(在此以日期类型转换器为例)
一、类型转换器
1、Struts中jsp提交的数据(均为Stringl类型),struts会自动转换为action中属性的对应类型;(这一点优于Servlet,Servlet需要手动转换)。
2、对于基本数据类型以及日期类型会自动转换。
3、日期类型只支持yyyy-MM-dd格式。如果是其他格式,需要自定义类型转换器。
二、类型转换器分类
1、局部类型转换器
2、全局类型转换器
三、Struts转换器的API
|–TypeConverter 转换器接口
|—–DefaultTypeConverter 默认类型转换器类
|——–StrutsTypeConverter 用户编写的转换器类,需要继承此类
四、局部类型转换器类
1、局部类型转换器开发步骤:
1)写转换器类
package sram.type;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
/**
* 在项目开发中,该类应位于util包下
*/
//1.继承StrutsTyptConverter
public class MyConverter extends StrutsTypeConverter{
//2.实现StrutsTypeConverter抽象类中的所有方法
/**
* 2.1把String转为指定类型【String To Date】
* @param context 当前的上下文环境
* @param values jsp表单提交的字符串的值
* @param toClass 要转换为的目标类型
*/
public Object convertFromString(Map context, String[] values, Class toClass) {
try {
//判断1:内容不能为空
if(values==null||values.length==0){
return null;
}
//判断2:类型必须为Date
if(Date.class!=toClass){
return null;
}
//转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
return sdf.parse(values[0]);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
public String convertToString(Map arg0, Object arg1) {
return null;
}
}
2)配置转换器类(告诉Struts应用自己的转换器类)
a)在同包的action目录下,新建一个properties文件。
b)命名规则:ActionClassName-conversion.properties
举例:sram.type包下创建UserAction-conversion.properties
3)内容
user.birthday=转换器类全路径(sram.type.MyConverter)
2、总结:转换器能否给其他Action使用?
不能,这里的转换器指的是转换器类(MyConverter)+配置文件(UserAction-conversion.properties),所以不能给其他Action使用,而转换器类(MyConverter)是通用的。
五、全局类型转换器:需要写一个转换器,给所有的Action用!
1、全局类型转换器开发步骤:
1)配置全局类型转换器:src/xwork-conversion.properties
2)内容:
要转换的类型的全名(java.util.Date)=类型转换器类(sram.type.MyConverter)
六、总结:当项目中同时存在局部类型转换器与全局类型转换器的时候,优先执行局部类型转换器(就近原则)。
七、经典案例:
package sram.type;
import java.sql.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
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日"),
};
public Object convertFromString(Map context, String[] values, Class toClass) {
//判断1:内容不能为空
if(values==null||values.length==0){
return null;
}
//判断2:类型必须为Date
if(Date.class!=toClass){
return null;
}
//迭代:转换失败继续下一个格式的转换;转换成功就直接返回
for(int i=0;i<df.length;i++){
try {
//转换
return df[i].parse(values[0]);
} catch (ParseException e) {
continue;
}
}
return null;
}
public String convertToString(Map arg0, Object arg1) {
return null;
}
}