QA@IT

【Struts】multiboxのchekedについて

9809 PV

初めてStrutsで開発してます。
画面表示時にchekedの状態で表示させたいのですがどうしてもできません。

チェックボックス自体は動的に複数作成し表示します。
現在のソースは下記のようになります。

■java
// ValueBeanは value=no(1~100が入る)、label=チェックボックス用ラベル値
ArrayList customerItems = new ArrayList();

// noには1~100の値
String[] Checks = {1,2,3,4,5・・・・・};

■jsp
logic:iterate id="item" name="customerItems"
html:multibox property="Checks " value="${item.value}" /
bean:write name="item" property="label"/
/logic:iterate

■表示イメージ
□あああ □いいい □ううう □えええ □おおお ・・・

いろいろと調べてみましたがどうしてもmultiboxについて理解できません。
上記の表示イメージで表示することはできるのですが、chekedの状態で表示することが
どうしてもできません。もうかれこれ5日以上、これで悩んでいます。
どなたかどうか助けていただけないでしょうか?

回答

コードの情報が不完全なのでどういうコードになっているかわかりません。

  • ValueBean とは?customerItemsの要素はこのクラス?
  • 「// noには1~100の値」とあるが、String[] Checks = {1,2,3,4,5・・・・・};String[]
  • Checksが大文字なのでおかしい。(変数はchecksで getterが getChecks などになるはず)

とりあえずサンプルコードを提示、そのあとサンプルコードの簡単な説明と、質問のコードの直し方を示します。

サンプルコード

Welcome.jsp

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

<jsp:useBean id="sampleForm"
  class="Sample.MyActionForm"
  scope="request"/>

<html:html>
<head>
<title><bean:message key="welcome.title"/></title>
<html:base/>
</head>
<body bgcolor="white">
<html:form action="/Welcome.do" method="post">
    <logic:iterate id="loop" name="sampleForm" property="checkBoxValues">
        <html:multibox property="checks"><bean:write name="loop"/></html:multibox><bean:write name="loop"/><br/>
    </logic:iterate>
</html:form>

<h3><bean:message key="welcome.heading"/></h3>
<p><bean:message key="welcome.message"/></p>

</body>
</html:html>

MyActionForm.java

package Sample;

import org.apache.struts.action.ActionForm;

public class MyActionForm extends ActionForm {

    private String[] checkBoxValues = {"1", "2", "3", "4" };
    public String[] getCheckBoxValues(){
        return checkBoxValues;
    }

    private String[] checks = {"3", "2" };
    public String[] getChecks( ){
        return checks;
    }

}

struts-config.xml(抜粋)

action-mapping

        <action
            name="sampleForm"
            path="/Welcome"
            forward="/pages/Welcome.jsp"/>

form-bean

    <form-bean
        name="sampleForm"
        type="Sample.MyActionForm" />

サンプルの説明

まず、以下のproperty属性に指定しているものが状態の保存先になります。

<html:multibox property="checks"><bean:write name="loop"/></html:multibox><bean:write name="loop"/>

もっと単純な例としてActionForm側で

String[] checks = new {"1"};
public String[] getChecks(){ return checks; };

としていたとき、

<html:multibox property="checks">1</html:multibox>見出し1
<html:multibox property="checks" value="1"></html:multibox>見出し1

上記は両方ともチェックがついたチェックボックスが生成されます。

<html:multibox property="checks">2</html:multibox>見出し2
<html:multibox property="checks" value="2"></html:multibox>見出し2

上記は両方ともチェックはつきません(checksの要素に "2"がいないから)。


質問のコードを直すには

現在あなたのコードでは

<html:multibox property="Checks " value="${item.value}" />

としていて、(このChecksが大文字なのも間違いかな)
property に指定している checksは "1" ~ "100" を格納した String配列です。
これは「1~100が選択されている」状態を表します。

一方、item.valueとは ValueBeanの valueプロパティなのでしょうが、customerItemsの中身が説明されていないのでよくわかりません。

この状態からとりあえず、チェックがついた状態のチェックボックスを出力したいなら

ValueBeanの getValue() が 配列ではなくStringを返し、
customerItemsには valueが "1" な ValueBeanが少なくとも一つは格納されていて、

ActionFormで

    private String[] checks = {"1"};
    public String[] getChecks(){
        return checks;
    }

となっていれば

<logic:iterate id="item" name="customerItems">
  <html:multibox property="checks"><bean:write name="item" value="value"/></html:multibox>
  <bean:write name="item" value="label"/><br/>
</logic:iterate>

で、チェックされたチェックボックスが出力されるのではないかと思います。
value="${item.value}" もあってたかどうか不安なので、multiboxのvalueの指定は上記の様にしてみてください。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。