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

Datos de formulario Servlet

En muchos casos, es necesario transmitir información de un navegador al servidor web y, finalmente, al programa de fondo. El navegador utiliza dos métodos para transmitir esta información al servidor web,分别为 GET y POST métodos.

Método GET

El método GET envía información codificada del usuario a la solicitud de la página. La información codificada y la página se separan por el carácter ?, como se muestra a continuación:

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

El método GET es el método predeterminado para transmitir información desde el navegador al servidor web, que genera una cadena larga que aparece en la barra de direcciones del navegador. Si desea transmitir información sensible como contraseñas, no utilice el método GET. El método GET tiene un límite de tamaño: en la cadena de solicitud, solo se pueden tener 1024 caracteres.

Esta información se transmite a través del encabezado QUERY_STRING y se puede acceder a través de la variable de entorno QUERY_STRING, el Servlet utiliza doGet() para procesar este tipo de solicitud.

Método POST

Otra manera más confiable de enviar información a un programa de fondo es el método POST. El método POST empaca la información de manera similar al método GET, pero en lugar de enviar la información como una cadena de texto después del carácter ? en la URL, envía esta información como un mensaje separado. Este mensaje se transmite al programa de fondo en forma de salida estándar, y puede analizar y usar estas salidas estándar. El Servlet utiliza el método doPost() para procesar este tipo de solicitud.

Uso de Servlet para leer datos del formulario

El Servlet procesa los datos del formulario, que se analizan automáticamente con diferentes métodos según las circunstancias:

  • getParameter():Puede llamar al método request.getParameter() para obtener el valor del parámetro del formulario.

  • getParameterValues():Si el parámetro se presenta una vez o más, llame a este método y devuelva varios valores, por ejemplo, casillas de verificación.

  • getParameterNames():Si desea obtener una lista completa de todos los parámetros de la solicitud actual, llame a este método.

Ejemplo de uso del método GET de URL

下面是一个简单的 URL,将使用 GET 方法向 HelloForm 程序传递两个值。

http://localhost:8080/TomcatTest/HelloForm?name=基础教程网&url=es.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-constructor de muestra generado
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Establecer el tipo de contenido de la respuesta
        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-mapping>
    <servlet-name>HelloForm</servlet-name>
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>

现在在浏览器的地址栏中输入 http://localhost:8080/TomcatTest/HelloForm?name=基础教程网&url=es.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">
网址名:<input type="text" name="name">
<br />
网址:<input type="text" name="url" />
<input type="submit" value="提交" />
</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-constructor de muestra generado
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Establecer el tipo de contenido de la respuesta
        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);
    }
}

现在,编译部署上述的 Servlet,并使用带有 POST方法的 hello.html进行测试,如下所示:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>基础教程网(oldtoolbag.com)</title>
</head>
<body>
<form action="HelloForm" method="POST">
网址名:<input type="text" name="name">
<br />
网址:<input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

以下是上面表单的实际输出,尝试输入网址名和网址,然后点击"提交"按钮,演示如下:


将复选框数据传递到 Servlet程序

当需要选择一个以上的选项时,则使用复选框。

以下是 HTML代码示例 checkbox.html,一个带有两个复选框的表单。

<!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" />	基础教程网
<input type="checkbox" name="google"  />	Google
<input type="checkbox" name="taobao" checked="checked" />	淘宝
<input type="submit" value="选择站点" />
</form>
</body>
</html>

以下是 CheckBox.java Servlet程序,处理 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 {
        
        // Establecer el tipo de contenido de la respuesta
        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-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 implementation class ReadParams
 */
@WebServlet("/ReadParams)
public class ReadParams extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadParams() {
        super();
        // TODO Auto-constructor de muestra generado
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Establecer el tipo de contenido de la respuesta
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Leer todos los datos del formulario";
        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>Nombre de parámetro</th><th>Valor de parámetro</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);
            // lectura de datos de un solo valor
            if (paramValues.length == 1) {
                String paramValue = paramValues[0];
                if (paramValue.length() == 0)
                    out.println("<td><i>sin valores</i></td>");
                else
                    out.println("<td>" + paramValue + "</td>");
            } else {
                // lectura de múltiples valores de datos
                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-generado método de plantilla
        doGet(request, response);
    }
}

Ahora, intenta el Servlet superior a través del siguiente formulario:

<!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áticas
<input type="checkbox" name="physics"  /> Física
<input type="checkbox" name="chemistry" checked="checked" /> Química
<input type="submit" value="Elegir materia" />
</form>
</body>
</html>

Configurar el archivo web.xml correspondiente:

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

Ahora llame al Servlet superior utilizando el formulario, la dirección de acceso: http://localhost:8080/TomcatTest/test.html Ver resultados de salida.

Puede intentar usar el Servlet superior para leer otros datos de formulario, como cuadros de texto, botones de opción o menús desplegables, etc.