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>
結果

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" />
測試結果

總 結
在此體會到面向抽象編程所帶來的可擴展的好處,這篇博客中的兩個自定義的轉換器過程基本一致 :實現接口寫出轉換器、更改配置文件保證可以在Tomat加載即注冊。