SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

続 Struts 2入門

Struts 2のインターセプタによるサーブレット属性の操作

続 Struts 2入門(3)


サーブレット属性に関するもの

 ここで紹介するインターセプタは、サーブレット属性(リクエスト属性、セッション属性)に対して変更や利便性を向上する機能を提供してくれます。

(1)Cookie Interceptor

 Cookieの値をMap型のフィールドへ自動的に格納します。Actionクラスで使う場合には、次のルールに従います。

  • Cookie Interceptorの利用を宣言する
  • CookieAwareインターフェイスを実装する

 注意点としては、Cookieの参照のみが行えることです。ブラウザのCookieを更新する処理はこのインターセプタでは行えません。Cookieを更新する場合にはブラウザに対してレスポンスを返さなければいけないので、Struts 2ではHttpServletResponseを取得できるResponseAwareも実装します。

 では、Cookieを参照・更新する具体的な方法について、サンプルを見てみましょう。

[リスト1]CookieSampleAction.java(抜粋)
@Namespace(value="/cookie")
@ParentPackage(value="struts-default")
@InterceptorRefs({
  // Cookie Interceptorの設定 … (A)
  @InterceptorRef(value="cookie" ,
      params={"cookiesName", "sampleCookie,addCookie" ,
          "cookiesValue" , "*"}),
  // デフォルト定義インターセプタ群
  @InterceptorRef("defaultStack"),
})
@Results({
  @Result(name="success" , location="success.jsp"),
})
public class CookieSampleAction extends ActionSupport implements CookiesAware ,ServletResponseAware{
  public static final Logger log = Logger.getLogger(CookieSampleAction.class);

  @Action("start")
  public String start() throws Exception {
    return "success";
  }

  /**
   * 実行メソッド。
   */
  @Action("execute")
  public String execute() throws Exception {
    // 現在のクッキーをログへ出力
    log.debug("cookie:" + cookie);

    // リクエストパラメータからの値をクッキーMapへバインド
    // ※Mapへバインドしても出力されるクッキーへ影響がないことの確認
    cookie.put("cookie2", "map add value.");

    // クッキーを生成し、HTTPレスポンスへ出力
    Cookie newCookie = new Cookie("addCookie", (new Date()).toString() );
    response.addCookie(newCookie);
    Cookie newCookie2 = new Cookie("sampleCookie" , sampleCookie);
    response.addCookie(newCookie2);
    
    return "success";
  }

  /**
  * 現在のクッキーをMapで取得。
  * ※CookiesAware必須実装。
  */
  @SuppressWarnings("unchecked")
  public void setCookiesMap(Map cookie) {
    this.cookie = cookie;
  }
  private Map<String,Object> cookie;

  /**
  * サーブレットレスポンスのインスタンスを取得。
  * ※ServletAware必須実装。
  */
  public void setServletResponse(HttpServletResponse httpservletresponse) {
    this.response = httpservletresponse;
  }
  private HttpServletResponse response;
}

 CookieAwareを実装することで、Cookieの値をActionクラスのフィールドとして扱え、ブラウザのCookieを取得できます。Cookieをブラウザへ出力する場合には、ResponseAwareを実装することで、HttpServletResponseもActionクラスのフィールドとして扱うことができ、response.addCookie( newCookie )でCookieを出力できます。なお、Cookie Interceptorの設定は、アノテーションで設定されているリスト1の(A)の部分になります。

 今回もアノテーションを使ったインターセプタの定義を行っています。ちなみに、アノテーションでインターセプタを扱う場合には、インターセプタごとに定められた固有のパラメータを設定して操作をします。パラメータはparamsで指定し、その指定方法は「項目名、値、項目名、値・・・」の順序で記述していきます。

 今回の例では、cookiesNameの後の値で、Actionクラスで扱うCookieの名前をカンマつなぎで列挙し、cookiesValueの後の値で、取り扱うCookieの値を指定します。アスタリスク "*" ですべての値として省略も可能です。上記の例の場合、取り扱うCookieは、sampleCookie、addCookieの2つの値で、値に関しては"*"で指定されているので制限はありません。またcookiesValueに"*"以外の値を設定して、特定の値のときのみ参照するといったこともできます。

 では、サンプルを稼動させてみましょう。http://127.0.0.1:8080/interceptors/cookie/execute.actionを起動すると次の画面が表示されます。

図1 Cookieインターセプタの起動画面
図1 Cookieインターセプタの起動画面

 テキストボックスに半角英数で値を入力し[Cookie記録]ボタンを押します。するとCookieが出力されるので、実際にブラウザのCookieを確認してみましょう。

図2 保存されたCookieの確認
図2 保存されたCookieの確認

 図2のように、先ほど入力した値がCookieへ格納されていることを確認できます。

次のページ
(2)Clear Session Interceptor

この記事は参考になりましたか?

続 Struts 2入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 東 浩二(アズマ コウジ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5124 2010/06/25 12:56

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー