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

Dados de Formulário Servlet

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.

Método GET

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.

Método POST

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.

Uso do Servlet para ler dados do formulário

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.

Exemplo de uso do método GET da URL

下面是一个简单的 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 服务器。如果一切顺利,您会得到下面的结果:

使用表单的 GET 方法示例

下面是一个简单的示例,使用 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 文件中,目录结构如下所示:

尝试输入网址名和网址,然后点击"提交"按钮, 演示如下:

使用表单的 POST 方法示例

让我们对上面的 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:


Passar dados da caixa de seleção para o programa Servlet

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.