Data borang Servlet


Dalam banyak kes, beberapa maklumat perlu dihantar dari penyemak imbas ke pelayan web dan akhirnya ke program latar belakang. Pelayar menggunakan dua kaedah untuk menghantar maklumat ini ke pelayan web, kaedah GET dan kaedah POST.

Kaedah GET

Kaedah GET menghantar maklumat pengguna yang dikodkan ke permintaan halaman. Halaman dan maklumat yang dikodkan dipisahkan oleh aksara, seperti yang ditunjukkan di bawah:

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

Kaedah GET ialah kaedah lalai untuk menghantar maklumat daripada pelayar ke pelayan Web, yang mana muncul dalam bar alamat penyemak imbas. Jika anda menghantar kata laluan atau maklumat sensitif lain kepada pelayan, jangan gunakan kaedah GET. Kaedah GET mempunyai had saiz: anda hanya boleh mempunyai maksimum 1024 aksara dalam rentetan permintaan.

Maklumat ini dihantar menggunakan pengepala QUERY_STRING dan boleh diakses melalui pembolehubah persekitaran QUERY_STRING Servlet menggunakan kaedah doGet() untuk mengendalikan permintaan jenis ini.

Kaedah POST

Kaedah lain yang lebih dipercayai untuk menghantar maklumat ke program latar belakang ialah kaedah POST. Kaedah POST membungkus maklumat dengan cara yang sama seperti kaedah GET, tetapi bukannya menghantar maklumat sebagai rentetan teks selepas aksara ? Mesej dihantar ke program latar belakang sebagai output standard, yang boleh anda huraikan dan gunakan. Servlets menggunakan kaedah doPost() untuk mengendalikan jenis permintaan ini.

Gunakan Servlet untuk membaca data borang

Servlet memproses data borang, yang akan dihuraikan secara automatik menggunakan kaedah berbeza mengikut situasi berbeza:

  • getParameter(): Anda boleh memanggil kaedah request.getParameter() untuk mendapatkan nilai parameter borang.

  • getParameterValues(): Kaedah ini dipanggil jika parameter muncul lebih daripada sekali dan mengembalikan berbilang nilai, seperti kotak pilihan.

  • getParameterNames(): Panggil kaedah ini jika anda ingin mendapatkan senarai lengkap semua parameter dalam permintaan semasa.

Contoh kaedah GET menggunakan URL

Di bawah ialah URL ringkas yang akan menghantar dua nilai kepada program HelloForm menggunakan kaedah GET.

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

Berikut ialah HelloForm.java yang mengendalikan input pelayar web Program Servlet. Kami akan menggunakan kaedah getParameter(), yang membolehkan akses mudah kepada maklumat yang diluluskan:

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>");
	}

}

Dengan mengandaikan persekitaran anda telah disediakan dengan betul, susun HelloForm.java seperti berikut:

$ javac HelloForm.java

Jika semuanya berjalan lancar, kompilasi di atas akan menghasilkan fail HelloForm.class. Seterusnya, anda mesti menyalin fail kelas ke <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes dan cari dalam <Tomcat-installation-directory>/webapps/ROOT/WEB- Cipta entri berikut dalam fail web.xml INF/:

    <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>

Sekarang masukkan http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI dalam bar alamat penyemak imbas dan pastikan pelayan Tomcat dimulakan sebelum mencetuskan arahan di atas. Jika semuanya berjalan lancar, anda akan mendapat hasil berikut:

Gunakan kaedah GET untuk membaca data borang

  • 使用 GET 方法读取表单数据

    • 名字:ZARA

    • 姓氏:ALI

    Nama Pertama

    : ZARA

  • Nama Akhir: ALI

  • < /ul>< /td>

Contoh penggunaan kaedah GET borang
Berikut ialah contoh mudah yang menggunakan borang HTML dan butang hantar untuk lulus dua nilai. Kami akan menggunakan Servlet HelloForm yang sama untuk mengendalikan input.

<!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>

Simpan HTML ini ke dalam fail hello.htm dan letakkannya dalam direktori <Tomcat-installation-directory>/webapps/ROOT. Di bawah ialah output sebenar borang di atas apabila anda melawati

http://localhost:8080/Hello.htm

.

Cuba masukkan nama pertama dan nama keluarga anda, kemudian klik butang "Serah" untuk melihat output pada mesin anda. Berdasarkan input yang diberikan, ia menghasilkan hasil yang serupa dengan contoh sebelumnya.

Menggunakan contoh kaedah POST borang

Mari kita buat sedikit pengubahsuaian pada Servlet di atas supaya ia boleh mengendalikan kedua-dua kaedah GET dan POST. Program Servlet
HelloForm.java
berikut menggunakan kaedah GET dan POST untuk memproses input yang diberikan oleh penyemak imbas 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);
  }
}

Sekarang, susun dan gunakan Servlet di atas, dan gunakan Hello.htm dengan kaedah POST untuk ujian, seperti yang ditunjukkan di bawah:

<!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>

Berikut ialah output sebenar borang di atas, cuba untuk memasukkan nama dan nama keluarga, kemudian klik butang "Serah" untuk melihat output pada mesin tempatan anda.

Berdasarkan input yang diberikan, ia akan menghasilkan hasil yang serupa dengan contoh sebelumnya.

Haluskan data kotak pilihan ke program Servlet
Apabila lebih daripada satu pilihan perlu dipilih, kotak pilihan digunakan.

Berikut ialah contoh kod HTML CheckBox.htm, borang dengan dua kotak semak.

<!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>

Hasil kod ini ialah bentuk berikut:

读取复选框数据

  • 数学标识:on

  • 物理标识:null

  • 化学标识:on

<🎜><🎜><🎜>Di bawah ialah program CheckBox.java Servlet yang mengendalikan input kotak pilihan yang diberikan oleh penyemak imbas web. <🎜>
// 导入必需的 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);
  }
}
<🎜>Contoh di atas akan memaparkan keputusan berikut: <🎜>

Baca data kotak semak

  • <🎜><🎜>Bendera matematik: <🎜>dihidupkan<🎜>
  • <🎜><🎜>Bendera fizikal: <🎜>null<🎜>
  • < li><🎜><🎜>Pengenalan kimia: <🎜>pada<🎜>

Baca semua parameter borang

Berikut ialah contoh umum, menggunakan kaedah getParameterNames() HttpServletRequest untuk membaca semua parameter borang yang tersedia. Kaedah ini mengembalikan penghitungan yang mengandungi nama parameter dalam susunan yang tidak ditentukan.

Sebaik sahaja kita mempunyai enum, kita boleh mengulangi enum dengan cara standard, menggunakan kaedah hasMoreElements() untuk menentukan bila hendak berhenti, menggunakan nextElement() kaedah untuk mendapatkan nama setiap parameter.

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);
	}

}

Sekarang, cuba Servlet di atas melalui borang di bawah:

<!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>

Sekarang panggil Servlet menggunakan borang di atas, yang akan menghasilkan keputusan berikut:

Anda boleh cuba menggunakan Servlet di atas untuk membaca data borang lain, seperti kotak teks, butang radio atau kotak lungsur, dsb.