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)
2、继承DefaultTypeConverter类,覆写
convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object value, java.lang.Class toType)
3、继承StrutsTypeConverter,覆写
//请求封装
convertFromString(java.util.Map context, java.lang.String[] values, java.lang.Class toClass)
//数据回显
convertToString(java.util.Map context, java.lang.Object o)
类型转换是双向,请求<--->回显,一继承DefaultTypeConverter类为例,写一个日期类型的转换器
jsp
<form action="${pageContext.request.contextPath }/demo05/param6.action" method="post">
日期<input type="text" name="date" /><br/>
<input type="submit" value="提交" />
</form>
action
public class ParamAction6 extends ActionSupport {
private Date date;
@Override
public String execute() throws Exception {
System.out.println(date);
return NONE;
}
public Date getDate() {
return this.date;
}
public void setDate(Date date) {
this.date = date;
}
}
转换器
public class DateConvert extends DefaultTypeConverter {
@Override
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 请求参数封装
if (Date.class == toType) {
String[] val = (String[]) value;
String dateVal = val[0];
try {
return dateFormat.parse(dateVal);
} catch (ParseException e) {
e.printStackTrace();
}
} else {
// 回显数据封装
Date date = (Date) value;
return dateFormat.format(date);
}
return null;
}
}
struts配置
<action name="param6" class="demo05.ParamAction6"> </action>
注册转换器
1、局部注册,针对特定属性,在action所在包装件“ParamAction6-conversion.properties”文件,“Action类名+-conversion.properties”,内容为
date = demo05.DateConvert
date为Action中的属性名,转换器只在本Action有效
2、全局注册,针对特定类型,在src下创建“xwork-conversion.properties”,内容为
java.util.Date = demo05.DateConvert
这种方式针对所有java.util.Date类型都有效
类型转换中的错误处理流程
在Action中抛出异常
public class DateConvert extends DefaultTypeConverter {
@Override
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 请求参数封装
if (Date.class == toType) {
String[] val = (String[]) value;
String dateVal = val[0];
try {
return dateFormat.parse(dateVal);
} catch (ParseException e) {
throw new RuntimeException(e);
}
} else {
// 回显数据封装
Date date = (Date) value;
return dateFormat.format(date);
}
}
}
jsp
<%@ taglib uri="/struts-tags" prefix="s"%>
<s:fielderror></s:fielderror>
<form action="${pageContext.request.contextPath }/demo05/param6.action" method="post">
日期<input type="text" name="date" /><br/>
<input type="submit" value="提交" />
</form>
配置
<action name="param6" class="demo05.ParamAction6">
<result name="input">/demo05/params.jsp</result>
</action>
这是页面出现的错误信息为英文,通过设置properties文件,将错误信息转换为中文,创建“ParamAction6.properties”,Action类名.properties,内容为invalid.fieldvalue.属性名= 错误信息
invalid.fieldvalue.date =格式为年-月-日
properties中不能有中文需要转码