层层递进Struts1(六)自定义转换器

时间:2023-03-09 00:16:13
层层递进Struts1(六)自定义转换器

Struts提供的类型转换有限,如果我们强行使用没有的类型转换,则会出现错误,以Date类型为例:

org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet action threw exception java.lang.IllegalArgumentException: Cannot invoke com.tgb.struts1.TypeCovertActionForm.setUtilDate - argument type mismatch

在此我们来建立java.util.Date的转换器。

Servlet版

Converter

数据转换器,代码如下:

package com.tgb.struts1;

import java.text.SimpleDateFormat;
import java.util.Date; import org.apache.commons.beanutils.ConversionException; import com.sun.org.apache.commons.beanutils.Converter; public class UtilDateConverter implements org.apache.commons.beanutils.Converter { public Object convert(Class type, Object value) { if (value instanceof Date) {
return (value);
}
Date date=null;
if (value instanceof String) {
try {
date=new SimpleDateFormat("yyy-MM-dd").parse((String)value);
} catch (Exception e) {
e.printStackTrace();
}
}
return date;
}
}

Servlet

为的是将上面的转换器注册到ConvertUtils中:

package com.tgb.struts1;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import org.apache.commons.beanutils.ConvertUtils; public class UtilServlet extends HttpServlet { public void init()throws ServletException
{
ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
}
}

配置文件

在web.xml中添加配置,因为转换器在Tomcat启动之时就加载,所以此处要将load-on-startup设置为大于0的值:

<servlet>
<servlet-name>UtilServlet</servlet-name>
<servlet-class>com.tgb.struts1.UtilServlet</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>

测试

jsp

	<h4>测试struts的转换器</h4>
<form action="typeconvert.do" method="post" >
int value:<input type="text" name="intValue" /> <br/>
double value:<input type="text" name="doubleValue" /> <br/>
boolean value:<input type="text" name="booleanvVlue" /> <br/>
java.sql.date:<input type="text" name="sqlDate" /> <br/>
java.util.date:<input type="text" name="utilDate" /> <br/>
<input type="submit" value="提交" /> <br/>
</form>

结果

层层递进Struts1(六)自定义转换器

plugin版

plugin

package com.tgb.struts1;

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 UtilDateConverterPlugin implements PlugIn { public void destroy() {
// TODO Auto-generated method stub
}
public void init(ActionServlet servlet, ModuleConfig config)
throws ServletException {
ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
}
}

配置文件

在struts-config中放入:

<plug-in className="com.tgb.struts1.UtilDateConverterPlugin" />

测试结果

层层递进Struts1(六)自定义转换器

总结

在此体会到面向抽象编程所带来的可扩展的好处,这篇博客中的两个自定义的转换器过程基本一致:实现接口写出转换器、更改配置文件保证可以在Tomat加载即注册。

更多相关博客,请至《层层递进Struts1(八)之总结》