教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習

入力のあるServletプログラムの作成


フォームからの入力が与えられたServletプログラム

今までの勉強したServletプログラムでは、URLを指定して 直接ファイルを要求していた。その場合には、ブラウザ (クライアント)側はサーバに対してGETメソッドという通信 形式で要求メッセージを送信するものであった。

これに対して、今回は、ブラウザ(クライアント)側から、 入力データを受け渡してServletを呼び出すことを理解しよう。

ブラウザ(クライアント)側からサーバ側にデータを受け渡す方法 としては、大きく分けて以下の2つがある。

ここでは、後者の一方、HTMLフォームを利用して、HTMLページ上で 入力したデータを受け渡す方法を理解しよう。

以下のFormInput1.htmlでは、Formタグのaction属性の値には、送信ボタン が押された時に、テキスト入力フィールドに入力された文字列を ServletであるFormInput1.javaに渡すことを指定している。

<!DOCTYPE HTML>
<HTML>
  <HEAD>
    <TITLE>フォームからの入力</TITLE>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </HEAD>
  <BODY>
    <FORM action='FormInput1' method=get>
      あなたのお名前は:<INPUT type='text' name='yourName' value=''>
      <BR>
      <INPUT type='submit' name='button' value='入力'>
    </FORM>
  </BODY>
</HTML>

次のプログラム FormInput1.java は、HTMLフォームから入力されたデータを 受け取って表示する。HTMLフォームから入力されたデータは、GETメソッドによりServlet に送信される。 このプログラムでは、渡された文字列をgetParameterメソッドにより取得して、そのまま 表示する。メソッドの引数には、入力フィールドの名前を指定する。指定された名前により、 どの入力フィールドの値を取得できるかが決定される。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FormInput1 extends HttpServlet {
    
    /** Processes requests for both HTTP GET and 
     * <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */

    protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        // 日本語を表示するので、charsetにUTF-8を指定       
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();

        // まず最初の部分のメッセージを表示
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>フォームからの入力を受け取るサーブレット</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("フォームからの入力を受け取るサーブレット<hr>");

        // フォームからのデータを受け取って表示
        out.println("あなたのお名前は:");
        String name = request.getParameter("yourName"); 
        // フォームからのデータを受け取る
        out.print(name);
        out.print(" さんですね。");

        // 残りのメッセージを表示
        out.println("</body>");
        out.println("</html>");

        out.close();
    }  
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
}
たとえば、コンパイル済みのServletファイルFormInput1.class(テキストファイルは FormInput1.java)をWebサーバが動いているホストlocalhostのWebアプリケーションの ルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに 格納する。HTMLファイルであるFormInput.html1は、Webアプリケーションのルート ディレクトリ下に格納する。 Servletを実行するためには、FormInput1.htmlを実行する。これにより、ブラウザが起動し、 HTMLフォームが表示される。ブラウザ上からデータを入力して送信ボタンを押すと、 その文字列がそのまま表示される。

プログラム FormInput1.javaの説明

以下のprocessRequestメソッド

    protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        // 日本語を表示するので、charsetにUTF-8を指定
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();

        // まず最初の部分のメッセージを表示
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>フォームからの入力を受け取るサーブレット</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("フォームからの入力を受け取るサーブレット<hr>");

        // フォームからのデータを受け取って表示
        out.println("あなたのお名前は:");
        String name = request.getParameter("yourName"); 
        // フォームからのデータを受け取る
        out.print(name);
        out.print(" さんですね。");

        // 残りのメッセージを表示
        out.println("</body>");
        out.println("</html>");

        out.close();
    }
の中の

        response.setContentType("text/html; charset=UTF-8");
では、日本語を出力するために、responseオブジェクトに対して setContentTypeメソッドを指定して呼び出している。

        String name = request.getParameter("yourName"); 
では、HTMLフォームで入力された文字列をgetParameterメソッドにより 取得する。このメソッドの引数には、テキスト入力フィールドの名前を指定する。 指定された名前により、どの入力フィールドの値を取得できるかが決定される。

フォームからの日本語入力が与えられたServletプログラム

次のFormInput2.htmlでは、Formタグのaction属性の値には、送信ボタン が押された時に、テキスト入力フィールドに入力された文字列を ServletであるFormInput2.javaに渡すことを指定している。 なお、HTMLフォームから入力されたデータは、GETメソッドによりServlet に送信される。

<!DOCTYPE HTML>

<HTML>
  <HEAD>
    <TITLE>フォームからの入力 その2</TITLE>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </HEAD>
  <BODY>
    <FORM action='FormInput2' method=get>
      あなたのお名前は(日本語可):<INPUT type='text' name='yourName' value=''>
      <BR>
      <INPUT type='submit' name='button' value='入力'>
    </FORM>
  </BODY>
</HTML>

上述したFormInput2.javaでは、テキスト入力フィールドに日本語を 入力すると、字化けしてしまう。これは、Servletが想定している文字 コードとブラウザに入力された文字列の文字コードが一致しないため である。そこで、FormInput2.javaでは、ブラウザに入力された文字 コードを変換し文字列を作り直し、表示をする。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FormInput2 extends HttpServlet {
    
    /** Processes requests for both HTTP <code>GET</code> and 
     * <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        // 日本語を表示するので、charsetにUTF-8を指定
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();

        // まず最初の部分のメッセージを表示
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>フォームからの入力を受け取るサーブレット その2</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("フォームからの入力を受け取るサーブレット その2<hr>");
        // フォームからのデータを受け取って表示
        out.println("あなたのお名前は:");
        String name = request.getParameter("yourName"); 
        out.print(name);
        out.print(" さんですね。");

        // 残りのメッセージを表示
        out.println("</body>");
        out.println("</html>");

        out.close();
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, 
                          HttpServletResponse response)
        throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    
}
たとえば、コンパイル済みのServletファイルFormInput2.class(テキストファイルは FormInput2.java)をWebサーバが動いているホストlocalhostのWebアプリケーションの ルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに 格納する。HTMLファイルであるFormInput2.htmlは、Webアプリケーションの ルートディレクトリ下に格納する。 Servletを実行するためには、FormInput2.htmlを実行する。これにより、ブラウザが起動し、 HTMLフォームが表示される。ブラウザ上から日本語のデータを入力して送信ボタンを押すと、 その文字列がそのまま表示される。

プログラム FormInput2.java の説明

以下のprocessRequestメソッド

    protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
        throws ServletException, java.io.IOException {
        // 日本語を表示するので、charsetにUTF-8を指定
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();

        // まず最初の部分のメッセージを表示
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>フォームからの入力を受け取るサーブレット その2</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("フォームからの入力を受け取るサーブレット その2<hr>");

        // フォームからのデータを受け取って表示
        out.println("あなたのお名前は:");
        String name = request.getParameter("yourName"); 
        out.print(name);
        out.print(" さんですね。");

        // 残りのメッセージを表示
        out.println("</body>");
        out.println("</html>");

        out.close();
    }
の中の

        request.setCharacterEncoding("UTF-8");
では、日本語パラメータを受け取る時には、requestオブジェクトに対して setCharacterEncodingメソッドを呼び出して、パラメータのエンコーディングを 指定している。なお、一つでもパラメータの読み込みをおこなうと setCharacterEncodingメソッドは効かなくなるので、getParameterメソッドでは パラメータを取得する前にsetCharacterEncodingメソッドを呼び出す必要がある。

        String name = request.getParameter("yourName"); 
        // フォームからのデータを受け取る
では、HTML入力フォームからデータを受け取る。さらに、UTF-8でコード化 された文字列をそのまま表示する。

フォームからのいろいろな入力が与えられたServletプログラム

FormParam.htmlでは、Formタグのaction属性の値には、送信ボタン が押された時に、テキスト入力フィールドに入力された文字列を ServletであるFormParam.javaに渡すことを指定している。 HTMLフォームから入力されたデータは、POSTメソッドによりFormParam.javaに送信される。 FormParam.java は、指定したWebサーバのホスト名と取得したい HTMLファイルを引数で指定して、Webサーバからのレスポンスを標準出力に表示する プログラムである。

<!DOCTYPE HTML>

<HTML>
  <HEAD>
    <TITLE>フォームからのいろいろな入力</TITLE>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </HEAD>
  <BODY>
  <FORM method=POST action='FormParam'>
    <TABLE>
    <TR><TH>テキスト</TH><TD><INPUT type=TEXT name='text' value=''></TD></TR>
    <TR><TH>パスワード</TH><TD><INPUT type=PASSWORD name='password' value=''></TD></TR>
    <TR><TH>非表示テキスト</TH><TD><INPUT type=HIDDEN name='hidden' value='hiddenの値'></TD></TR>
    <TR><TH>テキストエリア</TH><TD><TEXTAREA name='textarea'></TEXTAREA></TD></TR>
    <TR><TH>ラジオボタン</TH><TD>
      <INPUT type=RADIO name='radio' value='radio1'>ラジオボタン1</TD><TD>
      <INPUT type=RADIO name='radio' value='radio2'>ラジオボタン2</TD></TR>
    <TR><TH>チェックボックス</TH><TD>
      <INPUT type=CHECKBOX name='checkbox' value='checkbox1'>チェックボックス1</TD><TD>
      <INPUT type=CHECKBOX name='checkbox' value='checkbox2'>チェックボックス2</TD><TD>
      <INPUT type=CHECKBOX name='checkbox' value='checkbox3'>チェックボックス3</TD></TR>
    <TR><TH>コンボボックス</TH><TD>
      <SELECT name='combobox'>
        <OPTION value='combo1' selected>コンボボックス1</OPTION>
        <OPTION value='combo2' selected>コンボボックス2</OPTION>
        <OPTION value='combo3' selected>コンボボックス3</OPTION></TD>
      </SELECT></TR>
    <TR><TH>リストボックス</TH><TD>
      <SELECT name='listbox' size='3'
        <OPTION value='list1' selected>リストボックス1</OPTION>
        <OPTION value='list2'>リストボックス2</OPTION>
        <OPTION value='list3'>リストボックス3</OPTION></TD>
      </SELECT></TR>
    <TR><TH>複数選択リストボックス</TH><TD>
      <SELECT name='multilist' size='3' multiple
        <OPTION value='multilist1' selected>複数選択リストボックス1</OPTION>
        <OPTION value='multilist2'>複数選択リストボックス2</OPTION>
        <OPTION value='multilist3' selected>複数選択リストボックス3</OPTION></TD>
      </SELECT></TR>
    <TR><TH>コマンドボタン</TH><TD><INPUT type=SUBMIT name='submit' value='送信'></TD></TR>
    <TR><TH>リセットボタン</TH><TD><INPUT   type=RESET name='reset' value='リセット'></TD></TR>

  </TABLE>
  </FORM>
  </BODY>
</HTML>

上述したFormParam.htmlでは、テキスト入力フィールド、 パスワード入力、非表示テキスト、ラジオボタン、 チェックボックス、コンボボックス、リストボックス、 複数選択リストボックス、コマンドボタン(送信)、 リセットボタン(リセット)のフォーム構成要素 を表示する。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FormParam extends HttpServlet {
    
    /** Processes requests for both HTTP <code>GET</code> and 
     * <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
                       HttpServletResponse response)
      throws ServletException, java.io.IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>入力されたパラメータを表示するサーブレット</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<ul>");
        java.util.Enumeration en = request.getParameterNames();
        while (en.hasMoreElements()) {
            String name = (String)en.nextElement();
            String values[] = request.getParameterValues(name);
            for (int i = 0; i < values.length; i++) {
                out.println("<li>" + name + "=" + values[i]);
            }
            out.println("<hr>");
        }
        out.println("</ul>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    
}

たとえば、コンパイル済みのServletファイルFormParam.class(テキストファイルは FormParam.java)をWebサーバが動いているホストlocalhostのWebアプリケーションの ルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに 格納する。HTMLファイルであるFormParam.htmlは、Webアプリケーションの ルートディレクトリ下に格納する。 Servletを実行するためには、FormParam.htmlを実行する。これにより、ブラウザが起動し、 HTMLフォームが表示される。ブラウザ上から日本語のデータを入力したり、項目を選択して、 送信ボタンを押すと、送信されたデータがそのまま表示される。

プログラム FormParam.java の説明

以下のprocessRequestメソッド

    protected void processRequest(HttpServletRequest request, 
                       HttpServletResponse response)
      throws ServletException, java.io.IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>入力されたパラメータを表示するサーブレット</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<ul>");
        java.util.Enumeration en = request.getParameterNames();
        while (en.hasMoreElements()) {
            String name = (String)en.nextElement();
            String values[] = request.getParameterValues(name);
            for (int i = 0; i < values.length; i++) {
                out.println("<li>" + name + "=" + values[i]);
            }
            out.println("<hr>");
        }
        out.println("</ul>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
の中の、

        java.util.Enumeration en = request.getParameterNames();

では、getParameterNamesメソッドを用いて、Servlet(FormParam)に送信された、 HTMLフォームからの入力データ(名前とその値の組)の名前の一覧を取得する。

        while (en.hasMoreElements()) {
            String name = (String)en.nextElement();
            String values[] = request.getParameterValues(name);
            ..................................................
            ..................................................
        }
では、Enumerationオブジェクトの中で未処理のデータがあれば、hasMoreElementsメソッドが trueを返し、未処理のデータがなくなってfalseを返すまで、ループを繰り返す。ループ内では、 nextElementメソッドで名前を取り出し、名前に対する値をすべて取得する。

            for (int i = 0; i < values.length; i++) {
                out.println("<li>" + name + "=" + values[i]);
            }
では、名前に対する値の文字コードを変換して、"名前=値"の形式で出力する。

演習

問題-1

上のプログラム FormInput1.java をIDEとしてNetBeansを 使って実行してみよ。また、日本語を入力した場合には、文字化けが 起こっていることを確認せよ。

ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。

問題-2

上のプログラム FormInput2.java をIDEとしてNetBeansを 使って実行してみよ。日本語を入力した場合には、文字化けが 起こらずに日本語が表示されていることを確認せよ。

ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。

問題-3

上のプログラム FormInput2.java をNetBeansを 使って実行してみよ。ただし、HTMLフォームとServletの通信方式を POSTメソッドとすること。実行結果から、GETメソッドとPOSTメソッド の違いを説明しなさい。

ただし、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。

問題-4

上のプログラム FormParam.java をNetBeansを 使って実行してみよ。

ただし、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。

問題-5

上のプログラム FormParam.java をNetBeansを 使って実行してみよ。その際のHTMLフォームとServletの通信方式を GETメソッドとすること。実行結果から、GETメソッドとPOSTメソッド の違いを説明しなさい。

ただし、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。

問題-6

九九をブラウザに表示するプログラムKuku.javaを作成 しなさい。

ただし、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。

問題-7

問題-6で作成したプログラムを元に、任意の行数と列数の表を作成するプログラムXYTable.javaを作成しなさい。行数と列数はHTMLフォームで与えるようにし、コントロール名は、行数をlines、列数をcolumnsとせよ。例えば、行数に5、列数に4を指定した場合、1×1〜5×4 までの値の5行4列の表を作成する。
補足:コントロール値を得る場合、Stringオブジェクトとして得るため、これを整数型(int型)に変換する必要がある。その場合、Integer.parseIntメソッドを使えば良い。

システムプログラミング演習


nagai