Ajax通信処理の流れを整理する
2つある<stripes:layout-component>タグの1つ目でヘッダー部分を、2つ目で実際にボディに表示されるコンテンツをそれぞれ記述してあります。ヘッダー部分では、まずjQueryのライブラリを読み込むタグを用意します。
<script type="text/javascript"
src="${pageContext.request.contextPath}/js/jquery.js"></script>
${pageContext.request.contextPath}でこのWebアプリケーションのURLを取得し、それに"/js/jquery.js"を付け足してjquery.jsのURLを設定しています。Webアプリケーションがどのような場所に配置されても正しくライブラリのパスが得られるようにしておくわけです。
続いて、<script>タグでJavaScriptのスクリプトを記述しておきます。ここでは送信ボタンをクリックすると呼び出される「invoke」関数でフォームの内容をシリアライズし、jQueryのAjax機能を利用する処理を用意しています。$.getが、その部分です。ここでform.actionのアドレスにparams(フォームの内容をシリアライズしたもの)をパラメータとして渡してAjax通信を行っています。フォームでは、beanclass="jp.codezine.HeloActionBean"としているため、HeloActionBeanに用意されているデフォルトハンドラ・メソッドで処理されるはずです。
通信結果は、callback関数で処理されます。ここでは、$('#msg').text(result);で得られた結果をmsgというIDのタグにテキストとして表示させています。すなわち、Ajaxでアクセスする先では、表示する内容をテキストとして出力するように設計すればよいことになります。
ActionBeanクラスの作成
では、続いてActionBeanクラスを用意しましょう。これも、前回のサンプル「HeloActionBean」を修正して利用します。次のように書き換えてください。
package jp.codezine;
import java.io.*;
import java.util.*;
import net.sourceforge.stripes.action.*;
public class HeloActionBean implements ActionBean {
private ActionBeanContext context;
private String result;
private String input1;
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() {
return new StreamingResolution("text", new StringReader("Result: " + input1));
}
}

完成したら、実際にhelo.jspにアクセスし、フォームを送信してみましょう。Ajaxを利用してサーバにアクセスし、結果を表示します。Ajaxを利用するためページ遷移もせず、その場で表示が変わるのが分かります。
StreamingResolutionとStringReader
次の1行で、submitメソッドによるAjaxアクセス時の処理を行っています。
return new StreamingResolution("text", new StringReader("Result: " + input1));
ここでは、StreamingResolutionインスタンスというものを作成し、returnしています。ハンドラ用のメソッドはResolutionインスタンスを返すようになっていますが、このResolutionは、ハンドラ実行後のレスポンスとなる処理をラップするためのインターフェースで、さまざまなクラスが用意されています。先のサンプルで登場したForwardResolutionはフォワードで指定URLにアクセスするためのResolutionでした。ここでのStreamingResolutionは、ストリームデータを出力するためのクラスです。
引数にはコンテンツタイプとInputStream/Readerインスタンスを渡します。ここではStreamReaderを渡し、そのテキストを出力させています。JSPによるページなどを使わず、ActionBeanのハンドラメソッドから直接データを出力したい場合には、このようにStreamingResolutionを利用するのがよいでしょう。
