[ 2816 ] [Struts2]セッションの操作

Struts2のセッション(HttpSession)操作についてです。
Struts2系列なら操作方法は同じですが、文中で表記しているアノテーションはConventionプラグインを利用していますので、2.1以降を対象とします。

セッションを操作するために必要なこと

Actionクラスからセッションを操作するためには次の方法があります。

・ScopedModelDrivenを使う
・ScopeInterceptorを使う
・SessionAwareを実装する
・ActionContext.getContext().getSession()を使う



元記事はこちら:[ 2730 ] [Struts2]HTTPセッションに関する操作

私の場合は、SessionAwareを一番多く使います。理由としては…

・セッションの操作のみに注力できる
・java.util.Map形式なので操作は割と簡単
・インターセプタを修正しなくて済むので設定が煩わしくない



…と、すごく楽です。SessionAwareを使うときに必要な作業は、これだけです。

・SessionAwareを実装し、実装メソッドを1つ用意するだけ



では実装手順をコードで追ってみます。まずは普通のActionクラスを用意します。
import com.opensymphony.xwork2.ActionSupport;

public class SessionSampleAction extends ActionSupport {

}

次にSessionAwareインタフェースを実装します。
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class SessionSampleAction extends ActionSupport implements SessionAware {

	@Override
	public void setSession(Map session) {
		// TODO 自動生成されたメソッド・スタブ
		
	}
}

Eclipseの自動補完機能を使うと、このようになります。

SessionAwareは、HttpSessionを直接編集するのではなく、HttpSessionの属性をMapに置き換えたものを編集します。


では実装例を以下に。
せっかくなので、Actionクラスを起動するurlと、表示するJSPも設定します。
import java.util.Map;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

@Results({
	@Result(name = "success", type = "dispatcher", location = "session.jsp"),
})
public class SessionSampleAction extends ActionSupport implements SessionAware {

	@Action("sessionPut")
	public String sample() throws Exception {
		session.put("sampleKey","sampleValue");

		return "success";
	}

	@Override
	public void setSession(Map session) {
		this.session = session;
	}

	private Map session;
}


セッション内容の表示

JSPでセッションの内容を表示するには、以下の方法で行うのが良いです。
<s:property value="#session.キー名"/>


先ほどのActionの例で格納した値(sessionValue)を表示する方法は、

<s:property value="#session.sampleKey"/>



このように #session を記述し、その後ろにドットをつけてキー名を指定します。

セッションの値を変更する、削除する操作はセッション用のマップを操作するだけ

ActionクラスでSessionAwareを利用したセッションの値の格納、変更、削除は、java.util.Mapを操作するのと全く同じ操作で、格納や変更、削除が行えます。

格納と変更は : put("キー名","値")
削除 : remove("キー名")

これだけです。Actionクラスでの具体的な記述例は…
public class SessionSampleAction extends ActionSupport implements SessionAware {

	@Action("sessionPut")
	public String sample() throws Exception {
		session.put("sampleKey","sampleValue");

		return "success";
	}

	@Action("sessionModify")
	public String modify() throws Exception {
		session.put("sampleKey","modify");

		return "success";
	}

	@Action("sessionRemove")
	public String remove() throws Exception {
		session.remove("sampleKey");

		return "success";
	}

	@Override
	public void setSession(Map session) {
		this.session = session;
	}

	private Map session;
}

先ほどのActionクラスに、modify()とremove()を追加しました。それぞれ、sessionModify、sessionRemoveとアノテーションでURLを決めています。表示する画面は一緒ですね。

SessionAwareインタフェースを使わずにMap形式で利用したい場合

SessionAwareを毎回使いたくない場合、Actionクラスのフィールドを追加したくない場合は、以下の方法でローカル変数での利用が可能です。

Map map = ActionContext.getContext().getSession();



セッションIDの取得とHttpSessionオブジェクトの取得

SessionAwareやActionContextを使って利用するセッションのMapはHttpSessionオブジェクトそのものではないので、例えばセッションIDを取得したり、セッションそのものの破棄はできません。

HttpSessionオブジェクトを取得する方法は2つあります。
1つは先ほどと同じようにHttpSessionを取得して、invalidate()メソッドを呼ぶ方法、もう一つはStruts2のSessionMapクラスを使うやや特殊な方法です。
# どちらも動きは同じです。

1. HttpSessionを取得してinvalidate()を呼ぶ方法。
この方法は、HttpServletRequestオブジェクトを取得できるServletRequestAwareを実装し、そこからセッションを直接取得してinvalidate()します。
public class SessionSampleAction extends ActionSupport 
  implements SessionAware , ServletRequestAware {

@Action("sessionClear")
	public String sessionRemove() throws Exception {
		HttpSession httpSession = request.getSession(false);
		if ( httpSession != null ) {
			httpSession.invalidate();

		}return "success";
	}
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	private HttpServletRequest request;
}

2. Struts2のSessionMapを使う方法
HttpServletRequestを取得せずに利用する方法も用意されています。やや特殊ですが、以下の方法で簡単にできます。
((SessionMap)session).invalidate();

SessionMapはorg.apache.struts2.dispatcher.SessionMapのことです。

セッションを破棄して新規にセッションを立てる方法は…

実は別の方法があり、1つのActionクラスだけで完結できませんので、別途記事を書きます。





loading...