BaseActionのまとめ方
BaseActionは、Common functionalityをまとめるのに使われるんですが、BaseActionは普通のActionの他にDispatchActionや LookupDispatchActionを利用する場合もありますね。例えば、複数のLookupDispatchActionで共通のボタン処理がある場合、BaseLookupDispatchActionを用意してそこに共通のメソッドを書き込みます。 それとは別に、普通のActionにはBaseActionを用意します。それはそれで良いのですが、LookupDispatchActionも普通のActionも含めて、全てのアクションで使うcommon functionalityがある場合はどうすれば良いのでしょうか? BaseLookupDispatchActionとBaseActionの両方に同じコードをダブっていれることになりますよね。
で、実際私も考えたことがあって、ふと思いついたのが、そもそもBaseActionをLookupDispatchActionのサブクラスにしてしまうってことでした。パラメータの名前を"dispatch"に統一しておいて、executeメソッドの中で"dispatch"というパラメータがnullの場合は process()メソッドを呼び出し、dispatchがあればLookupDispatchActionの処理なのでsuper.execute() をリターンする、と。 で、普通のAction内ではexecuteの変わりにprocessメソッドを使って処理を行います。
public class BaseAction extends LookupDispatchAction{
protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("button.back", "back");
map.put("button.save", "save");
...
return map;
}public ActionForward execute (ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
//logging setup etc. ←common fanctionality
if(request.getParameter("dispatch") == null) {
return process(mapping, form, request, response);
}
return super.execute(mapping, form, request, response);
}
...
public class SomeAction extends BaseAction{
public ActionForward process(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
...
return mapping.findForward("success");
}
public class ContactAction extends BaseAction{
protected Map getKeyMethodMap() {
return super.getKeyMethodMap();
}
//各メソッド...
public ActionForward send (ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
...
return mapping.findForward("success");
}
public interface CommonFuntionInterface {
public String doSomething();
}public class CommonFuntion implements CommonFuntionInterface {
public String doSomething() {
// to do logic
}
}public MyAction extend Action {
private CommonFuntion common;
public ActionForward execute (ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {common = new CommonFunction();
return performTask(mapping, form, request, response);
}public String doSomething() {
return common.doSomething();
}
}
んー、どうでしょうねぇ…方法は一つではないんですが…。 皆さん(誰?)はどのようにしてるんでしょう?