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中不能有中文需要转码