セッションの利用
続いて、Stripesからセッションを利用する手法について説明します。ここまでActionBeanを利用してさまざまな値をJSP側に送り出したりしてきましたが、それらは基本的にすべて1回のリクエストで完結するものでした。ActinBeanに保管されるプロパティのスコープは基本的にリクエストであり、値を保持し続けるわけではありません。
では、ActionBeanではセッションは利用できないのでしょうか。実をいえば、標準では特にそのための機能は用意されていません。Stripesは非常に小さくまとまったフレームワークであり、あまり幅広い機能は用意されていないのです。
しかし、Stripesの開発者たちにより、機能を追加するプラグインライブラリが用意されており、これを利用することでActionBeanにセッション・スコープの値を保持できるようになります。これは、SourceForge.netのStripes Stuffからダウンロードできます。
ここで配布されている「stripesstuff-バージョン.jar」というライブラリファイルを、プロジェクトのWEB-INF内にある「lib」フォルダの中にコピーしてください。これでこのプラグイン・ライブラリの機能が利用できるようになります。ここからセッションの機能を利用できるようにするため、web.xmlに追記を行います。既に記述されているStripesの<filter>タグ内に、以下のタグを追記してください。
<init-param> <param-name>Extension.Packages</param-name> <param-value>org.stripesstuff.plugin.session</param-value> </init-param>
これで、次回起動時よりセッションのプラグインが利用可能になります。なお、既にある他の<init-param>は削除しないように注意してください。
メッセージ保管プログラム
では、簡単なサンプルとして、フォームから送信したメッセージをListですべてセッションに保管するプログラムを作成してみましょう。今回は、ActionBeanクラスから作成します。HeloActionBeanを次のように書き換えてください。
package jp.codezine;
import java.io.*;
import java.util.*;
import org.stripesstuff.plugin.session.Session;
import net.sourceforge.stripes.action.*;
public class HeloActionBean implements ActionBean {
private ActionBeanContext context;
@Session
private String result;
@Session
private String input1;
@Session
private List<String>messages = new ArrayList<String>();
public List<String> getMessages() {
return messages;
}
public void setMessages(List<String> messages) {
this.messages = messages;
}
public String getResult() { return result; }
public void setResult(String result) { this.result = result; }
public String getInput1() { return input1; }
public void setInput1(String input1) { this.input1 = input1; }
@Override
public ActionBeanContext getContext() {
return this.context;
}
@Override
public void setContext(ActionBeanContext context) {
this.context = context;
}
@DefaultHandler
public Resolution submit() {
if (messages == null) messages = new ArrayList<String>();
messages.add(0,this.input1);
result = "「" + input1 + "」を追加しました。";
return new RedirectResolution("/helo.jsp");
}
}
ここでは、メッセージを保管するためにmessagesというprivateフィールドを用意しています。これは次のように書かれています。
@Session private String result; @Session private String input1; @Session private List<String>messages = new ArrayList<String>();
この@Sessionというアノテーションをつけることで、このフィールドがセッションに保管されるようになります。プラグイン・ライブラリのセッション機能は、ActionBeanをそのままセッションに置くのではなく、このように「指定したフィールドだけがセッションに置かれるようになる」というものなのです。
後は、セッション利用のための特別な操作などはまったくありません。submitでは、送られてきたテキストをListの冒頭に追加しているだけで、フィールドをセッションから取り出したり保管したりする処理は一切不要です。その他のフィールドと同じように、ただ値を操作しているだけでよいのです。
