エンタープライズ:特集 2003/06/24 00:00:00 更新

JSPプログラミング入門
第3回:HTMLエンコードが必要なJSPプログラミングの基本 (4/5)

選択フィールド

 選択フィールドである「<SELECT>〜<OPTION>〜</SELECT>」の処理は、「<SELECT>」タグ中にmultipleアトリビュートを指定せず、ユーザーが1つの項目しか選択できない場合には、ラジオボタンの処理と同じである。例えば、次のような3つの選択項目があるとする。

<SELECT name="selfield">
<OPTION value="value1">選択1</OPTION>
<OPTION value="value2">選択2</OPTION>
<OPTION value="value3">選択3</OPTION>
</SELECT>

 この際、選択2が選択されていたとすると、「getParameter("selfield")」の値は「value2」となる。リスト7のようなラジオボタン処理と同じようにして、どの項目が選択されているかを判定できるわけだ。

One Point:
選択フィールドにおいて、ユーザーが何も選択していない場合、「getParameter("フィールド名")」の値がどのようになるかは、Webブラウザ依存である。Webブラウザによって、1番目の項目が選択されているように振る舞うものと、何も選択されていないように振る舞うものがある。何も選択されていないように処理されるWebブラウザの場合には、「getParameter("フィールド名")」値はnullとなる。ちなみにw3cのHTML仕様書によれば、何も選択されていない場合には、1番目の項目が標準選択されるのが正しい。

 しかし、「<SELECT>」タグにmultipleアトリビュートを指定し、ユーザーが複数の項目を選択できるようにした場合には、「getParameter」メソッドを用いることはできない。例えば、次の「<SELECT>」タグがあるとする。

<SELECT name="selfield" multiple>
<OPTION value="value1">選択1</OPTION>
<OPTION value="value2">選択2</OPTION>
<OPTION value="value3">選択3</OPTION>
</SELECT>

 この場合、選択1と選択2が選択されていれば、「getParameter("selfield")」値は、先頭項目である選択1の「value」アトリビュートに設定されている「value1」しか返されない。つまり、選択2が選択されていることを知ることができないのだ。

 そこで複数選択されている場合には、「getParameterValues」メソッドを用いればよい。「getParameterValues」メソッドは、複数項目が選択されている場合、これを配列として得るためのメソッドとして用意されている。

<%
String values[] = getParameterValues("selfield")
%>

 上記のように指定した場合、変数valuesには選択されたすべての項目のvalueアトリビュート値が配列として返される。選択1と選択2が選択されていれば、values[0]の値は「value1」、values[1]の値は「value2」のようになる。

One Point:
配列に設定される項目の順序は、Webブラウザに依存する。w3cの仕様書では、「登場順に設定する」ことを要求するが、これに則らないWebブラウザも存在する可能性がある。このため、getParameterValuesメソッドの戻り値は、順不同であると想定して扱ったほうが安全だ。

 複数選択可能な場合には、例えば次に挙げるリスト8のように処理すればよい。

リスト8■複数選択を許す際の選択フィールド値を調べる例
  1: <%
  2:   String values[] = request.getParameterValues("selfield");
  3:   if (values == null)
  4:   {
  5:       out.println("何も選択されていません");
  6:   }
  7:   else
  8:   {
  9:       for (int i = 0; i < values.length; i++)
 10:       {
 11:           String value = values[i];
 12:           if (value.compareTo("value1") == 0)
 13:           {
 14:             out.println("選択1が選択されています<BR>");
 15:           }
 16:           else if (value.compareTo("value2") == 0)
 17:           {
 18:             out.println("選択2が選択されています<BR>");
 19:           }
 20:           else if (value.compareTo("value3") == 0)
 21:           {
 22:             out.println("選択3がチェックされています<BR>");
 23:           }
 24:        }
 25:   }
 26: %>
One Point:
ちなみに、複数選択できないフィールドにおいては、getParameterValuesメソッドを使ってもよい。この場合、getParameterValuesメソッドの戻り値は、要素が1の配列が戻ってくるだけだ。

前のページ | 1 2 3 4 5 | 次のページ

[大澤文孝,ITmedia]