これまではStruts1を使ってたぜ。
試しにStruts2に手を出してみたけど、なんだこれは!ふざけるな!
必要なものが全然ないぞ!?
こんなものでプログラムが組めるか!
とお怒りの方に送るガイド。
⇒ActionSupportクラスを継承してアクションクラスを作る。
また、ActionFormはActionに一本化された。
アクションクラスのフィールドがフォームの入力欄等に対応する。
⇒struts.xmlというファイルになった。また、他のXMLファイルに設定を書き付けて
struts.xmlからincludeする、というマネができるようになった。
例えば機能ごと(画面ごと)に設定ファイルを分けることができる。
次のように書けない!
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%> <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
⇒
<%@ taglib prefix="s" uri="/struts-tags"%>
に一本化。あーらくらく。
⇒<s:text name="a.b.c.d"/>
⇒<s:form>。actionは「/ネームスペース名/アクション名.action」と指定する。
ここでいうネームスペース名やアクション名は、struts.xmlの中
(あるいはそこからincludeされている設定ファイルの中)で定義されているもの。
⇒ Struts2には「テーマ」というものがあるらしい。
theme="simple" の属性をつければ解決。
テーマもうまく使えばJSPのコーディングが楽になりそうだが・・・。
※<s:form>に theme="simple" をつけておけばそのフォーム内のものは
すべて theme="simple" 扱いになるっぽい?(未確認)
⇒<s:iterator> を使う。value属性にアクションクラスがもっている
フィールド(コレクション)を指定する。idの記述は不要なようだ。
bean:write の代わりに s:property で記述する。属性はvalueで、
フィールド名を書く。
このあたり、Struts1の反省を踏まえてだいぶシンプルになったようだ。
【例】
<s:iterator value="somethingList"> <tr> <td><s:property value="item1"/></td> <td><s:property value="item2"/></td> <td><s:property value="item3"/></td> <td><s:property value="item4"/></td> <td><s:property value="item5"/></td> </tr> </s:iterator>
⇒サブミットボタンにaction属性を書く事ができる。
s:formのものと違い、アクション名だけ書く。
また、その場合、s:formタグのactionは指定しない。namespaceを指定する。namespaceはスラッシュで始まるアレ。
⇒s:selectタグのlist属性として、Mapのフィールドを用意して指定すればよくなった。
もちろん、なんらかのbeanのlistをs:selectタグで扱うことは可能。
ただ、LabelValueBeanそのものに該当するクラスは存在しない。
ほしければ自作(でも普通はDTOを使いまわすのでいらない気がする)。
⇒Struts2においてはセッションオブジェクトはMapとして受け取ることができる。
受け取るためには次のようにアクションクラスを修正する。
public void setSession(Map map) { this.sessionMap = map; }
こうしておけば、アクション実行時にStruts2のセッションインターセプタ(※1)が
この「setSession」メソッドを実行するので、フィールドの「sessionMap」に
セッションオブジェクトが格納される。
あとはセッションを使用したい箇所でこのsessionMapを参照すればよい。
※1 インターセプタというのはアクションの実行前や実行後に行われる処理のこと。
Struts2はセッションインターセプタを始めいろいろなインターセプタを持っている。
また、インターセプタは自作することもできる。
addActionError が該当。また、引数として与えるのは実際に表示される文言。
メッセージリソースプロパティのキーを直接与えてもそのキーが表示されるだけになるので、
getTextメソッドを使ってプロパティから文字列を取得し、それを引数として与える。
saveMessagesも同様に、addActionMessage というメソッドに置き換わった。