2007 年 5 月 4 日 23 時 51 分

DispatchAction の特例処理


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


編集用のボタンは少し特殊である。
ルールごとに個別にボタンが存在するため、
ボタンが複数存在することになる。

そのため、他のボタンと同じように扱おうとして、
command パラメータを使って値を設定しようとすると、
編集であることを表す値と、編集されるルールの番号を、
同時にパラメータで表現しなければならない。

でも、edit0 や edit1 等としてしまうと、
DispatchAction の メソッドに対応付けるのは無理がある。

そこで、編集に関しては特別扱いにすることとし、
専用の edit パラメータを利用して番号を格納する。
たとえば 2 番を編集する場合は、edit パラメータに、
値と 2 として送信することにする。

しかし、この編集ボタンを押した場合、
command パラメータは送信されないため、
これを受け取った DispatchAction では、
メソッドが指定されていないものとして扱われてしまう。

DispatchAction では、メソッド名が指定されていない場合、
unspecified というメソッドが呼び出される。
これは既定でエラーを発生させるので、
これをオーバーライドして、edit パラメータを捕捉すれば、
編集用の処理を追加することができることになる。

========== ManageRulesAction#unspecified ==========
    @Override
    protected ActionForward unspecified(
            ActionMapping mapping, ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {

        // edit パラメータが含まれる場合、転送する
        String editValue = request.getParameter("edit");
        if (editValue != null) {
            return mapping.findForward("edit");
        }

        return super.unspecified(mapping, form,
                request, response);
    }
========== end of ManageRulesAction#unspecified ==========

unspecified も、execute と同じシグネチャなので、
自由に処理を行うことができる。
ここでは request#getParameter を直接呼び出し、
edit パラメータが含まれているかどうかを判断し、
含まれていれば、別のアドレスに転送している。

さて、ここでは転送をしているのだが、それには理由がある。
ルールの編集を行うためには、情報の時と同様、
現在の設定をフォームの初期値として表示する必要がある。
つまり、FilterRuleForm インスタンスを用意し、
その値を初期化しておかなければならない。

FilterRuleForm を初期化するためには、
そのインスタンスが用意されていなければならないのだが、
ActionForm は Struts が管理しているものであるため、
独自にそのインスタンスを生成するのは好ましくない。

FilterRuleForm のインスタンスを用意するためには、
<action> の name 属性にて ActionForm を指定し、
それに割り当てられた Action で初期化を行う事になる。

しかしながら、編集ボタンを押した際の送信先である、
/filter/manage-rules には、
既に ManageRulesForm が関連付けられているため、
ManageFilterAction で初期化を行うことはできない。

そのため、FilterRuleForm を関連付けた別の URL を用意し、
そこに転送して初期化を行う必要があるのである。
なので、ManageFilterAction では転送をするだけなのだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.