Strutsのhtmlタグを使う

SELECTタグにリストから各項目のラベルと値を設定するには、 JSTLのforEachタグを使って、 リスト変数から要素を取り出す方法があります。 下の例は、セッション属性 "rsetArea" で参照できる、 各要素が{値 ラベル}の2要素のString[] からなるリストオブジェクトから取り出しているものです。

<html:select property="areaCode">
  <c:forEach var="e" items="${sessionScope.rsetArea.data}">
    <option value="<c:out value='${e[0]}'/>"><c:out value='${e[1]}'/></option>
  </c:forEach>
</html:select>

しかしこれでは、html:selectタグが属するフォームアクションBeanのスコープがsession だった場合にも、以前の選択状態を表示することができません (常に1番上が選択された状態になる)。 このような細かい部分も対応するには、html:optionsCollectionタグを使います。

html:optionsCollectionタグは、 「ラベル」と「値」をそれぞれプロパティとして持つBeanオブジェクトのリストを利用します。 そのようなBeanは自分で定義してもいいのですが、 org.apache.struts.util.LabelValueBean が用意されているので、これを使うことにします。

import java.util.ArrayList;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.util.LabelValueBean;

public class ExampleAction extends Action {
    private static final String attrName = "AreaList";
    // ...

    public ActionForward execute(
        ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) throws Exception {

        HttpSession session = request.getSession();
        if(session.getAttribute(attrName) == null){
            String[][] rsetArea = // リストを取得する
            ArrayList alist = new ArrayList();
            for(int y=0; y<rsetArea.getRowCount(); y++){
                String label = rsetArea[y][1];
                String value = rsetArea[y][0];
                alist.add(new LabelValueBean(label, value));
            }
            session.setAttribute(attrName, alist);
        }
        return mapping.findForward("success");
    }
}

LabelValueBeanの使い方には2通りあって、上の例は、 LabelValueBeanのリストを独立したセッション属性(AreaList)に格納しています。 これとは別に、 html:selectタグに一覧を表示するフォームアクションBeanの中に、 このLabelValueBeanのリストをプロパティとして持たせることもできます。 次で示すように、少しだけhtml:optionsCollectionタグの使い方が両者で異なります。

<html:select property="areaCode">
  <html:optionsCollection name="AreaList" label="label" value="value" />
</html:select>

これは、独立したセッション属性にリストオブジェクトを格納した場合の例で、 name="AreaList"がそれを示しています。 フォームアクションBeanの中に、リストオブジェクトのプロパティを持たせる場合は、 name属性の代わりにproperty属性を用いて、property="collection"のようになります (この例はフォームアクションBeanからgetCollection()でリストオブジェクトが取得できることを示します)。
label属性とvalue属性は、それぞれリストの各要素であるBeanの、 ラベルと値をどのプロパティから取り出すかを指定するもので、 LabelValueBeanの場合はそれぞれ"label"と"value"で固定です。 自分でBeanを設計した場合に別の名前をつけたならそれを指定します。 またlabel属性とvalue属性のデフォルト値はそれぞれ"label"と"value" なので、LabelValueBeanを使った場合にはこれらの属性は省略することもできます。

Server Side Java Index Top

(first uploaded 2004/08/07 last updated 2004/08/07, URANO398)

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!