English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Servlet 表單データ

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

GETメソッド

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

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

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

これらの情報はQUERY_STRINGヘッダーを通じて伝達され、QUERY_STRING環境変数を通じてアクセスできます。Servletは以下を使用してアクセスします: doGet() メソッドで処理されます。

POSTメソッド

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

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

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

  • getParameter():フォームパラメータの値を取得するためにrequest.getParameter()メソッドを呼び出すことができます。

  • getParameterValues():パラメータが一度以上出現する場合、このメソッドを呼び出し、複数の値を返します。例えば、チェックボックスです。

  • getParameterNames():現在のリクエストで使用されているすべてのパラメータの完全なリストを取得したい場合は、このメソッドを呼び出します。

URLのGETメソッドの例

下面是一个简单的 URL,将使用 GET 方法向 HelloForm 程序传递两个值。

http://localhost:8080/TomcatTest/HelloForm?name=基本チュートリアルウェブ&url=ja.oldtoolbag.com

以下は、GETメソッドを使用してHelloFormプログラムに二つの値を渡すシンプルなURLです。 HelloForm.java Servletプログラム。以下は、Webブラウザの入力を処理する getParameter()  メソッドを使用して、渡された情報を簡単にアクセスできます:

package com.w3codebox.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 実装クラス HelloForm
 */
@WebServlet("/HelloForm)
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-生成されたコンストラクタスタブ
    }
    /**
     * @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.w3codebox.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=ja.oldtoolbag.com 、そして、上記のコマンドをトリガーする前にTomcatサーバーを起動していることを確認してください。すべてがうまくいけば、以下の結果が得られます:

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

以下は、HTMLフォームと送信ボタンを使用して二つの値を渡すシンプルな例です。私たちは同じServlet HelloFormを使用して入力を処理します。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>基础教程网(oldtoolbag.com)</title>
</head>
<body>
<form action="HelloForm" method="GET">
URL名:<input type="text" name="name">
<br />
URL:<input type="text" name="url" />
<input type="submit" value="提出" />
</form>
</body>
</html>

このHTMLをhello.htmlファイルに保存し、以下のディレクトリ構造に従ってください:

URL名とURLを入力し、「提出」ボタンをクリックして、以下のように表示されることを確認してください:

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

上記のServletに対して小さな修正を行い、GETおよびPOSTメソッドを処理できるようにしましょう。以下の HelloForm.java Servletプログラムは、Webブラウザから提供される入力をGETおよびPOSTメソッドで処理します。

注意:フォームサブミットデータに中国語データがある場合、エンコードする必要があります:

String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
package com.w3codebox.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 実装クラス HelloForm
 */
@WebServlet("/HelloForm)
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-生成されたコンストラクタスタブ
    }
    /**
     * @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>基础教程网(oldtoolbag.com)</title>
</head>
<body>
<form action="HelloForm" method="POST">
URL名:<input type="text" name="name">
<br />
URL:<input type="text" name="url" />
<input type="submit" value="提出" />
</form>
</body>
</html>

以下は、上記フォームの実際の出力です。URL名とURLを入力し、「提出」ボタンをクリックして、以下のように表示されます:


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

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

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

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>基础教程网(oldtoolbag.com)</title>
</head>
<body>
<form action="CheckBox" method="POST" target="_blank">
<input type="checkbox" name="w3codebox" 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.w3codebox.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 実装クラス 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("w3codebox()) + "\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.w3codebox.test.CheckBox</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CheckBox</servlet-name>
    <url-pattern>/TomcatTest/CheckBox</url-pattern>
  </servlet-mapping>
</web-app>

上面的示例访问地址:http://localhost:8080/TomcatTest/checkbox.html ,查看输出结果。

读取所有的表单参数

以下是通用的示例,使用 HttpServletRequest 的 getParameterNames() 方法读取所有可用的表单参数。该方法返回一个枚举,其中包含未指定顺序的参数名。

一旦我们有一个枚举,我们可以以标准方式循环枚举,使用 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-生成されたコンストラクタスタブ
    }
    /**
     * @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>基础教程网(oldtoolbag.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.w3codebox.test.ReadParams</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ReadParams</servlet-name>
    <url-pattern>/TomcatTest/ReadParams</url-pattern>
  </servlet-mapping>
</web-app>

上記のフォームを使用して Servlet を呼び出すと、アクセス先は以下の通りです:http://localhost:8080/TomcatTest/test.html 出力結果を確認してください。

上記の Servlet を使用して、テキストボックス、ラジオボタン、ドロップダウンリストなどの他のフォームデータを読み取ることを試してみてください。