サーブレットフォームデータ


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

GET メソッド

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

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

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

この情報は QUERY_STRING ヘッダーを使用して渡され、サーブレットは doGet() メソッドを使用してこのタイプのリクエストを処理します。

POST メソッド

バックグラウンド プログラムに情報を送信するもう 1 つのより信頼性の高い方法は、POST メソッドです。 POST メソッドは、GET メソッドとほぼ同じ方法で情報をパッケージ化しますが、情報を URL の ? 文字の後のテキスト文字列として送信するのではなく、別のメッセージとして送信します。メッセージは標準出力としてバックグラウンド プログラムに渡され、解析して使用できます。サーブレットは doPost() メソッドを使用してこのタイプのリクエストを処理します。

サーブレットを使用してフォーム データを読み取ります

サーブレットは、さまざまな状況に応じてさまざまなメソッドを使用して自動的に解析されるフォーム データを処理します:

  • getParameter(): request.getParameter() メソッドを呼び出して取得できます。 it フォームパラメータの値。

  • getParameterValues(): このメソッドは、パラメーターが複数回出現し、チェックボックスなどの複数の値を返す場合に呼び出されます。

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

URLのGETメソッドを使用した例

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

http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI

以下は、Web ブラウザ入力を処理する HelloForm.java サーブレット プログラムです。 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;

/**
 * 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 docType =
		"<!doctype html public \"-//w3c//dtd html 4.0 " +
		"transitional//en\">\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("first_name") + "\n" +
		    "  <li><b>姓氏</b>:"
		    + request.getParameter("last_name") + "\n" +
		    "</ul>\n" +
		    "</body></html>");
	}

}

環境が正しく設定されていると仮定して、HelloForm.java を次のようにコンパイルします:

$ javac HelloForm.java

すべてがうまくいけば、上記のようになります。コンパイルにより HelloForm.class ファイルが生成されます。次に、クラス ファイルを <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes にコピーし、<Tomcat-installation-directory>/webapps/ROOT/WEB に配置する必要があります。次のエントリを作成します。 INF/ の web.xml ファイル内:

    <servlet>
        <servlet-name>HelloForm</servlet-name>
        <servlet-class>HelloForm</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloForm</servlet-name>
        <url-pattern>/HelloForm</url-pattern>
    </servlet-mapping>

次に、ブラウザのアドレス バーに http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI と入力し、上記のコマンドをトリガーする前に Tomcat サーバーが起動していることを確認してください。すべてがうまくいけば、次の結果が得られます:

GETメソッドを使用してフォームデータを読み取ります

  • : ZARA

  • : ALI

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

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

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<form action="HelloForm" method="GET">
名字:<input type="text" name="first_name">
<br />
姓氏:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>
</body>
</html>

この HTML を hello.htm ファイルに保存し、<Tomcat-installation-directory>/webapps/ROOT ディレクトリに配置します。以下は、http://localhost:8080/Hello.htm にアクセスしたときの上記フォームの実際の出力です。

姓名を入力し、[送信] ボタンをクリックして、ローカル マシン上の出力を確認してください。提供された入力に基づいて、前のインスタンスと同様の結果が生成されます。

フォームの POST メソッド インスタンスの使用

GET メソッドと POST メソッドの両方を処理できるように、上記のサーブレットに小さな変更を加えてみましょう。以下の HelloForm.java サーブレット プログラムは、GET メソッドと POST メソッドを使用して、Web ブラウザーから与えられた入力を処理します。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class HelloForm extends HttpServlet {
 
  // 处理 GET 方法请求的方法
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");

      PrintWriter out = response.getWriter();
	  String title = "Using GET Method to Read Form Data";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\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("first_name") + "\n" +
                "  <li><b>姓氏</b>:"
                + request.getParameter("last_name") + "\n" +
                "</ul>\n" +
                "</body></html>");
  }
  // 处理 POST 方法请求的方法
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

次に、上記のサーブレットをコンパイルしてデプロイし、以下に示すように、POST メソッドで Hello.htm を使用してテストします。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<form action="HelloForm" method="POST">
名字:<input type="text" name="first_name">
<br />
姓氏:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>
</body>
</html>

以下は、上記のフォームの実際の出力です。姓名を入力してみてください。 [送信] ボタンをクリックして、ローカル マシン上の出力を表示します。

提供された入力に基づいて、前のインスタンスと同様の結果が生成されます。

チェックボックスのデータをサーブレットプログラムに渡します

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

以下は、2 つのチェック ボックスを持つフォームである CheckBox.htm の HTML コード例です。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<form action="CheckBox" 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 ブラウザーによって与えられたチェックボックス入力を処理する CheckBox.java サーブレット プログラムです。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class CheckBox extends HttpServlet {
 
  // 处理 GET 方法请求的方法
  public 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><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" +
                "<h1 align=\"center\">" + title + "</h1>\n" +
                "<ul>\n" +
                "  <li><b>数学标识:</b>: "
                + request.getParameter("maths") + "\n" +
                "  <li><b>物理标识:</b>: "
                + request.getParameter("physics") + "\n" +
                "  <li><b>化学标识:</b>: "
                + request.getParameter("chemistry") + "\n" +
                "</ul>\n" +
                "</body></html>");
  }
  // 处理 POST 方法请求的方法
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

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

チェックボックス データの読み取り

  • 数学的識別: on

  • 物理的識別: null

  • 化学ロゴ:

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

以下は、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-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);
	}

}

次に、以下のフォームから上記のサーブレットを試してください:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</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>

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

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