今回のサンプルコード
今回は、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月