LookupDispatchAction 是 DispatchAction 子類,專為單一表單多提交按鈕且按鈕顯示文字需國際化的情境設計。它透過屬性檔鍵值映射到實際方法名,解決「按鈕顯示文字隨語系變動,但程式邏輯固定」的問題。
<html:form action="myaction">
<html:submit property="action">
<bean:message key="submit.print" />
</html:submit>
<html:submit property="action">
<bean:message key="submit.save" />
</html:submit>
</html:form>
property="action"(對應請求參數名)。<bean:message> 從屬性檔取得(submit.print、submit.save)。action=屬性檔對應值(如 action=save)。package action;
import org.apache.struts.actions.LookupDispatchAction;
import java.util.*;
public class MyLookupDispatchAction extends LookupDispatchAction {
// 必須實作:建立「屬性檔鍵 → 方法名」映射
protected Map getKeyMethodMap() {
Map m = new HashMap();
m.put("submit.print", "print"); // 屬性檔鍵 → 方法名
m.put("submit.save", "save");
return m;
}
public ActionForward print(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// 列印處理邏輯
return null;
}
public ActionForward save(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// 儲存處理邏輯
return null;
}
}
<action path="/moresubmit"
type="action.MyLookupDispatchAction"
parameter="action" />
parameter="action":指定請求參數名(對應按鈕 property)。submit.save 屬性檔值,假設為 "Save")。/moresubmit.do?action=Save。getKeyMethodMap() 映射表中尋找 key 為 "Save" 的項目 → 找到 submit.save 對應方法名 "save"。save() 方法處理。| 優點 | 缺點 |
|---|---|
| 支援按鈕文字國際化 | 需維護屬性檔與 getKeyMethodMap() 映射 |
| 邏輯方法名固定,不受顯示文字影響 | 設定較繁瑣,Struts 1.2.9+ 建議改用 EventDispatchAction |
LookupDispatchAction 透過「屬性檔鍵 → 方法名」間接映射,優雅解決多語系按鈕值問題,但設定複雜度較高。若專案無國際化需求,EventDispatchAction 為更佳選擇。