问题:
1)为什么需要自定义类型转化器?因为struts2不能自动完成字符串到引用类型的转换。
2)如何自定义类型转化器:
a.开发类型转化器的类:
扩展strutsTypeConverter类,也可以扩展com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类
b.配置类型转换器:
两种方式
Ⅰ.基于字段的配置:
在字段所在的action的包下,新建一个名为 类名-conversion.properties的文件。
在文件中输入: fieldName=类型转化器的全类名。
例:birth=com.atguigu.struts2.app.converters.DateConverter
注意:
第一次使用该类型转化器时创建实例。
此类型转换器是单实例的!
Ⅱ.基于类型的配置
在src下新建 xwork-conversion.properties
键入:待转换的类型=类型转换器的全类名
例:java.util.Date=com.atguigu.struts2.app.converters.DateConverter
注意:在当前struts2应用被加载时创建实例。
扩展com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类:
1)为什么需要自定义类型转化器?因为struts2不能自动完成字符串到引用类型的转换。
2)如何自定义类型转化器:
a.开发类型转化器的类:
扩展strutsTypeConverter类,也可以扩展com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类
b.配置类型转换器:
两种方式
Ⅰ.基于字段的配置:
在字段所在的action的包下,新建一个名为 类名-conversion.properties的文件。
在文件中输入: fieldName=类型转化器的全类名。
例:birth=com.atguigu.struts2.app.converters.DateConverter
注意:
第一次使用该类型转化器时创建实例。
此类型转换器是单实例的!
Ⅱ.基于类型的配置
在src下新建 xwork-conversion.properties
键入:待转换的类型=类型转换器的全类名
例:java.util.Date=com.atguigu.struts2.app.converters.DateConverter
注意:在当前struts2应用被加载时创建实例。
扩展strutsTypeConverter类:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.StrutsTypeConverter;
public class DateConverter extends StrutsTypeConverter {
private DateFormat dateFormat;
public DateConverter() {
System.out.println("DateConverter's constructor...");
}
public DateFormat getDateFormat(){
if(dateFormat == null){
//web.xml文件中<context-param>
//<param-name>pattern</param-name>
//<param-value>yyyy-MM-dd hh:mm:ss</param-value>
//</context-param>获取当前web 应用的初始化参数 pattern
ServletContext servletContext = ServletActionContext.getServletContext();
System.out.println(servletContext);
String pattern = servletContext.getInitParameter("pattern");
//因为基于类型的配置是在当前struts2应用被加载时创建实例,所以不能在类构造器中生成dateFormat 对象
dateFormat = new SimpleDateFormat(pattern);
}
return dateFormat;
}
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("convertFromString...");
if(toClass == Date.class){
if(values != null && values.length > 0){
String value = values[0];
try {
//因为基于类型的配置是在当前struts2应用被加载时创建实例。所以我们只有调用getDateFormat()来获取dateFormat 对象
return getDateFormat().parseObject(value);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return values;
}
@Override
public String convertToString(Map context, Object o) {
System.out.println("convertToString...");
if(o instanceof Date){
Date date = (Date) o;
return getDateFormat().format(date);
}
return null;
}
}
扩展com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
/**
* 日期类型转换器
* @author quezg
*
*/
public class DateConverter extends DefaultTypeConverter{
/*
* Map<String, Object> context
* Object value 参数值数组
* Class toType 目标类型Class对象
*/
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
//获取取到的参数值
String[] paramvalue=(String[])value;
String format=null;
if(paramvalue[0].indexOf("-")!=-1){
format = "yyyy-MM-dd";
}else if(paramvalue[0].indexOf("/")!=-1){
format = "yyyy/MM/dd";
}else if(paramvalue[0].length()==8){
format = "yyyyMMdd";
}
try {
if(toType==Date.class){
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.parse(paramvalue[0]);
}
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}