自動的にリロードを行う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秒おきに出力するようになります。
<%@ 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がダウンロードされます(ブラウザの設定によっては直接ブラウザへテキストが出力されることもあります)。
このファイルをテキストエディタで開くと、次のように、Actionクラスで生成したカウントアップの内容になります。
以上のように、画面へ通知するパラメータやその他オブジェクトも、ActionクラスのフィールドにあるだけでJSPで参照することができます。複雑な設定や同期処理を組み込むことなく実装をすることができますので、このサンプルをより発展させ、AJAXを使ったより優れたインターフェイスを持つ画面を実現するのも容易になるでしょう。
まとめ
ExecuteAndWaitインターセプタはセッション単位で稼動し、リクエストのあったActionクラスの処理経過によって出力を自動的にハンドリングします。
ExecuteAndWaitインターセプタを稼動する対象のActionが起動されると、自動的に同期用スレッド(注1)が生成されActionはHTTPセッションへバインドされます(注2)。そのスレッドはStruts 2によって自動管理され、正常/異常を問わず処理が終わるまで存在します。スレッドはセッションごとに生成されるので同一のクライアントが複数の同一処理をすることはありません。
Struts 2内部ではBackgroundProcessという名前で扱われます。
バインド名は __アクションクラス名/org.apache.struts2.interceptor.BackgroundProcess@オブジェクトID。

同じリクエストをするだけで、処理中であれば処理中画面を、処理が終われば処理完了の画面を出すように自動的にハンドリングされますので、本来実装したい機能以外に行わなければならない作業はかなり軽減されることになります。
また仕様上注意しなければならない点としては、HTTPセッションを必ず利用しますので、実装する処理がメモリを多大に消費するものは避けなければなりません。例えば、大量の検索結果をそのままメモリに蓄えてしまうような実装は避け、さらには実運用で扱われるセッション数と処理時間の設計との兼ね合いが重要になります。
次回予告
今回はかなり特徴的なインターセプタを紹介しました。次回は、Struts 2のインターセプタについてさらに詳しく紹介していきます。提供されているインターセプタがすべて使われるわけではなく、用途に応じた使い分けとカスタマイズが必要になりますので、実例を交えながら使い方や利用頻度の高いものを紹介していきます。



