このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
フィルタ情報を編集する画面からやっていくか。
まず、画面遷移を考えよう。
Struts の設定ファイルを書きながら決めていく。
まず、フィルタ情報用の Parameter Bean である、
FilterInfoForm を <form-beans> に追加しておく。
<form-bean name="filterInfoForm"
type="jp.loafer.test.forms.FilterInfoForm" />
次に、<action-mappings> への登録だ。
<!-- 情報編集画面 -->
<action path="/filter/edit-info"
name="filterInfoForm" scope="request"
type="jp.loafer.test.actions.EditFilterInfoAction">
<!-- 情報編集画面用の View へ -->
<forward name="success"
path="/WEB-INF/pages/filter/edit-info.jsp" />
</action>
<!-- 情報更新 -->
<action path="/filter/update-info"
name="filterInfoForm" scope="request"
type="jp.loafer.test.actions.UpdateFilterInfoAction">
<!-- 成功時は一覧画面へ戻る -->
<forward name="success"
path="/filter/list.do" />
</action>
編集画面には 2 つの Action が必要となる。
1 つは、編集画面を呼び出すための Action、
もう 1 つは編集結果で更新するための Action だ。
EditFilterInfoAction の役割は、
フィルタ情報編集画面を初期化するためにある。
edit-info.jsp が表示された場合、
現在の設定をフォームの初期値として表示するためには、
EditFilterInfoAction で現在値を読み込み、
事前に ActionForm に値を設定しておかなければならない。
そして、ActionForm を初期化するためには、
filterInfoForm を Action#execute 内で扱う必要がある。
そのためには name 属性の指定が必要となる。
name 属性を指定しないと、Action#execute において、
ActionForm は null になってしまうため、
filterInfoForm のインスタンスも存在せず、
画面用のデータを用意することができなくなってしまう。
Action 内で FilterInfoForm インスタンスを、
自分で作成してリクエスト属性に登録することもできるが、
本来の ActionForm は Struts が管理するものであるため、
開発者のコードで作成するのは避けたい。
なので、Struts によって filterInfoForm を作成させ、
Action 内でそれにアクセスするために、
name 属性で filterInfoForm を指定することにした。
役割的には、/filter/edit-info は、
パラメータなしで呼び出すことができるので、
厳密には filterInfoForm は Parameter Bean ではない。
次に、UpdateFilterInfoAction の役割だが、
filterInfoForm の内容を元に、
実際の設定のフィルタ情報を更新する。
name 属性で filterInfoForm を指定し、
更新された情報をパラメータとして受け取るようにする。
こちらの <action> は自然な設定だ。
さて、今回新たに scope 属性を使っている。
scope 属性は、「request」か「session」の値を取り、
name 属性で指定した ActionForm の登録先を示す。
ActionForm のインスタンスは、Struts によって生成され、
自動的にスコープの属性に登録されるのだが、
既定では、利便性を考えてか Session に登録される。
Session に登録すると、ActionForm がずっと残ってしまう。
session="request" としてリクエスト属性に登録すると、
リクエスト完了後、すぐに ActionForm は消滅する。
ActionForm が Parameter Bean であると考えるなら、
すぐに消滅するほうが都合が良いため、
一貫して request に登録することにしよう。
さて、これで情報編集用の遷移が決まった。
編集画面は /filter/edit-info.do で呼び出され、
edit-info.do は EditFilterInfoAction で処理され、
/WEB-INF/pages/filter/edit-info.jsp を使って表示する。
更新処理は /filter/update-info.do で呼び出され、
update-info.do は UpdateFilterInfoAction で処理され、
処理が成功したら、/filter/list.do に転送することで、
一覧画面を再表示するという流れになる。