目次へ

2.4. パラメータ値の受け取り

この節では、HTTPリクエストからパラメータを読み取ってActionFormに設定する部分について、もう少し詳しく説明します。1節の例では、テキストフィールドに入力されたテキストデータをStringとして扱っていました。intなど他のデータ型では扱えないのでしょうか。

ActionFormのプロパティがint等の数値型であり、該当するHTTPリクエストのパラメータ値が数値と解釈できる場合には、その値がプロパティ値として設定されます。数値として解釈できない場合には、0が設定されます。以下のサンプルにおいて、フォームに「10」や「100」が入力された場合には、該当する数値がプロパティに設定されます。「test」といった数値として解釈できない文字列が入力された場合には、「0」が設定されます。double, floatといった浮動小数点においても同じです。

...
<input type="text" name="price">
...
public class ProductForm extends ActionForm{
  ...
  public void setPrice(int price){ ... }
  public int getPrice(){ ... }
  ...
}

プロパティがbooleanである場合には、該当するHTTPリクエストのパラメータ値が「on」「true」「yes」であった場合に(大文字小文字の区別はしない)、trueが設定されます。それ以外の場合にはfalseが設定されます。チェックボックスで利用するのが最適です。以下はその例です。

...
<input type="checkbox" name="discount" value="true">
...
public class ProductForm extends ActionForm{
  ...
  public void setDiscount(boolean discount){ ... }
  public boolean getDiscount(){ ... }
  ...
}

同じパラメータ名で複数の値が送られてくる場合はどのようになるのでしょうか?以下のようなHTMLフォームがそれにあたります。

...
<select name="shops" multiple>
  <option>東京店</option>
  <option>名古屋店</option>
  <option>大阪店</option>
</select>
...

上記のような場合に対応して、ActionFormのプロパティに配列を指定する事も可能です。配列には送られてきたパラメータ値の数だけ、要素が設定されます。

public class ProductForm extends ActionForm{
  ...
  private String[] shops=null;
  public void setShops(String shops[]){
    this.shops=shops;
  }
  public String[] getShops(){
    return(shops);
  }
  ...
}

<select>タグで1つ要素が選択された場合には、shopsパラメータ値は1つ送られてくるので、setShopsメソッドの引数配列の要素数は1となります。2つ要素が選択された場合には、配列の要素数は2になります。またこの例ではStringの配列となっていますが、intやbooleanの配列でも構いません。その場合の解釈規則は、配列で無い場合と同じになります。

...
<input type="text" name="shops[0]"><br>
<input type="text" name="shops[1]"><br>
<input type="text" name="shops[2]"><br>
...

上記のようなHTMLフォームから、配列でパラメータ値を受け取る事も可能です。このパラメータに対して値を受け取るActionFormのメソッドは、以下のようになります。setterメソッドは2つ引数を取り、1つ目で配列のインデックス、2つ目でパラメータ値を指定します。getterメソッドは1つ引数を取り、1つ目で配列のインデックスを指定します。このとき対応する配列は、十分なサイズを指定して初期化をしなければならに点に注意してください。

public class ProductForm extends ActionForm{
  ...
  private String[] shops=new String[3];
  public void setShops(int index, String value){
    shops[index]=value;
  }
  public String getShops(int index){
    return(shops[index]);
  }
  ...
}

またこの場合は以下のようなsetter/getterメソッドでもパラメータ値を受け取ることが可能です。getterメソッドで配列の値を取り出し、取り出した配列に対してパラメート値を設定するからです。setterメソッドは使われないですが必要です。なおこの場合にも配列のサイズに注意してください。

public class ProductForm extends ActionForm{
  ...
  private String[] shops=new String[3];
  public void setShops(String[] shops){
    this.shops=shops;
  }
  public String[] getShops(){
    return(shops);
  }
  ...
}

以下のようなHTMLフォームから値を受け取ることも可能です。

...
<input type="text" name="tel(home)"><br>
<input type="text" name="tel(mobile)"><br>
...

この場合にはjava.util.Map型のプロパティと、以下のようにキーを引数に持つsetter/getterメソッドを定義します。ここでキーはパラメータ値の括弧"()"内の部分に相当し、プロパティ名は括弧を除いた部分に相当します。この例では「tel」がプロパティ名で、「home」「mobile」がキーとなります。

import java.util.Map;
import java.util.HashMap;
public class ProductForm extends ActionForm{
  ...
  private Map tel=new HashMap();
  public void setTel(String key, String value){
    tel.put(key, value);
  }
  public String getTel(String key){
    return((String)tel.get(key));
  }
  ...
}

配列の場合と同様に、以下のようなsetter/getterメソッドでも値を受け取ることができます。ただしこの場合にも、getterメソッドしか使用されません。getterメソッドでMapを取り出し、それに対して値を設定するからです。

import java.util.Map;
import java.util.HashMap;
public class ProductForm extends ActionForm{
  ...
  private Map tel=new HashMap();
  public void setTel(Map tel){
    this.tel=tel;
  }
  public Map getTel(){
    return(tel);
  }
  ...
}

(実習課題3)

実習課題2を改良しなさい。

  • 社員データに以下の要素を加える事。
    • 社員番号(数値)
    • 性別(boolean)
  • 複数の住所を持つ社員に対応させる事。また該当するActionFormのプロパティは配列とする事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp