Menu

チュートリアル

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をエスケープするファンクションです。 詳細は、こちらを参照してください。