使用 LookupDispatchAction


org.apache.struts.actions.LookupDispatchAction類別是 DispatchAction 類別的子類,與DispatchAction類似的是,它透過請求上的參數來決定該執行哪一個方法,不過LookupDispatchAction多了查 詢訊息資源檔案的功能,LookupDispatchAction的用處之一,就是當一個表單中包括兩個以上的按鈕時,可以透過查詢訊息資源檔來確定相對 應的動作。

直接以實例來說明,在繼承LookupDispatchAction之後,您要重新定義getKeyMethodMap()方法,並定義好自己的相關處理方法,例如:
  • EditAction.java
package onlyfun.caterpillar;

import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;

public class EditAction extends LookupDispatchAction {
protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("button.save", "save");
map.put("button.preview", "preview");
map.put("button.reset", "reset");
return map;
}

public ActionForward save(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// ......
}

public ActionForward preview(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// ......
}

public ActionForward reset(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// ......
}
}

假設訊息資源檔中包括以下的訊息:
  • messages.properties
button.save=Save
button.preview=Preview
button.reset=Reset

為了要使用LookupDispatchAction,在struts-config.xml中定義請求參數中該有的名稱:
  • struts-config.xml
...
<action path="/edit"
type="onlyfun.caterpillar.EditAction"
parameter="method"
name="editForm"/>
...

現在假設您的表單頁面包括以下的內容:
...
 <form name="editForm" method="post"
       action="/strutsapp/edit.do">
    .....
    <input type="submit" name="method" value="Save"/>
    <input type="submit" name="method" value="Preview"/>
    <input type="submit" name="method" value="Reset"/>
 </form>
...

當您按下任一個按鈕時,請求參數中會包括method=Save或是method=Preview或是method= Reset,假設是method=Save好了,LookupDispatchAction會根據它作為value,在訊息資訊檔找到對應的key,然後 根據key與getKeyMethodMap()得知要執行的方法為save()方法。

那麼關於國際化訊息管理的部份呢?例如想要在表單按鈕上使用中文?
 ...
 <form name="editForm" method="post"
       action="/strutsapp/edit.do">
    .....
    <input type="submit" name="method" value="存檔"/>
    <input type="submit" name="method" value="預覽"/>
    <input type="submit" name="method" value="重設"/>
 </form>
...

一樣的,您的訊息檔案中必須包括下面的內容:
  • messages.properties
button.save=存檔
button.preview=預覽
button.reset=重設

然後,您要使用native2ascii將訊息檔案轉換為Unicode編碼,例如:
native2ascii messages_zh_TW.txt messages_zh_TW.properties

接下來的問題是,瀏覽器發送過來的中文參數,為了要能正確的解析,要使用request的 setCharacterEncoding("Big5"),這樣才能得到正確的中文參數,但是在什麼地方作這個動作?您可以在Servlet Filter中作這件事,另一個可能的地方則是 ActionForm 的reset()方法中,例如:
package onlyfun.caterpillar;

public class UserForm extends ActionForm {
     ......

    public void reset(ActionMapping mapping,
                     HttpServletRequest request) {
        try {
            request.setCharacterEncoding("Big5");
            .......
        }
        catch(Exception e) {
            ....
        }
   }
}
 

這樣您的按鈕就可以使用中文訊息了。

如果您願意的話,可以搭配使用 <bean:message> 來使用上述的功能,直接由標籤來管理訊息檔案中的訊息。