struts2をいじってみた

strutsがメジャーバージョンアップしてたので試してみた。
http://struts.apache.org/2.x/


struts2はstruts1をベースにしているのではなくて、
WebWork(?)というフレームワークをベースにしているらしい。
設定ファイルはstruts.xmlという名前になりました。
でも、struts.xmlを使わなくてもある程度ならアプリケーションが作れちゃいます。(ゼロコンフィグ)
このときは暗黙の設定ファイルstruts-default.xmlが利用されているみたいね。
余談ですけど、struts2に実装されているDIはGuiceを作った人が書いたんだそうだ。


さて、とりあえず面白そうなのでstruts.xmlを作らないゼロコンフィグ(設定ファイルなし)をやってみました。



Actionとなるクラスの指定はweb.xmlでinit-paramとして指定します。
下の例だとjp.co.nebosuke.hogehoge.controller以下にあるものが、
Actionの対象としてサーブレットコンテナの起動時に登録されます。
ちなみにサブディレクトリはnamespaceになるらしいけど、namespaceの利用法はよくわからなかったです。。。

 <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  	<init-param>
  		<param-name>actionPackages</param-name>
  		<param-value>jp.co.nebosuke.hogehoge.controller</param-value>
  	</init-param>
  </filter>

後は

http://localhost/app/hogehoge.action

とリクエストを投げると登録されたActionの中から
HogehogeActionクラスをstruts2が探して実行してくれます。


この場合、実行されるメソッドはexecute()なのですが、
validate()メソッドがHogehogeActionに実装されていた場合、
これまたstruts2がvalidate()をコールしてくれます。
もちろんexecute()が実行される前にです。
validationを実装する場合にはvalidate()を実装しましょう。


もう1つリクエストの投げ方があります。例えば

http://localhost/app/hogehoge!method.action

というように!を付加する方法です。
この場合はHogehogeAction#method()をstruts2が実行します。
どうやらこの場合のvalidationは

validateMethod()
doValidateMethod()

のどちらかを実装しておけば勝手にコールしてくれるようです。
これらを呼び出そうとしている動作がログに出力されていました。(※たしか…)



アノテーションでvalidationがこんな感じに指定できます。

@Validations(requiredStrings = @RequiredStringValidator(fieldName = "userName", message = "ユーザー名を入力してください"))
public class HogehogeAction extends ActionSupport{
    private String userName;
        public setUserName(String userName){
                this.userName = userName
        }
}

messageはvalidationの結果がエラーの場合に設定されるメッセージです。
このメッセージをJSPで取得するには、

<s:fielderror />

とします。


でもこれだと全てのエラーメッセージがここにまとめて出力されてしまいます。
個別にメッセージを取得したい場合は

<s:fielderror><s:param value="%{'userName'}" /></s:fielderror>

とparamでメッセージを個別に指定します。
たくさん書くと少々しんどいですね。


そういえばはそのまま使うと余分なタグが出力されるのですが、
theme="simple"を指定すれば余計なタグは出ません。themeは多くのタグで使用できるので、
余分なタグが出るときはとりあえず指定しておけばデザインが崩れないです。

<s:fielderror theme="simple" ><〜

どこでやるか忘れちゃったけどデフォルトのテーマをsimpleに出来たはずです。
全てのタグにthemeを記述するのはバカバカしいので、
デフォルトテーマを変更するのが現実的ですね。


こんな感じでviewを指定します。

@Results( { @Result(value = "success.jsp"),
		@Result(name = "hogehoge", value = "hogehoge.jsp"),
		@Result(name = "input", value = "input.jsp") })
public class SampleAction  {
	// 省略
}

あとはexecute()の戻り値でviewを指定します。
たとえば"hogehoge"を返せばhogehoge.jspがviewとして呼び出されます。


ちなみにvalidationをアノテーションで行った場合、
validationのエラーが発生するとinputに指定したviewが自動的に出力されます。