チュートリアル
Seasar2はHOT deployに対応しているので、ソースコードの変更を アプリケーションサーバを再起動することなく認識できます。 また、設定ファイルもほとんど書く必要がありません。
チュートリアルのセットアップに従って、 アプリケーションサーバを起動したら、Javaのコードや*.propertiesファイルをいろいろ 書き換えながら、HOT deployの威力を実感してください。
index
ブラウザでhttp://localhost:8080/sa-struts-tutorial/にアクセスしてください。 いろんなアプリケーションを試せるページが表示されましたね。
webappの直下を見てみましょう。index.jsp(index.html)は存在しません。 それでは、どのページが表示されているのでしょうか。
SAStrutsは、Webアプリケーションのルートにアクセスすると、 ルートパッケージ.action.IndexActionというクラスがあれば、 自動的にそのアクションに遷移します。 ルートパッケージの詳細は、こちらを参照ください。
tutorial.action.IndexAction
package tutorial.action; import org.seasar.struts.annotation.Execute; public class IndexAction { @Execute(validator = false) public String index() { return "start.jsp"; } }
アクションに遷移した後、@Executeのついた実行メソッドが呼び出されます。 実行メソッドを複数定義した場合に、どの実行メソッドが呼び出されるのかは、 こちらを参照してください。 今回は、実行メソッドが1つしかないので、無条件にindex()が呼び出されます。
メソッドの戻り値は遷移先になります。 IndexAction#index()の場合は、start.jspに遷移します。
Webアプリケーションのルートにindex.jspをおくと、 IndexActionに制御がわたらずindex.jspに直接遷移します。 アクションで、何らかの制御を行ないたい場合は、index.jspは定義しないでください。
それでは、webapp/WEB-INF/struts-config.xmlを見てみましょう。 アクションやアクションフォームの設定はまったくありません。 SAStrutsは、URLに結びつく適切なアクションクラスを探し出し、 そのアクションクラスの情報を元に、struts-config.xmlに相当する情報を組み立てています。
webapp/WEB-INF/validation.xmlも見てみましょう。 あら、そんなファイルないですね。 SAStrutsは、検証用のアノテーションをプロパティに設定することで、 validation.xmlに相当する情報を組み立てています。
足し算
インデックスページから足し算のページにアクセスしてください。 あるいは、ブラウザでhttp://localhost:8080/sa-struts-tutorial/addにアクセスしても同じです。 足し算のページが表示されましたね。
/addに対応するアクションクラスは、tutorial.action.AddActionです。 アクションの詳細は、こちらを参照してください。
AddActionのソースコードは次のようになります。
AddAction
package tutorial.action; import org.seasar.struts.annotation.Execute; import org.seasar.struts.annotation.IntegerType; import org.seasar.struts.annotation.Required; public class AddAction { @Required @IntegerType public String arg1; @Required @IntegerType public String arg2; public Integer result; @Execute(validator = false) public String index() { return "add.jsp"; } @Execute(input = "add.jsp") public String submit() { result = Integer.valueOf(arg1) + Integer.valueOf(arg2); return "add.jsp"; } }
アクションはPOJO(特定のクラスを継承しない普通のJavaのクラス)で記述し、 アクションの状態もアクションに定義します。 関連する情報は同じクラスにあったほうがわかりやすいからです。
Seasar2はpublicフィールドをプロパティとみなすことができるので、 getter,setterは記述する必要はありません。 publicフィールドは、ELやStrutsからでも認識できるようになっています。 そのからくりに興味のある方は、org.seasar.struts.actionのソースを眺めてください。
リクエストに対する処理は、実行メソッドに記述します。 実行メソッドには、@Executeをつけます。 実行メソッドの戻り値は、遷移先のパスになります。
実行メソッドが複数ある場合、どの実行メソッドが選択されるのかは、URLで指定するか、 リクエストのパラメータのキーにメソッド名が含まれている(値が1文字以上あること)かどうかで決まります。
次の例では、AddAction#index()が呼び出されます。 /addの後ろがメソッド名になります。
http://localhost:8080/sa-struts-tutorial/add/index
メソッドが定義されていない場合、index()が呼び出されるので、 上記の呼び出しは、下記の呼び出しと一緒です。
http://localhost:8080/sa-struts-tutorial/add
フォームをサブミットする場合は、ボタン系のname属性に実行メソッド名を指定します。 次の例では、アクションクラスのsubmit()を呼び出します。
<input type="submit" name="submit" value="サブミット"/>
@Executeの詳細は、こちらを参照してください。
アノテーション(バリデータ)による検証を行なうには、 フィールドに検証用のアノテーションをつけ、 @Executeのvaliator属性をtrue(デフォルト)にします。 validator=trueの場合は、検証結果がNGのときの遷移先をinput属性で指定する必要があります。 バリデータの詳細は、こちらを参照してください。
add.jspは次のようになります。
add.jsp
<html> <head> <title>Add</title> </head> <body> <html:errors/> <s:form action="/add"> <html:text property="arg1"/> + <html:text property="arg2"/> = ${f:h(result)}<br /> <input type="submit" name="submit" value="サブミット"/> </s:form> </body> </html>
どのJSPでも共通に必要になるtaglibの宣言は、/common/common.jspで定義されています。 common.jspの詳細は、JSPを参照してください。
検証結果がNGのときのメッセージを表示させるために、 html:errorsタグを定義します。
サブミットされた値を受け取るためにs:formを定義します。 action属性には、アクションのパスを指定します。 s:formはHTMLに出力されるaction属性の値に拡張子(.do)が含まれないことを除いては、 Strutsのhtml:formと同じです。
入力値を受け取るために、html:textタグを定義します。 property属性にアクションのプロパティ名を指定します。
サブミット時にAddAction#submit()を呼び出すために、サブミットタグの name属性の値をsubmitに設定します。
サブミットされると、入力したarg1、arg2の値がアクションに設定され、 バリデータにより必須かどうか、整数かどうかが検証されます。
バリデータの結果がNGだった場合は、input属性で指定したadd.jspに戻されます。 バリデータの結果がOKの場合は、submit()が呼び出されます。
submit()の戻り値がadd.jspなので、またadd.jspに遷移します。
アクションのresultプロパティは、リクエストの属性に同じ名前でセットされているので、 ${f:h(result)}のようにして表示できます。 f:hはHTMLをエスケープするファンクションです。 詳細は、こちらを参照してください。