SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

WTPではじめるサーバサイドJava入門

サーバサイドJava入門 フォームデータの取り扱いとページ遷移の基本

第3回 フォーム送信とデータのやり取り


一覧リストと複数項目の選択

 続いて、一覧リスト(selectタグ)です。selectタグは、それ自体にはvalueを持たず、そこに表示する項目であるoptionタグにvalueが用意されています。何も項目が表示されていなければgetParameterされる値はnullとなり、項目が選択されていればそのoptionのvalueが得られます。このあたりはラジオボタンとほぼ同じ感覚で扱えるでしょう。

 問題は、selectmultiple属性を追加することで複数の項目が選択できる、という点です。複数項目を選択可能にした場合、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などにはなりません。これはこれで、使い道がありそうですね。

次のページ
ページ間の移動

この記事は参考になりましたか?

WTPではじめるサーバサイドJava入門連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1369 2008/08/19 19:12

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー