このアーカイブは同期化されません。 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 では転送をするだけなのだ。