アクションの実行結果によって次の処理を変える方法

続いて、アクションの実行結果によって次の処理を変更する方法を紹介しましょう。次の処理は、JSPの実行でも、別のアクションの実行(チェーンと呼びます)でも構いません。この制御はこれまでの説明でおわかりの通り、アクションクラスのメソッドが返すoutcomeと、それに対応するアクションの定義にて行います。今回は、ログイン処理の成功/失敗で次の処理を変更してみましょう。

ログインに成功した場合、次のページ用のアクションを実行し、失敗した場合元のページ(Top)を表示するという処理を、アクションクラスTopに追加します。ログイン処理を実装するloginメソッドを下記のように変更します。

リスト10: 変更後のloginメソッド(Top.java)

    public String login() throws Exception {

        if ( username == null && password == null ) {
            return "input";
        }
        if ( ! username.equals(password)) {
            return "success";
        }

        return "input";
    }

usernameとpasswordに異なる値を入力された場合にsuccessというoutcomeを返すようにしています。このsuccessの場合に異なるページを表示させるためのアクションの定義は下記のようになります。

リスト11: sturts.xml抜粋

        .......省略.........
        <action name="HelloUser" class="example.HelloUser">
            <result>/example/HelloUser.jsp</result>
        </action>

        <action name="Top_login"  method="login" class="example.Top" >
            <result name="input"   >/example/Top.jsp</result>
            <result name="success" type="chain" >HelloUser</result>
        </action>
        .......省略.........

successの場合にHelloUserという新しいアクションを実行するよう指定しています。このようにアクションを次の処理に指定する場合、JSPを実行するのとは異なり、<result>要素にtype属性にてchainを定義します。この定義によって、アクションHelloUserのアクションクラスが実行されるようになります。type属性にはchain以外にも下記のような値が定義できます。

  • chain: 別のアクショを実行する場合に指定します
  • dispatcher(省略時のdefault値): JSPを実行する場合に指定します
  • freemarker: Freemarkerテンプレートを実行する場合に指定します
  • httpheader: HttpHeaderのみを返す場合に指定します
  • redirect: リダイレクトレスポンスを返す場合に指定します
  • redirectAction: アクションへのリダイレクトレスポンスを返す場合に指定します
  • stream: ァイルダウンロードのようなStreamデータを返す場合に指定します
  • velocity: Velocityテンプレートを実行する場合に指定します
  • xslt: XSLTを用いたレスポンス生成を実行する場合に指定します
  • plainText: プレーンテキストを返す場合に指定します

chainで指定されたアクションHelloUserは、successを返すだけのexecuteメソッドを持つアクションクラスと、success時に固定文字の表示を行うだけのJSPからなる非常に簡単なアクションのため、説明は省略します。