2007 年 5 月 5 日 21 時 30 分

ルールの現在値を用意する


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


編集画面を出すためには、/filter/manage-rules から、
ルールの現在値を読み出すための別の Action に転送し、
その Action に FilterRuleForm を割り当てる必要がある。

初期化用のパスは /filter/edit-rule とし、
Action クラスは EditFilterRuleAction としておこう。

        <!-- ルール管理 -->

        <action path="/filter/manage-rules"
                name="manageFilterRulesForm" scope="request"
                parameter="command"
                type="jp.loafer.test.actions.ManageRulesAction">

            <!-- 追加時は、直接ルール編集画面用の View へ -->
            <forward name="add"
                    path="/WEB-INF/pages/filter/edit-rule.jsp" />

            <!-- 編集時は、編集用の Action へ -->
            <forward name="edit"
                    path="/filter/edit-rule.do" />

            <!-- その他の操作の場合、一覧画面へ戻る -->
            <forward name="success"
                    path="/filter/list.do" />

        </action>

        <!-- ルール編集 -->

        <action path="/filter/edit-rule"
                name="filterRuleForm" scope="request"
                validate="false"
                type="jp.loafer.test.actions.EditFilterRuleAction">

            <!-- 情報編集画面用の View へ -->
            <forward name="success"
                    path="/WEB-INF/pages/filter/edit-rule.jsp" />

        </action>


これで、編集ボタンを押した場合、
/filter/edit-rule.do に転送されるようになる。

後は、EditFilterRuleAction を作り、
ルールの現在地を ActionForm に読み込む。

========== EditFilterRuleAction.java ==========
package jp.loafer.test.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.loafer.test.beans.Filter;
import jp.loafer.test.forms.FilterRuleForm;
import jp.loafer.test.util.FilterManager;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class EditFilterRuleAction extends Action {

    public EditFilterRuleAction() {
        super();
    }

    @Override
    public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {

        // フォームを取得
        FilterRuleForm ruleForm = (FilterRuleForm)form;

        // 編集するルールの番号は edit パラメータに
        String editValue = request.getParameter("edit");
        int index = Integer.parseInt(editValue);

        // 現在のフィルタ設定を読み込み
        Filter filter = FilterManager.load();

        // 現在値をフォームに設定
        ruleForm.setRule(filter.getRules().get(index));

        // 編集対象の番号も設定
        ruleForm.setIndex(index);

        // OK
        return mapping
                .findForward(Forwards.SUCCESS_KEY);
    }

}
========== end of EditFilterRuleAction.java ==========

edit パラメータには編集対象の番号が入っているので、
request を直接調べて番号を取り出し、
ルールの現在値を設定して終了となる。

基本的にはこれでいいのだが、
注意しておかなければならないことがある。

送信されたフォームの値は Struts によって分析され、
割り当てられている ActionForm に値が設定される。
これは、Action ごとに行われるので、
EditFilterRuleAction でも request に基づいて行われる。

この Action は転送で呼び出されているので、
このリクエストに含まれるフォームは、ManageFilterRulesForm に対応したものだ。

つまり、ManageFilterRulesForm 用のフォーム値を使って、
FilterRuleForm に値が設定されるということになる。

幸い、FilterRuleForm には edit や selected、
command という名前のプロパティが存在しないので、
FilterRuleForm に不正に値が設定されることはない。

万全を期するなら、RequestDispatcher を使い、
必要なパラメータだけの HttpServletRequest を渡すか、
/filter/edit-rule.do?edit=2 等にリダイレクトし、
渡すパラメータを必要最小限にするという方法がある。

……ActionForm インスタンスをを自分で生成する方が、
速かったような気もするなぁ。



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