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

Struts 2 轉換器(Converter)完整指南:類型轉換、批次封裝與錯誤處理

     編輯:Java 相關知識

為什麼需要轉換器?

Web 應用基於 HTTP 協定,瀏覽器與伺服器交換的皆為字串。但伺服器端領域物件屬性類型多樣(Date、Integer、自訂類型等),需自動雙向轉換:字串 → 物件(表單提交)與 物件 → 字串(頁面顯示)。Struts 2 的 Converter 機制正是解決此問題。

Hello World 範例:Locale 轉換器

1. Action 類別

package tutorial;
import java.util.Locale;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.LocalizedTextUtil;

public class HelloWorld extends ActionSupport {
    private String msg;
    private Locale loc = Locale.US;
    
    public String getMsg() { return msg; }
    public Locale getLoc() { return loc; }
    public void setLoc(Locale loc) { this.loc = loc; }
    
    @Override
    public String execute() {
        msg = LocalizedTextUtil.findDefaultText("HelloWorld", loc);
        return SUCCESS;
    }
}

2. struts.xml 配置

<package name="ConverterDemo" extends="struts-default">
  <action name="HelloWorld" class="tutorial.HelloWorld">
    <result>/HelloWorld.jsp</result>
  </action>
</package>

3. JSP 頁面

<%@ taglib prefix="s" uri="/struts-tags" %>
<s:form action="HelloWorld" theme="simple">
  Locale: <s:textfield name="loc" /> &nbsp; <s:submit />
</s:form>
<h2><s:property value="msg" /></h2>

4. 自訂轉換器

package tutorial;
import java.util.Locale;
import java.util.Map;
import ognl.DefaultTypeConverter;

public class LocaleConverter extends DefaultTypeConverter {
    @Override
    public Object convertValue(Map context, Object value, Class toType) {
        if (toType == Locale.class) {
            String locale = ((String[]) value)[0];
            return new Locale(locale.substring(0, 2), locale.substring(3));
        } else if (toType == String.class) {
            Locale locale = (Locale) value;
            return locale.toString();
        }
        return null;
    }
}

5. 註冊轉換器

建立 xwork-conversion.properties 放在 classpath 根目錄:

java.util.Locale = tutorial.LocaleConverter

或針對特定 Action:建立 HelloWorld-conversion.properties 放在 Action 同包:

loc = tutorial.LocaleConverter

6. 執行測試

  • 輸入 en_US → 顯示英文問候。
  • 輸入 zh_CN → 顯示中文問候。

內建轉換器一覽

Struts 2 已內建常用類型轉換,無需自行實作:

  • 基本類型與包裝類型:int、boolean、double 等。
  • 日期類型:使用當前 Locale 的短格式(DateFormat.SHORT)。
  • 集合類型:Collection、Set、陣列,自動將 request.getParameterValues() 字串陣列轉換。

批次封裝多個領域物件

場景

單一表單提交多筆產品資料(名稱、價格、生產日期)。

實作步驟

  1. 領域類別 Product:包含 name、price、dateOfProduction。
  2. Action ProductConfirm:屬性 List<Product> products。
  3. 類型轉換配置 ProductConfirm-conversion.properties:
    Element_products = tutorial.Product
    
    指定 List 內部元素類型。
  4. JSP 表單 使用 OGNL 索引語法:
    <s:iterator value="new int[3]" status="stat">
      <s:textfield name="%{'products['+#stat.index+'].name'}" />
      <s:textfield name="%{'products['+#stat.index+'].price'}" />
      <s:textfield name="%{'products['+#stat.index+'].dateOfProduction'}" />
    </s:iterator>
    
  5. 結果頁 迭代顯示 products 列表。

轉換錯誤處理

機制

conversionError 攔截器(預設在 defaultStack)將轉換錯誤封裝為 FieldError,導向 input 結果。

配置 input 結果

<action name="ProductConfirm" class="tutorial.ProductConfirm">
  <result>/ShowProducts.jsp</result>
  <result name="input">/AddProducts.jsp</result>
</action>

頁面顯示錯誤訊息

<div style="color:red">
  <s:fielderror />
</div>

行為細節

  • 錯誤欄位保留使用者輸入的原始字串。
  • 正確欄位正常封裝(如 price 預設 0.0)。
  • 提升使用者體驗,避免重新填寫整張表單。

總結

Struts 2 轉換器機制:

  • 消除手動字串解析/格式化代碼。
  • 支援全域與 Action 級別客製化轉換器。
  • 內建常用類型轉換,開箱即用。
  • 批次封裝集合屬性,簡化多筆資料處理。
  • 完善的錯誤處理與回顯機制,增強表單健壯性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved