今回のサンプルコード
今回は、HTMLを返さないResult Typeと、汎用タグとUIタグを組み合わせたかんたんなサンプルを紹介します。
次の図のメニューのアンケート3をクリックすると、サンプル画面に遷移します。ログイン画面では、前回同様、ユーザーIDには「part4」、パスワードには「wings」を入力します。

今回のアンケート画面はチェックボックスを選択するものです。

チェックボックスの表示には、<s:checkboxlist>タグを用いています。質問が2つあり、それぞれ複数のチェックボックスで該当するものを選択します。確認ボタンをクリックすると、同じ画面で、選択した項目が表示されます。

回答のなかに「ワイン」の文字が含まれていると、ダウンロードボタンが表示され、ちょっとしたテキストがダウンロードできるようになります。

ファイル構造
ファイル構造は、次のようになります。
<ContextRoot> ├ /WEB-INF │ ├ /classes │ │ ├ /part5 │ │ │ └ ViewSample.class(新規追加) │ │ └ struts.xml(変更) │ ├ /lib │ └ web.xml(変更なし) ├ /part5 │ └ viewsample.jsp(新規追加) └ index.jsp(変更なし)
以下が、追加・変更するソース・設定ファイルで、順に説明していくことにしましょう。
- struts.xml
- ViewSample.jsp(アンケート画面)
- ViewSample.java(submit処理、ダウンロード処理)
struts.xml
struts.xmlには、次の定義を追加します。メニューから呼ばれるActionメソッド、submitで呼ばれるActionメソッド、ダウンロードで利用するActionメソッドの3つです。これは説明するまでもないでしょう。
<action name="ViewSample" class="part5.ViewSample">
<result name="success">/part5/viewsample.jsp</result>
</action>
<action name="ViewSampleSubmit" method="submit" class="part5.ViewSample">
<result name="success">/part5/viewsample.jsp</result>
</action>
<action name="Download" method="download" class="part5.ViewSample">
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="contentDisposition">attachment; filename="sample.txt"</param>
</result>
</action>
ViewSample.jsp
ViewSample.jspは、次のようになります。
<s:form action="ViewSample">
<s:checkboxlist label="あなたの好きなお酒は?(複数可)" name="items1"
list="#{ '1':'日本酒', '2':'焼酎', '3':'ワイン','4':'ビール','5':'ウイスキー'}" />
<s:checkboxlist label="どこでお酒を買うことが多いですか?(複数可)" name="items2"
list="#{'スーパー':'スーパー', 'コンビニ':'コンビニ', 'ディスカウントストア':'ディスカウントストア',
'自動販売機':'自動販売機', 'その他':'その他'}" />
<s:submit value="確認" action="ViewSampleSubmit" />
</s:form>
回答:<br />
<s:append id="allItems">
<s:param value="items1" />
<s:param value="items2" />
</s:append>
<s:iterator value="allItems">
<s:property /><br />
</s:iterator>
<s:if test="%{downok}">
<a href="Download.action">ダウンロード</a>
</s:if>
<s:checkboxlist>は、複数のチェックボックスを表示するタグで、ボタンに表示する名称と送信されるデータは、OGNL式のmapオブジェクトで指定します。items1では、submitで数字が送信されることになります。
<s:append>タグは、指定したリスト要素を連結するタグです。この例では、選択されたチェックボックスの値が入ったitems1と items2を連結しています。そして、<s:iterator>タグで、連結したリストから要素を取り出し、<s:property>タグで出力しています。
<s:if>タグは、testで指定した値がtrueかどうかで制御を分岐します。ここでは、downokプロパティがtrueなら、ダウンロードの<a>タグを表示するようにしています。
ViewSample.java
ViewSampleクラスが今回作成するActionクラスです。このクラスのフィールドは、次のとおりです。
// チェックボックス用 private ArrayList<Integer> items1; private ArrayList<String> items2; // ダウンロード用 private InputStream inputStream; // ダウンロードの文字表示フラグ private boolean downok;
<s:checkboxlist>タグのデータ用に、ArrayListを2つ設定しています。ダウンロードの文字表示フラグは、前述したように回答に「ワイン」(送信される値は3)が含まれているとtrueになる変数です。フィールドそれぞれに、ゲッターとセッターを用意しています。
ダウンロードとsubmitのActionメソッドは、次のようになります。
// ダウンロード処理
public String download() {
String tmp = "ワインは...";
this.inputStream = new ByteArrayInputStream(tmp.getBytes());
return "success";
}
public String submit() {
setDownok(false);
try {
// ワインがあるかどうか
for ( Integer i : this.items1 ) {
if ( i == 3 ) {
setDownok(true);
break;
}
}
}
catch(Exception e){
}
return "success";
}
ダウンロード処理では、文字列をByteArrayInputStreamに変換してinputStreamに設定しています。submitの処理は、items1リストに3があるかどうかを判定して、downokに結果を設定しています。
まとめ
今回は、Viewレイヤーの仕組みとして、Result処理とStrutsタグの概要を説明しました。これらは、過去の記事中にもふれていましたので、やや重複する内容だったかもしれません。次回は、Zero Configuration(ゼロ・コンフィグレーション)と呼ばれる機能を中心に解説することにしましょう。
参考資料
- 『Apache Struts』
- 『Struts2入門』(オンライン書籍) 川崎克巳 著、2007年10月
- 『Practical Apache Struts 2 Web 2.0 Projects』 Ian Roughley 著、Apress、2007年11月
- @IT 『@いう間にWebアプリを作れる「Struts 2」入門』 関川晶子 著、2009年1月
