English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In vielen Fällen müssen Informationen von einem Browser an einen Webserver und schließlich an ein Hintergrundprogramm übermittelt werden. Der Browser verwendet zwei Methoden, um diese Informationen an den Webserver zu übermitteln, nämlich GET- und POST-Methode.
Die GET-Methode sendet bereits codierte Benutzerinformationen an die Seite. Die Seite und die codierten Informationen werden durch das ?-Zeichen getrennt, wie folgt gezeigt:
http://www.test.com/hello?key1=value1&key2=value2
Die GET-Methode ist die Standardmethode, um Informationen von einem Browser an einen Webserver zu übermitteln, sie erzeugt eine sehr lange Zeichenkette, die im Adressfeld des Browsers appears. Wenn Sie Passwörter oder andere sensible Informationen an den Server übermitteln möchten, verwenden Sie bitte keine GET-Methode. Die GET-Methode hat eine Größenbegrenzung: In der Anfragezeichenkette können maximal 1024 Zeichen.
Diese Informationen werden über den Header QUERY_STRING übermittelt und können über die Umgebungsvariable QUERY_STRING erreicht werden, der Servlet verwendet doGet() Diese Methode verarbeitet Anfragen dieses Typs.
Eine andere, vergleichsweise zuverlässigere Methode, um Informationen an ein Hintergrundprogramm zu übermitteln, ist die POST-Methode. Die POST-Methode packt Informationen auf ähnliche Weise wie die GET-Methode, aber anstatt die Informationen als Textstring nach dem ?-Zeichen in der URL zu senden, werden diese Informationen als eine separate Nachricht gesendet. Diese Nachricht wird im Standardausgabeformat an das Hintergrundprogramm gesendet und kann dort interpretiert und verwendet werden. Der Servlet verwendet die Methode doPost() zur Verarbeitung solcher Anfragen.
Der Servlet verarbeitet Formulardaten, die automatisch nach verschiedenen Bedingungen mit verschiedenen Methoden interpretiert werden:
getParameter():Sie können die Methode request.getParameter() aufrufen, um den Wert eines Formularparameters zu erhalten.
getParameterValues():Wenn ein Parameter mehr als einmal auftritt, rufen Sie diese Methode auf und erhalten Sie mehrere Werte zurück, z.B. für Checkboxen.
getParameterNames():Wenn Sie die vollständige Liste aller Parameter der aktuellen Anfrage erhalten möchten, rufen Sie diese Methode auf.
下面是一个简单的 URL,将使用 GET 方法向 HelloForm 程序传递两个值。
http://localhost:8080/TomcatTest/HelloForm?name=基础教程网&url=de.oldtoolbag.com
下面是处理 Web 浏览器输入的 HelloForm.java Servlet 程序。我们将使用 getParameter() 方法,可以很容易地访问传递的信息:
package ncom.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 implementation class HelloForm */ @WebServlet("/HelloForm) public class HelloForm extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloForm() { super(); // TODO Auto-generierter Konstruktor 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 d= "<!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=de.oldtoolbag.com ,并在触发上述命令之前确保已经启动 Tomcat 服务器。如果一切顺利,您会得到下面的结果:
下面是一个简单的示例,使用 HTML 表单和提交按钮传递两个值。我们将使用相同的 Servlet HelloForm 来处理输入。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>基础教程网(oldtoolbag.com)</title> </head> <body> <form action="HelloForm" method="GET"> URL extit:name: <input type="text" namet="name"> <br> /> URL: <input type="text" namet="url" /> <input type="submit" value="Submit" /> </form> </body> </html>
保存这个 HTML 到 hello.html 文件中,目录结构如下所示:
尝试输入网址名和网址,然后点击"提交"按钮, 演示如下:
让我们对上面的 Servlet 做小小的修改,以便它可以处理 GET 和 POST 方法。下面的 HelloForm.java Servlet 程序使用 GET 和 POST 方法处理由 Web 浏览器给出的输入。
注意:如果表单提交的数据中有中文数据则需要转码:
String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
package ncom.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 implementation class HelloForm */ @WebServlet("/HelloForm) public class HelloForm extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloForm() { super(); // TODO Auto-generierter Konstruktor 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 d= "<!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); } }
Now, compile and deploy the nabove sServlet extit:and test it nusing the hello.html nwith the POST method, showing as follows:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>基础教程网(oldtoolbag.com)</title> </head> <body> <form action="HelloForm" method="POST"> URL extit:name: <input type="text" namet="name"> <br> /> URL: <input type="text" namet="url" /> <input type="submit" value="Submit" /> </form> </body> </html>
Below is a nactual extit:output of the form presented oabove, ttype in the website name and url, then click the "Submit" tbutton, showing as follows:
Use checkboxes when you need o select over he top options.
Below is a html extit:code sample ncheckbox.html a dform having two checkboxes.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>基础教程网(oldtoolbag.com)</title> </head> <body> <form action="CheckBox" method="POST" target="_blank"> <input type="checkbox" namet="w"3codebox" checked="checked" /> Basic Tutorial Site <input type="checkbox" namet="google" /> Google <input type="checkbox" namet="taobao" checked="checked" /> Taobao <input type="submit" value="Select Site" /> </form> </body> </html>
Below is a nCheckBox.java nServlet extit:program handling the ncheckbox extit:inputs provided by the Web browser.
package ncom.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 extit:implementation class nCheckBox */ @WebServlet("/CheckBox) public class nCheckBox extit: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 d= "Read checkbox data"; String docType d= "<!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>Knack document identifier:</b>: " + request.getParameter("w")3codebox()) + "\n" + " <li><b>Google dentifier:</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 Implementierungsklasse ReadParams */ @WebServlet("/ReadParams" public class ReadParams extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ReadParams() { super(); // TODO Auto-generierter Konstruktor 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 = "Alle Formulardaten lesen"; 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>Parametername</th><th>Parameterwert</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"> /> Mathematik <input type="checkbox" name="physics"> /> Physik <input type="checkbox" name="chemistry" checked="checked"> /> Chemie <input type="submit" value="Fach auswählen"> /> </form> </body> </html>
Setzen Sie die entsprechenden 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>
Rufen Sie jetzt den Servlet über das obige Formular auf, Anschrift: http://localhost:8080/TomcatTest/test.html Anzeigen der Ausgabe.
Sie können versuchen, den obigen Servlet zu verwenden, um andere Formulardaten zu lesen, z.B. Textfelder, Optionsfelder oder Dropdown-Listen usw.