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加載即注冊。