アクションで生成した動的な値をJSPで参照する方法

次に、アクションで実行した処理の結果を表示する方法を紹介しましょう。これには、いくつかの方法がありますが、代表的な3つの方法を紹介します。

  • アクションクラスの属性として保持し、JSPで参照する
  • Struts 2の提供するMapへ保存し、JSPで参照する
  • アクションで生成した動的な値を、chainしたアクションで参照する

アクションクラスの属性として保持し、JSPで参照する

まずは、動的な値のオブジェクトをアクションクラスの属性として保持させる方法です。これの機能の実装は非常に簡単です。まず、アクションクラスに値を保持する属性を追加し、そのアクセッサメソッドを定義します。今回は、ページの初期表示時にログインを促すメッセージを表示してみましょう。先ほどのアクションクラスTopに、attentionという属性を以下のように追加し、アクションの実行時に動作するexecuteメソッドにてメッセージ文字列をセットします。

リスト12: attention属性を追加したTop.java

package example;

public class Top {

    private String username;
    private String password;
    private String attention;

    public String getPassword() { return password; }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() { return username; }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAttention() { return attention; }

    public void setAttention(String attention) {
        this.attention = attention;
    }

    public String execute() throws Exception {
        setAttention("Please login!");
        return "success";
    }

    public String login() throws Exception {

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

        return "input";
    }

    public String guestLogin() throws Exception {
        return "success";
    }

}

そして、このメッセージがセットされたアクションクラスの属性をJSPで参照するには、Struts 2が提供する<s:property>タグを利用して下記のようにJSPを記述します。

リスト13: アクションクラスの属性への参照を追加したJSP

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="Windows-31J" %>
<%@ taglib uri="/struts-tags" prefix="s" %>

<html>
<head>
    <title>こんにちは</title>
</head>

<body>
<h2>はじめましてSturts2です</h2>

<s:property value="attention"/>

<s:form theme="simple">
   ユーザ名:<s:textfield key="username" /><br>
   パスワード:<s:password  key="password" />
 <p>
   <s:submit value="Login"        action="Top_login" />
   <s:submit value="GuestLogin"   action="Top_guestLogin"/>
 </p>
</s:form>

</body>
</html>

<s:property>はJSPの実行を指定したアクションのクラスが保持している属性への参照機能を提供します。value属性に参照したいアクションクラスの属性名を記述するのみです。あとは、アクションTopが実行されるように、Webブラウザからhttp://..../アプリケーション名/へのリクエストを送ることで画面3のようなページが表示されます。

画面3: メッセージ付きトップページ

この方法の利点は、リクエストコンテキスト等のアプリケーションサーバが提供するAPIを利用することなくJSPにオブジェクトを渡せるという事と、アクションクラス自体がリクエスト毎に生成/消滅するため、オブジェクトの削除を意識する必要がない事です。アクションの結果生成のみに利用するオブジェクトの受け渡しはこの方法がよいでしょう。