チュートリアル
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に遷移します。
login
インデックスページからログインページにアクセスしてください。 あるいは、ブラウザでhttp://localhost:8080/sa-struts-tutorial/login/にアクセスしても同じです。 ログインページが表示されましたね。
それでは、webapp/WEB-INF/struts-config.xmlを見てみましょう。 アクションやアクションフォームの設定はまったくありません。 SAStrutsは、URLに結びつく適切なアクションクラスを探し出し、 そのアクションクラスの情報を元に、struts-config.xmlに相当する情報を組み立てています。
webapp/WEB-INF/validation.xmlも見てみましょう。 あら、そんなファイルないですね。 SAStrutsは、検証用のアノテーションをプロパティに設定することで、 validation.xmlに相当する情報を組み立てています。
/login/に対応するアクションクラスは、tutorial.action.LoginActionです。 アクションの詳細は、こちらを参照してください。
LoginActionのソースコードは次のようになります。
LoginAction
package tutorial.web.login; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import org.seasar.struts.annotation.Execute; import org.seasar.struts.annotation.Required; public class LoginAction { @Required public String userName; @Required public String password; @Execute(validator = false) public String execute() { return "login.jsp"; } @Execute(validate = "validate", input = "login.jsp") public String login() { return "welcome.jsp"; } public ActionMessages validate() { ActionMessages errors = new ActionMessages(); if (!userName.equals(password)) { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "errors.invalid.login")); } return errors; } }
アクションはPOJO(特定のクラスを継承しない普通のJavaのクラス)で記述し、 アクションの状態もアクションに定義します。 関連する情報は同じクラスにあったほうがわかりやすいからです。
Seasar2はpublicフィールドをプロパティとみなすことができるので、 getter,setterは記述する必要はありません。 publicフィールドは、ELやStrutsからでも認識できるようになっています。 そのからくりに興味のある方は、org.seasar.struts.actionのソースを眺めてください。
リクエストに対する処理は、実行メソッドに記述します。 実行メソッドには、@Executeをつけます。 実行メソッドの戻り値は、遷移先のパスになります。
実行メソッドが複数ある場合、どの実行メソッドが選択されるのかは、URLで指定するか、 リクエストのパラメータのキーにメソッド名が含まれている(値が1文字以上あること)かどうかで決まります。
次の例では、LoginAction#index()が呼び出されます。
http://localhost:8080/sa-struts-tutorial/login/index/
メソッドが定義されていない場合、index()が呼び出されるので、 上記の呼び出しは、下記の呼び出しと一緒です。
http://localhost:8080/sa-struts-tutorial/login/
フォームをサブミットする場合は、ボタン系のname属性に実行メソッド名を指定します。 次の例では、アクションクラスのlogin()が呼び出されます。
<input type="submit" name="login" value="ログイン"/>
@Executeの詳細は、こちらを参照してください。
アノテーション(バリデータ)による検証を行なうには、 フィールドに検証用のアノテーションをつけ、 @Executeのvaliator属性をtrue(デフォルト)にします。 validator=trueの場合は、検証結果がNGのときの遷移先をinput属性で指定する必要があります。 バリデータの詳細は、こちらを参照してください。
ログインチェック(validateメソッド)のような単純にバリデータでは処理できないような検証は、 検証メソッドに記述します。 実行メソッドでどの検証メソッドを使うのかは、 @Executeのvalidate属性で指定します。 validate属性を指定した場合は、検証結果がNGのときの遷移先をinput属性で指定する必要があります。 検証メソッドの詳細は、こちらを参照してください。
login.jspは次のようになります。
login.jsp
<html> <head> <title>Login</title> </head> <body> <html:errors/> <s:form action="/login"> <table> <tr> <td>ユーザ名:</td> <td><html:text property="userName"/></td> </tr> <tr> <td>パスワード:</td> <td><html:password property="password" redisplay="false"/></td> </tr> </table> <input type="submit" name="login" 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属性にアクションのプロパティ名を指定します。
パスワードを受け取るために、html:passwordタグを定義します。 property属性にアクションのプロパティ名を指定します。 検証エラーなどで画面が再表示されるときに、パスワードが表示されないようにするには、 redisplay属性をfalseにします。
サブミット時にLoginAction#login()を呼び出すために、サブミットタグの name属性の値をloginに設定します。
サブミットされると、入力したuserName、passwordの値がアクションに設定され、 必須かどうかが検証されます。
検証結果がNGだった場合は、input属性で指定したlogin.jspに戻されます。 バリデータの検証結果がOKの場合は、validate属性で指定したvalidate()が呼び出されます。
validate()の結果がNGだった場合は、input属性で指定したlogin.jspに戻されます。 バリデータの検証結果がOKの場合は、login()が呼び出されます。 戻り値がwelcome.jspなので、welcome.jspに遷移します。
welcome.jspは次のようになります。
welcome.jsp
<html> <head> <title>Welcome</title> </head> <body> Hello ${f:h(userName)} </body> </html>
SAStrutsは、アクションのプロパティの値をリクエストの属性に設定しているので、 ${f:h(userName)}でuserNameプロパティを表示することができます。
f:h()はHTMLをエスケープするためのファンクションです。