在Struts 1.x中提供了一个类型转换器的功能。
例如:声明一个boolean类型的属性,当把这个属性的值设为Yes,1,on或Y等等时Struts 会把它自动的转换成True类型。
但有些类型Struts 却无法转换。
例如Date 类型的转换:
* 如果是java.sql.Date ,页面日期格式必须为yyyy-mm-dd,才可以转换
* 如果是java.util.Date ,默认情况下Struts 无法转换。
解决办法是我们可以设计一个自定义类型转换器。
自定义类型转换器的实现步骤:
1.实现Struts 的converter接口,并实现其convert方法。
package com.yx.zzg.struts ; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date ; import org.apache.commons.beanutils.Converter; /** * java.util.Date 类型转换器 * @author Administrator * */ public class UtilDateConverter implements Converter { public Object convert(Class type, Object value) { System.out.println("UtilDateConverter.value=" + value); if (value == null) { return value; } if (value instanceof Date ) { return value; } Date d = null; if (value instanceof String) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { d = sdf.parse((String)value); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return d; } }
package com.yx.zzg.struts; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.beanutils.Converter; /** * java.util.Date类型转换器 * @author Administrator * */ public class UtilDateConverter implements Converter { public Object convert(Class type, Object value) { System.out.println("UtilDateConverter.value=" + value); if (value == null) { return value; } if (value instanceof Date) { return value; } Date d = null; if (value instanceof String) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { d = sdf.parse((String)value); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return d; } }
2.注册自定义的类型转换器,即把我们自定义的类型转换器注册到Struts 的类型转换器中。
通常有两种方式类实现注册。
第一种方法采用Servlet的方式:
1.首先定义一个Servlet,并覆写他的init方法
package com.yx.zzg.struts ; import java.util.Date ; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.apache.commons.beanutils.ConvertUtils; /** * 注册java.util.date 转换器 * @author Administrator * */ public class UtilDateConverterInitWithServlet extends HttpServlet { @Override public void init() throws ServletException { System.out.println("UtilDateConverterInitWithServlet.init()"); //注册自定义类型转换器 ConvertUtils.register(new UtilDateConverter(), Date .class); } }
package com.yx.zzg.struts; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.apache.commons.beanutils.ConvertUtils; /** * 注册java.util.date转换器 * @author Administrator * */ public class UtilDateConverterInitWithServlet extends HttpServlet { @Override public void init() throws ServletException { System.out.println("UtilDateConverterInitWithServlet.init()"); //注册自定义类型转换器 ConvertUtils.register(new UtilDateConverter(), Date.class); } }
2.然后配置web.xml文件便完成了注册。
<servlet>
<servlet-name>UtilDateConverterInitWithServlet</servlet-name>
<servlet-class>com.yx.zzg.struts
.UtilDateConverterInitWithServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
第二种方式采用Struts 本身提供的plugin的方式
1.首先定义一个类并实现PlugIn接口,并且实现其方法。
package com.yx.zzg.struts ; import java.util.Date ; import javax.servlet.ServletException; import org.apache.commons.beanutils.ConvertUtils; import org.apache.struts .action.ActionServlet; import org.apache.struts .action.PlugIn; import org.apache.struts .config.ModuleConfig; public class UtilDateConverterInitWithPlugin implements PlugIn { public void destroy() { } public void init(ActionServlet servlet, ModuleConfig config) throws ServletException { System.out.println("UtilDateConverterInitWithPlugin.init()"); ConvertUtils.register(new UtilDateConverter(), Date .class); } }
2.然后配置struts -config.xml文件便完成了注册
<plug-in className="com.yx.zzg.struts
.UtilDateConverterInitWithPlugin"/>
<plug-in className="com.yx.zzg.struts
.UtilDateConverterInitWithPlugin"/>