Servlet フォームデータ

多くの場合、ブラウザから Web サーバー、最終的にバックエンドプログラムに情報を渡す必要があります。ブラウザはこれらの情報を Web サーバーに渡すために GET メソッドと POST メソッドの2つの方法を使用します。

GET メソッド

GET メソッドは、ページリクエストにエンコードされたユーザー情報を送信します。ページとエンコードされた情報の間は ? 文字で区切られます。次のようになります:

http://www.test.com/hello?key1=value1&key2=value2

GET メソッドは、ブラウザから Web サーバーに情報を渡すデフォルトの方法であり、ブラウザのアドレスバーに表示される長い文字列を生成します。サーバーにパスワードやその他の機密情報を渡す場合は、GET メソッドを使用しないでください。GET メソッドにはサイズ制限があります:リクエスト文字列は最大 1024 文字までです。

これらの情報は QUERY_STRING ヘッダーを使用して渡され、QUERY_STRING 環境変数からアクセスできます。Servlet はdoGet()メソッドを使用してこのタイプのリクエストを処理します。

POST メソッド

バックエンドプログラムに情報を渡すもう1つの信頼性の高い方法は POST メソッドです。POST メソッドは情報のパッケージ化方法が GET メソッドと基本的に同じですが、URL の ? 文字以降のテキスト文字列として情報を送信するのではなく、これらの情報を単一のメッセージとして送信します。メッセージは標準出力の形式でバックエンドプログラムに渡され、この標準出力を解析して使用できます。Servlet は doPost() メソッドを使用してこのタイプのリクエストを処理します。

Servlet を使用してフォームデータを読み取る

Servlet はフォームデータを処理します。これらのデータは状況に応じて異なるメソッドを使用して自動的に解析されます:

  • getParameter():request.getParameter() メソッドを呼び出して、フォームパラメータの値を取得できます。
  • getParameterValues():パラメータが複数回出現する場合は、このメソッドを呼び出すと複数の値が返されます。例えばチェックボックスです。
  • getParameterNames():現在のリクエスト内のすべてのパラ​​メータの完全なリストを取得したい場合は、このメソッドを呼び出します。

URL を使用する GET メソッドの例

以下は、GET メソッドを使用して HelloForm プログラムに2つの値を渡す簡単な URL です。

http://localhost:8080/TomcatTest/HelloForm?name=サンプル&url=www.example.com

以下は Web ブラウザからの入力を処理するHelloForm.javaServlet プログラムです。次を使用しますgetParameter()メソッドを使用すると、渡された情報に簡単にアクセスできます:

package com.サンプル.test;

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;

/**
 * Servlet implementation class HelloForm
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();
        String title = "使用 GET 方法读取表单数据";
        // 处理中文
        String name =new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
        String docType = "<!DOCTYPE html> \n";
        out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#F0F0F0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<ul>\n" +
            "  <li><b>站点名</b>:"
            + name + "\n" +
            "  <li><b>网址</b>:"
            + request.getParameter("url") + "\n" +
            "</ul>\n" +
            "</body></html>");
    }
    
    // 处理 POST 方法请求的方法
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
次に、web.xmlファイルに以下のエントリを作成します:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>HelloForm</servlet-name>
    <servlet-class>com.サンプル.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>

ブラウザのアドレスバーに次のように入力しますhttp://localhost:8080/TomcatTest/HelloForm?name=サンプル&url=www.example.com、上記のコマンドを実行する前に Tomcat サーバーが起動していることを確認してください。すべてがうまくいけば、次の結果が得られます:


フォームを使用する GET メソッドの例

以下は、HTML フォームと送信ボタンを使用して2つの値を渡す簡単な例です。同じ Servlet HelloForm を使用して入力を処理します。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>サンプル(example.com)</title>
</head>
<body>
<form action="HelloForm" method="GET">
网址名:<input type="text" name="name">
<br />
网址:<input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

この HTML を hello.html ファイルに保存します。ディレクトリ構造は次のようになります:

サイト名と URL を入力して「送信」ボタンをクリックしてみてください。Gif デモは次のとおりです:


フォームを使用する POST メソッドの例

上記の Servlet に少し修正を加えて、GET メソッドと POST メソッドの両方を処理できるようにしましょう。以下のHelloForm.javaServlet プログラムは、GET メソッドと POST メソッドを使用して Web ブラウザから渡された入力を処理します。

注意:フォームで送信されたデータに中国語データが含まれる場合は、文字コード変換が必要です:

String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
package com.サンプル.test;

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;

/**
 * Servlet implementation class HelloForm
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();
        String title = "使用 POST 方法读取表单数据";
        // 处理中文
        String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
        String docType = "<!DOCTYPE html> \n";
        out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#F0F0F0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<ul>\n" +
            "  <li><b>站点名</b>:"
            + name + "\n" +
            "  <li><b>网址</b>:"
            + request.getParameter("url") + "\n" +
            "</ul>\n" +
            "</body></html>");
    }
    
    // 处理 POST 方法请求的方法
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

次に、上記の Servlet をコンパイルしてデプロイし、POST メソッドを使用する hello.html でテストします。次のようになります:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>サンプル(example.com)</title>
</head>
<body>
<form action="HelloForm" method="POST">
网址名:<input type="text" name="name">
<br />
网址:<input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

以下は上記フォームの実際の出力です。サイト名と URL を入力して「送信」ボタンをクリックしてみてください。Gif デモは次のとおりです:


チェックボックスのデータを Servlet プログラムに渡す

複数のオプションを選択する必要がある場合は、チェックボックスを使用します。

以下は HTML コードの例 checkbox.html です。2つのチェックボックスを持つフォームです。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>サンプル(example.com)</title>
</head>
<body>
<form action="CheckBox" method="POST" target="_blank">
<input type="checkbox" name="サンプル" checked="checked" /> サンプル
<input type="checkbox" name="google"  /> Google
<input type="checkbox" name="taobao" checked="checked" /> 淘宝
<input type="submit" value="选择站点" />
</form>
</body>
</html>

以下は CheckBox.java Servlet プログラムで、Web ブラウザから渡されたチェックボックスの入力を処理します。

package com.サンプル.test;

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;

/**
 * Servlet implementation class CheckBox
 */
@WebServlet("/CheckBox")
public class CheckBox extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();
        String title = "读取复选框数据";
        String docType = "<!DOCTYPE html> \n";
            out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#F0F0F0\">\n" +
                "<h1 align=\"center\">" + title + "</h1>\n" +
                "<ul>\n" +
                "  <li><b>サンプル按教程标识:</b>: "
                + request.getParameter("サンプル") + "\n" +
                "  <li><b>Google 标识:</b>: "
                + request.getParameter("google") + "\n" +
                "  <li><b>淘宝标识:</b>: "
                + request.getParameter("taobao") + "\n" +
                "</ul>\n" +
                "</body></html>");
    }
    
    // 处理 POST 方法请求的方法
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

対応する web.xml を設定します:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>CheckBox</servlet-name>
    <servlet-class>com.サンプル.test.CheckBox</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CheckBox</servlet-name>
    <url-pattern>/TomcatTest/CheckBox</url-pattern>
  </servlet-mapping>
</web-app>

上記の例では、次の結果が表示されます:


すべてのフォームパラメータを読み取る

以下は汎用の例です。HttpServletRequest のgetParameterNames()メソッドを使用して、利用可能なすべてのフォームパラメータを読み取ります。このメソッドは、順序が指定されていないパラメータ名を含む列挙型(Enumeration)を返します。

列挙型を取得したら、標準的な方法で列挙型をループできます。hasMoreElements()メソッドを使用して停止するタイミングを決定し、nextElement()メソッドを使用して各パラメータの名前を取得します。

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ReadParams
 */
@WebServlet("/ReadParams")
public class ReadParams extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadParams() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "读取所有的表单数据";
        String docType =
            "<!doctype html public \"-//w3c//dtd html 4.0 " +
            "transitional//en\">\n";
            out.println(docType +
            "<html>\n" +
            "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#F0F0F0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
            "<tr bgcolor=\"#949494\">\n" +
            "<th>参数名称</th><th>参数值</th>\n"+
            "</tr>\n");

        Enumeration paramNames = request.getParameterNames();

        while(paramNames.hasMoreElements()) {
            String paramName = (String)paramNames.nextElement();
            out.print("<tr><td>" + paramName + "</td>\n");
            String[] paramValues =
            request.getParameterValues(paramName);
            // 读取单个值的数据
            if (paramValues.length == 1) {
                String paramValue = paramValues[0];
                if (paramValue.length() == 0)
                    out.println("<td><i>没有值</i></td>");
                else
                    out.println("<td>" + paramValue + "</td>");
            } else {
                // 读取多个值的数据
                out.println("<td><ul>");
                for(int i=0; i < paramValues.length; i++) {
                out.println("<li>" + paramValues[i]);
            }
                out.println("</ul></td>");
            }
            out.print("</tr>");
        }
        out.println("\n</table>\n</body></html>");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

次に、以下のフォームを使用して上記の Servlet を試してみます:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>サンプル(example.com)</title>
</head>
<body>

<form action="ReadParams" method="POST" target="_blank">
<input type="checkbox" name="maths" checked="checked" /> 数学
<input type="checkbox" name="physics"  /> 物理
<input type="checkbox" name="chemistry" checked="checked" /> 化学
<input type="submit" value="选择学科" />
</form>

</body>
</html>

対応する web.xml を設定します:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>ReadParams</servlet-name>
    <servlet-class>com.サンプル.test.ReadParams</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ReadParams</servlet-name>
    <url-pattern>/TomcatTest/ReadParams</url-pattern>
  </servlet-mapping>
</web-app>

上記のフォームを使用して Servlet を呼び出すと、次の結果が生成されます:

上記の Servlet を使用して、テキストボックス、ラジオボタン、ドロップダウンボックスなどの他のフォームデータを読み取ることもできます。

その他の拡張