一覧リストと複数項目の選択
続いて、一覧リスト(selectタグ)です。selectタグは、それ自体にはvalueを持たず、そこに表示する項目であるoptionタグにvalueが用意されています。何も項目が表示されていなければgetParameterされる値はnullとなり、項目が選択されていればそのoptionのvalueが得られます。このあたりはラジオボタンとほぼ同じ感覚で扱えるでしょう。
問題は、selectはmultiple属性を追加することで複数の項目が選択できる、という点です。複数項目を選択可能にした場合、getParameterは使えません。そこで用いられるのがgetParameterValuesというメソッドです。
このメソッドは、引数にパラメータ名を指定して呼び出すのはgetParameterと同じですが、返されるのはStringではなく「String配列」です。同名のパラメータ値をすべて取り出し、配列として返すのです。
では、このgetParameterValuesを利用して、複数項目が選択されていた場合にすべての値を表示するサンプルをあげておきましょう。
<%@ page language="java" contentType="text/html; charset=windows-31j" pageEncoding="windows-31j"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-31j"> <title>JSP SAMPLE</title> </head> <body> <%! String[] sels = null; %> <%! public String getSelected(String s){ String result = ""; for(String str:sels) result = str.equals(s) ? "selected" : result; return result; } %> <% request.setCharacterEncoding("windows-31j"); out.println("※あなたが送信した内容<br>"); sels = request.getParameterValues("sel1"); sels = sels == null ? new String[]{"(未選択)"} : sels; String msg = "sel:"; for(String str:sels) msg += str + " "; out.println("<font color=#FF0000>" + msg + "</font>"); %> <form method="post" action="./index.jsp"> <br> <select name="sel1" multiple> <option value="RedHat" <%=getSelected("RedHat") %>>RedHat</option> <option value="Debian" <%=getSelected("Debian") %>>Debian</option> <option value="SUSE" <%=getSelected("SUSE") %>>SUSE</option> <option value="Vine" <%=getSelected("Vine") %>>Vine</option> <option value="Turbo" <%=getSelected("Turbo") %>>Turbo</option> <option value="Ubuntu" <%=getSelected("Ubuntu") %>>Ubuntu</option> <option value="KNOPPIX" <%=getSelected("KNOPPIX") %>>KNOPPIX</option> </select> <input type="submit"> </form> </body> </html>

表示されるリストから項目をいくつでも選択して送信すると、選択されたすべての項目が表示されます。また送信後も選択状態は再現されるようになっています。
メソッドと変数の宣言
ここでは、新しいJSPのタグが登場しています。<%! %>というものです。これは、全体で利用可能な変数やメソッドを定義するのに用いられるものです。――え? 「変数なんて、そんなことしなくても普通に使えた」って? そのとおり。ですが、JSP内にメソッドを定義するとなると話は変わってきます。メソッドの中では、外で宣言した変数は使えないのです。この<$! %>で変数宣言をしておくと、その変数はメソッド内でも利用できるようになります。
では、流れを見てみましょう。ここではまず、送られたパラメータを保管しておくString配列の変数を宣言しています。
<%! String[] sels = null; %>
この後にあるメソッド内からもこの変数が利用できるようにするため、ここで宣言をしています。続いて、メソッドgetSelectedを定義しています。これは、引数に渡したStringがパラメータを収めてあるString配列内にあれば「selected」を、そうでなければ空のStringを返すものです。要するに、これをselect内の各optionに用意しておくことで、その項目が選択されていれば「selected」が書き出されるようになるわけです。
肝心のパラメータを受け取って処理している部分は、割と簡単です。getParameterValuesでString配列を取り出し、nullだった場合にはすべて未選択ということを示す値をString配列に設定します。
sels = request.getParameterValues("sel1"); sels = sels == null ? new String[]{"(未選択)"} : sels;
後は、String配列を繰り返しで処理していけばいいだけです。送られてくる値がStringかString配列かという違いだけ理解していれば、複数項目の選択もそう難しいものではありません。
ちなみに、複数選択可能にした場合、getParameterの値はどうなるかと言うと、最初に選択された項目のvalueが渡されます。nullや空のStringなどにはなりません。これはこれで、使い道がありそうですね。
