目次へ

14.4. indexedListProperty

indexedListPropertyはActionForm Beanのプロパティがオブジェクトの配列である場合に使用する<field>要素の属性です。例えば以下の様なActionForm Beanを考えます。

package sample;
  
import org.apache.struts.validator.ValidatorForm;
  
public class OrderForm extends ValidatorForm{
  private Product[] productList=new Product[10];
  
  public void setProductList(Product[] productList){
    this.productList=productList;
  }
  
  public Product[] getProductList(){
    return(productList);
  }
}
package sample;
  
public class Product{
  private int productID=0;
  private int amount=0;
  
  public void setProductID(int productID){
    this.productID=productID;
  }
  
  public int getProductID(){
    return(productID);
  }
  ...
}

このActionForm Beanを使用したときに、以下のようにvalidation.xmlを設定してvalidatorを働かせると、OrderFormのproductListプロパティに格納されている、それぞれのProductに対してチェックをかけることができます。

<field property="productID" indexedListProperty="productList" depends="integer">
  <msg name="integer" key="productID.invalidate" />
</field>

この場合、エラーオブジェクトはエラーとなったオブジェクトのインデックスを用いて、「(indexedListPropertyの値)[インデックス].(propertyの値)」という名前で登録されます。例えば3番目のProductオブジェクトでエラーが発生したとすると、以下の<html:errors>タグでエラーメッセージを表示させることができます。

<html:errors property="productList[2].productID" />

またindexedListPropertyを使用したときにrequiredifルールを適応する場合には、validation.xmlで以下のようにfieldIndexed変数を指定します。

<field property="amount" indexedListProperty="productList" depends="integer, requiredif">
  <msg name="integer" key="amount.invalidate" />
  <msg name="requiredif" key="amount.required" />
  <var>
    <var-name>field[0]</var-name>
    <var-value>productID</var-value>
  </var>
  <var>
    <var-name>fieldIndexed[0]</var-name>
    <var-value>true</var-value>
  </var>
  <var>
    <var-name>fieldTest[0]</var-name>
    <var-value>NOTNULL</var-value>
  </var>
</field>

このfieldIndexed変数は、field変数で指定したプロパティもまた、indexedListPropertyで指定されたリストに格納されているオブジェクトのプロパティかどうか指定します。trueを指定した場合には、リストに格納されているオブジェクトのプロパティであることを意味します。つまり例の場合は、productIDもamountと同じく、リストに格納されているオブジェクトのプロパティであることになります。もしfalseを指定した場合には、field変数で指定されたプロパティは、もとのActionForm Beanのプロパティであることになります。

indexedListPropertyには1つ制約があります。リスト内のオブジェクトで1つでも検証エラーとなると、以降のオブジェクトは検証されません。例の場合、最初のProductオブジェクトでエラーが発生すると、2番目以降のProductオブジェクトは検証されません。例え複数の入力値にエラーがあったとしても最初の1つしのオブジェクトに対応するエラーしか表示できないことになるので、注意してください。

(実習課題3)

Strutsを用いて、以下のWebアプリケーションを作成しなさい。

  • 商品を発注するWebアプリケーション。発注する商品を入力するページと、確認するページだけで良い。
  • 入力する情報は、商品コードと数量の2つ。10商品まで入力できるようにすること。
  • フォーム全体に対応するActionFormと、商品1つ1つに対応するJavaBeanで入力値を管理すること。
  • 商品コードと数量に関する入力条件は以下の通り。入力値のチェックには、validatorの機能を用いること。
    • 商品コードは、英数字5桁。
    • 商品コードが入力された場合には、数量も入力されなければならない。
    • 数量は、1以上100以下の数字。
  • 確認ページでは、入力された情報、商品コードと数量だけで良い。
  • indexedListPropertyを使用しての検証における制約を確認すること。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ