SHOEISHA iD

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

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

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

続 Struts 2入門

Struts 2の同期処理を手助けするExecuteAndWaitインターセプタ

続 Struts 2入門(1)

自動的にリロードを行うJSP

 先ほどのwait.jspにcountの内容を出力するよう、リスト7のよう書き換えます。今回はcountをEL(Expression Language)式で count を出力するようにします。EL式を使いますので、pageディレクティブにて、isELIgnored属性をfalse、つまりEL式を使用するよう宣言します。

 コンテナによってはisELIgnored属性のデフォルト値は異なります。Tomcat5.5ではtrueで、Tomcat6.0ではfalseです。

 このcountの値はActionのcountの値で、つまり現在のcountの値を1秒おきに出力するようになります。

リスト7 wait.jsp(修正後)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html lang="ja">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta http-equiv="refresh" content="1;url=<s:url />">
    </head>
    <body>
        処理中です… ${count}
    </body>
</html>

 修正したら、早速アプリケーションを起動してブラウザで確認してみましょう。http://localhost:(ポート番号)/(WAR名)/xnw/download.actionにアクセスします。

例:
http://localhost:8080/ExecAndWaitSample/xnw/download.action

 成功すると、「処理中です…」の右側に数字がカウントアップされていき、カウンタ表示が9の後、counter.txtがダウンロードされます(ブラウザの設定によっては直接ブラウザへテキストが出力されることもあります)。

図4 リクエスト後の処理中の画面
図4 リクエスト後の処理中の画面
図5 処理完了後、ファイルがダウンロードされた画面
図5 処理完了後、ファイルがダウンロードされた画面

 このファイルをテキストエディタで開くと、次のように、Actionクラスで生成したカウントアップの内容になります。

図6 ダウンロードしたテキストファイル
図6 ダウンロードしたテキストファイル

 以上のように、画面へ通知するパラメータやその他オブジェクトも、ActionクラスのフィールドにあるだけでJSPで参照することができます。複雑な設定や同期処理を組み込むことなく実装をすることができますので、このサンプルをより発展させ、AJAXを使ったより優れたインターフェイスを持つ画面を実現するのも容易になるでしょう。

まとめ

 ExecuteAndWaitインターセプタはセッション単位で稼動し、リクエストのあったActionクラスの処理経過によって出力を自動的にハンドリングします。

 ExecuteAndWaitインターセプタを稼動する対象のActionが起動されると、自動的に同期用スレッド(注1)が生成されActionはHTTPセッションへバインドされます(注2)。そのスレッドはStruts 2によって自動管理され、正常/異常を問わず処理が終わるまで存在します。スレッドはセッションごとに生成されるので同一のクライアントが複数の同一処理をすることはありません。

注1

 Struts 2内部ではBackgroundProcessという名前で扱われます。

注2

 バインド名は __アクションクラス名/org.apache.struts2.interceptor.BackgroundProcess@オブジェクトID。

図7 ブラウザとExecuteAndWaitインターセプタの動き
図7 ブラウザとExecuteAndWaitインターセプタの動き

 同じリクエストをするだけで、処理中であれば処理中画面を、処理が終われば処理完了の画面を出すように自動的にハンドリングされますので、本来実装したい機能以外に行わなければならない作業はかなり軽減されることになります。

 また仕様上注意しなければならない点としては、HTTPセッションを必ず利用しますので、実装する処理がメモリを多大に消費するものは避けなければなりません。例えば、大量の検索結果をそのままメモリに蓄えてしまうような実装は避け、さらには実運用で扱われるセッション数と処理時間の設計との兼ね合いが重要になります。

次回予告

 今回はかなり特徴的なインターセプタを紹介しました。次回は、Struts 2のインターセプタについてさらに詳しく紹介していきます。提供されているインターセプタがすべて使われるわけではなく、用途に応じた使い分けとカスタマイズが必要になりますので、実例を交えながら使い方や利用頻度の高いものを紹介していきます。

参考資料

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
続 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/4912 2010/03/16 14:00

イベント

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

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

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

メールバックナンバー