首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts 1 自定義類型轉換器:解決 java.util.Date 綁定失敗的兩種註冊方式

     編輯:Java 相關知識

問題現場

表單提交 java.util.Date 字段時,Struts 1 內置轉換器不支持,報錯:

java.lang.IllegalArgumentException: Cannot invoke ...setUtilDate - argument type mismatch

解決方案:實現 Converter 接口

public class UtilDateConverter implements Converter {
  public Object convert(Class type, Object value) {
    if (value instanceof Date) {
      return value;
    }
    if (value instanceof String) {
      try {
        return new SimpleDateFormat("yyyy-MM-dd").parse((String) value);
      } catch (ParseException e) {
        e.printStackTrace();
      }
    }
    return null;
  }
}
  • 支持 String → Date 解析(格式 yyyy-MM-dd)。
  • 已是 Date 直接返回。
  • 異常捕獲避免中斷流程,返回 null 由驗證層處理。

註冊方式一:Servlet 初始化(傳統)

Converter 類

同上,實現 org.apache.commons.beanutils.Converter。

Servlet 類

public class UtilServlet extends HttpServlet {
  public void init() throws ServletException {
    ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
  }
}

web.xml 配置

<servlet>
  <servlet-name>UtilServlet</servlet-name>
  <servlet-class>com.tgb.struts1.UtilServlet</servlet-class>
  <load-on-startup>10</load-on-startup>  <!-- 關鍵:Tomcat 啟動時加載註冊 -->
</servlet>
  • load-on-startup > 0 確保在 Struts 初始化前完成轉換器註冊。
  • 依賴 commons-beanutils 包。

註冊方式二:Struts PlugIn(推薦,更集成)

PlugIn 實現

public class UtilDateConverterPlugin implements PlugIn {
  public void init(ActionServlet servlet, ModuleConfig config) throws ServletException {
    ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
  }
  public void destroy() { }
}

struts-config.xml 配置

<plug-in className="com.tgb.struts1.UtilDateConverterPlugin" />
  • Struts 啟動時自動調用 init(),無需額外 Servlet 配置。
  • 屬於 Struts 生命週期一體,模塊化部署友好。

測試驗證

JSP 表單提交 java.util.Date 字段:

<input type="text" name="utilDate" />

兩種方式均可正常綁定,ActionForm 中 setUtilDate(Date) 正確接收解析後的 Date 對象。

原理深度:面向抽象編程的可擴展性

Struts 1 利用 Commons BeanUtils.ConvertUtils 作為統一類型轉換註冊中心:

  1. 框架定義 Converter 接口(策略模式)。
  2. 內置基本類型轉換器(String、Integer、Boolean...)。
  3. 開發者實現自定義 Converter,註冊到 ConvertUtils。
  4. BeanUtils.populate() 填充表單時自動查找並調用對應轉換器。

這體現了 開閉原則:對擴展開放(新增 Converter),對修改關閉(不動框架代碼)。

擴展建議

  • 多格式支持:SimpleDateFormat 改為多模式嘗試(yyyy-MM-dd、yyyy/MM/dd、MM/dd/yyyy)。
  • 線程安全:SimpleDateFormat 非線程安全,改用 ThreadLocal 或 DateTimeFormatter (Java 8+)。
  • 泛型 Converter:針對 LocalDate、LocalDateTime、BigDecimal 等常用類型批量註冊。
  • 錯誤處理增強:解析失敗拋出自定義異常,配合 Struts 驗證框架顯示友好錯誤消息。

總結

Struts 1 缺失 java.util.Date 轉換器是常見坑點。通過實現 Converter 接口並選擇 Servlet init() 或 PlugIn 兩種方式之一註冊到 ConvertUtils,即可完美解決。PlugIn 方式更符合 Struts 架構,推薦生產環境使用。此過程生動展示了策略模式與開閉原則在框架擴展點中的實戰應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved