English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Muitas vezes, é necessário passar algumas informações, do navegador para o servidor web e, finalmente, para o programa de backend. O navegador usa dois métodos para passar essas informações para o servidor web,分别是 GET e POST métodos.
O método GET envia informações codificadas do usuário para a página, separadas pelo caractere ? entre a página e as informações codificadas, conforme exemplo:
http://www.test.com/hello?key1=value1&key2=value2
O método GET é o método padrão para passar informações do navegador para o servidor web, ele gera uma string longa que aparece na barra de endereços do navegador. Se você deseja passar para o servidor uma senha ou outra informação sensível, não use o método GET. O método GET tem um limite de tamanho: o número máximo de caracteres permitidos na string de solicitação é 1024 caracteres.
Essas informações são transmitidas usando o cabeçalho QUERY_STRING e podem ser acessadas através da variável de ambiente QUERY_STRING, o Servlet usa doGet() para processar esse tipo de solicitação.
Outra maneira de passar informações para o programa de backend de forma mais confiável é usando o método POST. O método POST empacota informações de maneira semelhante ao método GET, mas em vez de enviar as informações como uma string de texto após o caractere ? na URL, envia essas informações como uma mensagem separada. A mensagem é transmitida ao programa de backend em formato de saída padrão, onde você pode analisar e usar essas saídas. O Servlet usa o método doPost() para processar esse tipo de solicitação.
O Servlet processa os dados do formulário, que são automaticamente analisados usando diferentes métodos conforme diferentes situações:
getParameter():Você pode chamar o método request.getParameter() para obter o valor do parâmetro do formulário.
getParameterValues():Se o parâmetro aparecer mais de uma vez, chame este método e ele retornará múltiplos valores, por exemplo, caixas de seleção.
getParameterNames():Se você deseja obter uma lista completa de todos os parâmetros da solicitação atual, chame este método.
下面是一个简单的 URL,将使用 GET 方法向 HelloForm 程序传递两个值。
http://localhost:8080/TomcatTest/HelloForm?name=基础教程网&url=pt.oldtoolbag.com
下面是处理 Web 浏览器输入的 HelloForm.java Servlet 程序。我们将使用 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 implementation class HelloForm */ @WebServlet("/HelloForm) public class HelloForm extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloForm() { super(); // TODO Auto-construtor gerado } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Definir o tipo de conteúdo da resposta 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-mpping> <servlet-name>HelloForm</servlet-name> <url-pattern>/TomcatTest/HelloForm</url-pattern> </servlet-mpping> </web-app>
现在在浏览器的地址栏中输入 http://localhost:8080/TomcatTest/HelloForm?name=基础教程网&url=pt.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"> Nome do site:<input type="text" name="name"> <br /> URL:<input type="text" name="url" /> <input type="submit" value="Enviar" /> </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 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 implementation class HelloForm */ @WebServlet("/HelloForm) public class HelloForm extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloForm() { super(); // TODO Auto-construtor gerado } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Definir o tipo de conteúdo da resposta 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); } }
Agora, compile e implante o Servlet acima e realize o teste com o hello.html que possui o método POST, conforme mostrado a seguir:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>基础教程网(oldtoolbag.com)</title> </head> <body> <form action="HelloForm" method="POST"> Nome do site:<input type="text" name="name"> <br /> URL:<input type="text" name="url" /> <input type="submit" value="Enviar" /> </form> </body> </html>
A seguir está a saída real do formulário acima, tente inserir o nome do site e o URL, e clique no botão "Enviar" para demonstrar, conforme mostrado a seguir:
Quando precisar de selecionar mais de uma opção, use a caixa de seleção.
A seguir está um exemplo de código HTML checkbox.html, um formulário com dois campos de seleção.
<!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" /> Tutorial Básico da Internet <input type="checkbox" name="google" /> Google <input type="checkbox" name="taobao" checked="checked" /> Tmall <input type="submit" value="Escolher site" /> </form> </body> </html>
A seguir está o programa Servlet CheckBox.java, que processa as entradas de caixas de seleção fornecidas pelo navegador da 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 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 { // Definir o tipo de conteúdo da resposta 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-mpping> <servlet-name>CheckBox</servlet-name> <url-pattern>/TomcatTest/CheckBox</url-pattern> </servlet-mpping> </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-construtor gerado } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Definir o tipo de conteúdo da resposta response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "Ler todos os dados do formulário"; 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>Nome do parâmetro</th><th>Parâmetro valor</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); // Ler dados de um único valor if (paramValues.length == 1) { String paramValue = paramValues[0]; if (paramValue.length() == 0) out.println("<td><i>sem valores</i></td>"); else out.println("<td>" + paramValue + "</td>"); } else { // Ler múltiplos valores de dados 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-metodo stub gerado doGet(request, response); } }
Agora, experimente o Servlet acima através do seguinte formulário:
<!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" /> Matemática <input type="checkbox" name="physics" /> Física <input type="checkbox" name="chemistry" checked="checked" /> Química <input type="submit" value="Escolher Disciplina" /> </form> </body> </html>
Configure o web.xml correspondente:
<?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-mpping> <servlet-name>ReadParams</servlet-name> <url-pattern>/TomcatTest/ReadParams</url-pattern> </servlet-mpping> </web-app>
Agora, chame o Servlet acima usando o formulário, endereço de acesso: http://localhost:8080/TomcatTest/test.html Ver Resultados de Saída.
Você pode tentar usar o Servlet acima para ler outros dados de formulário, como caixas de texto, botões de rádio ou caixas de seleção, etc.