複数項目を選択可能な場合の処理
<select>タグは、multiple属性を指定することで複数の項目を選択可能にできます。実際にやってみましょう。まず、JSPの<stripes:select>タグ部分を以下のように修正します。
<stripes:select name="sel" multiple="true">
<stripes:options-collection collection="${optionmodel.options}"
label="label" value="value" />
</stripes:select>
ここでは、multiple="true"という属性を追記することで、複数項目の選択が可能なリストにしています。実際にやってみると分かりますが、このmultipleを用意するだけで、表示されるリストは自動的に(プルダウンメニューの形ではなく)一覧リストのような形状に変わります。複数項目を選択可能にした時点で表示項目数が調整されるのです。
続いてActionBean側を修正しましょう。ここでは、選択された項目すべてを表示する処理を用意してみます。
package jp.codezine;
import java.util.*;
import net.sourceforge.stripes.action.*;
public class HeloActionBean implements ActionBean {
private ActionBeanContext context;
private String result;
private String[] sel;
public String[] getSel() { return sel; }
public void setSel(String[] sel) { this.sel = sel; }
……略……
@DefaultHandler
public Resolution submit() {
String result = "";
for(String s : sel) result += s + " ";
this.result = "あなたの入力した値:" + result;
return new ForwardResolution("/helo.jsp");
}
}

ここでは、<stripes:select>の値を保管するプロパティは、String配列に変わっています。これで、選択した全項目が配列にまとめて保管されるようになるのです。後は、submitメソッドでこの配列から順に値を取り出し処理していくだけです。
ActionBeanの利用
JSPのページ内から利用できると非常に助かるものにActionBeanがあります。ActionBeanはフォームを送信した際の処理などを行うのに用いられますが、フォームとは関係なく「サーバ側で用意した処理をJSP側で呼び出す」という場合に、ActionBeanをそのまま利用できれば非常に助かります。これは、次のようなタグを用意することで可能になります。
<stripes:useActionBean beanclass="クラス" var="変数名" />
beanclassでActionBeanのクラスを指定し、varでインスタンスを保管する変数名を指定します。例えば、次のようにすれば、HeloActionBeanを「helo」という変数として利用できるようになります。
<stripes:useActionBean beanclass="jp.codezine.HeloActionBean" var="helo" />
msgプロパティの値を出力したければ、${helo.msg}というように、普通のBeanと同じ感覚で記述できます。これもフォーム関係のタグとあわせて覚えておきたいタグでしょう。
Stripesのレイアウトについて
続いて「ページのレイアウト」について考えてみましょう。JSPでは、<jsp:include>などを利用して他のページを読み込むことで、複数のJSPファイルを組み合わせてページを構成できます。Stripesでは、さらに強力なレイアウト用のタグが用意されています。それは次のようなものです。
- <stripes:layout-definition>
- <stripes:layout-render>
- <stripes:layout-component>
レイアウトの定義を記述するものです
特定のレイアウトを使用しページをレンダリングします
レイアウトに部品として組み込むコンポーネントを設定するものです
Stripesでは、レイアウトを定義したJSPページを用意しておき、そのレイアウトをWebページ内からロードして使用できます。このとき、非常に大きな役割を果たすのがレイアウトコンポーネントです。Webページ内に<stripes:layout-component>を使ってコンポーネントを定義すると、レイアウト内に用意した<stripes:layout-component>タグにその内容が自動的にはめ込まれレンダリングされます。
