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

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


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

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

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

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

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
  <HEAD>
    <TITLE>フォームからの入力</TITLE>
  </HEAD>
  <BODY>
    <FORM action='/servlet/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 javax.servlet.*;
import javax.servlet.http.*;

public class FormInput1 extends HttpServlet {
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /** 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にシフトJISを指定
        response.setContentType("text/html; charset=Shift_JIS");
        java.io.PrintWriter out = response.getWriter();

        // まず最初の部分のメッセージを表示
        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アプリケーションの ルートディレクトリ下の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にシフトJISを指定
        response.setContentType("text/html; charset=Shift_JIS");
        java.io.PrintWriter out = response.getWriter();

        // まず最初の部分のメッセージを表示
        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();
    }
の中の

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

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<HTML>
  <HEAD>
    <TITLE>フォームからの入力 その2</TITLE>
  </HEAD>
  <BODY>
    <FORM action='/servlet/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 javax.servlet.*;
import javax.servlet.http.*;

public class FormInput2 extends HttpServlet {
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /** 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にシフトJISを指定
        response.setContentType("text/html; charset=Shift_JIS");
        java.io.PrintWriter out = response.getWriter();

        // まず最初の部分のメッセージを表示
        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"); 
        // フォームからのデータを受け取る
        String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect");
        // 文字コード変換を実行
        out.print(namejp);
        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アプリケーションの ルートディレクトリ下の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にシフトJISを指定
        response.setContentType("text/html; charset=Shift_JIS");
        java.io.PrintWriter out = response.getWriter();

        // まず最初の部分のメッセージを表示
        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"); 
        // フォームからのデータを受け取る
        String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect");
        // 文字コード変換を実行
        out.print(namejp);
        out.print(" さんですね。");

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

        out.close();
    }
の中の

        String name = request.getParameter("yourName"); 
        // フォームからのデータを受け取る
        String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect");
        // 文字コード変換を実行
では、HTML入力フォームからデータを受け取る。さらに、ISO-8859-1でコード化 された文字列をいったんバイナリデータに変換し、次に、そのバイナリデータ を本来コード化されている文字コードにより解釈し直して、文字列を作り直している。 "JISAutoDetect"は、入力がどの文字コードで記述されているかを自動的に判定 する。

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<HTML>
  <HEAD>
    <TITLE>フォームからのいろいろな入力</TITLE>
  </HEAD>
  <BODY>
  <FORM method=POST action='/servlet/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</TD><TD>
        <OPTION value='combo2' selected>コンボボックス2</TD><TD>
        <OPTION value='combo3' selected>コンボボックス3</TD></TR>
      </SELECT>
    <TR><TH>リストボックス</TH><TD>
      <SELECT name='listbox' size='3'>
        <OPTION value='list1' selected>リストボックス1</TD><TD>
        <OPTION value='list2'>リストボックス2</TD><TD>
        <OPTION value='list3'>リストボックス3</TD></TR>
      </SELECT>
    <TR><TH>複数選択リストボックス</TH><TD>
      <SELECT name='multilist' size='3' multiple>
        <OPTION value='multilist1' selected>複数選択リストボックス1</TD><TD>
        <OPTION value='multilist2'>複数選択リストボックス2</TD><TD>
        <OPTION value='multilist3' selected>複数選択リストボックス3</TD></TR>
      </SELECT>
    <TR><TH>コマンドボタン</TH><TD><INPUT type=SUBMIT name='submit' value='送信'></TD><TD>
    <TR><TH>リセットボタン</TH><TD><INPUT type=RESET name='reset' value='リセット'></TD><TD>
  </FORM>
  </BODY>
</HTML>

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

import javax.servlet.*;
import javax.servlet.http.*;

public class FormParam extends HttpServlet {
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /** 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 {
        response.setContentType("text/html; charset=Shift_JIS");
        java.io.PrintWriter out = response.getWriter();
        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++) {
                String value = new String(values[i].getBytes("8859_1"), "JISAutoDetect");
                out.println("<li>" + name + "=" + value);
            }
            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アプリケーションの ルートディレクトリ下の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 {
        response.setContentType("text/html; charset=Shift_JIS");
        java.io.PrintWriter out = response.getWriter();
        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++) {
                String value = new String(values[i].getBytes("8859_1"), "JISAutoDetect");
                out.println("<li>" + name + "=" + value);
            }
            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++) {
                String value = new String(values[i].getBytes("8859_1"), "JISAutoDetect");
                out.println("<li>" + name + "=" + value);
            }
では、名前に対する値の文字コードを変換して、"名前=値"の形式で出力する。

問題-1

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

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

問題-2

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

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

問題-3

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

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

問題-4

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

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

問題-5

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

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

問題-6

九九をブラウザに表示するプログラムKuku.javaを作成 しなさい。なお、プログラムの実行方法としては、ブラウザにURLを指定する 方法とHTMLフォームからGETメソッドを使う方法を利用しなさい。

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

問題-7

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

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


nagai@rsch.tuis.ac.jp (Based upon mizutani@rsch.tuis.ac.jp's style sheets & results)