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

Données de formulaire Servlet

Dans de nombreux cas, il est nécessaire de transmettre des informations, de l'ordinateur client au serveur Web, puis au programme en arrière-plan. Le navigateur utilise deux méthodes pour transmettre ces informations au serveur Web, à savoir GET et POST.

Méthode GET

La méthode GET envoie des informations utilisateur codées à la page demandée. La page et les informations codées sont séparées par le signe ?, comme suit :

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

La méthode GET est la méthode par défaut pour transmettre des informations du navigateur au serveur Web, elle génère une chaîne de caractères longue, apparaissant dans la barre d'adresse du navigateur. Si vous devez transmettre des informations sensibles telles que des mots de passe, n'utilisez pas la méthode GET. La méthode GET a une taille limitée : il ne peut y avoir au plus 1024 caractères.

Ces informations sont transmises via l'en-tête QUERY_STRING et peuvent être accédées via la variable d'environnement QUERY_STRING, le Servlet utilise doGet() Traite ce type de requête.

Méthode POST

Une autre méthode plus fiable pour transmettre des informations au programme en arrière-plan est la méthode POST. La méthode POST paquet des informations de la même manière que la méthode GET, mais la méthode POST n'envoie pas les informations sous forme de chaîne de caractères texte après le signe ? dans l'URL, mais plutôt en tant que message distinct. Ce message est transmis au programme en arrière-plan sous forme de sortie standard, et vous pouvez l'analyser et l'utiliser ces sorties standard. Le Servlet utilise la méthode doPost() pour traiter ce type de requête.

Lecture des données du formulaire à l'aide de Servlet

Le Servlet traite les données du formulaire, qui sont automatiquement décodées selon différentes méthodes selon les cas :

  • getParameter() :Vous pouvez appeler la méthode request.getParameter() pour obtenir la valeur des paramètres du formulaire.

  • getParameterValues() :Si le paramètre apparaît une fois ou plusieurs fois, appellez cette méthode et retournez plusieurs valeurs, par exemple des cases à cocher.

  • getParameterNames() :Si vous souhaitez obtenir une liste complète de tous les paramètres de la requête actuelle, appellez cette méthode.

Exemple d'utilisation de la méthode GET de l'URL

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

http://localhost:8080/TomcatTest/HelloForm?name=基础教程网&url=fr.oldtoolbag.com

下面是处理 Web 浏览器输入的 HelloForm.java Servlet 程序。我们将使用 getParameter()  方法,可以很容易地访问传递的信息:

paquet 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-constructeur de dossiers généré
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Définir le type de contenu de la réponse
        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=fr.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">
Nom du site : <input type="text" name="name">
<br />
URL : <input type="text" name="url" />
<input type="submit" value="Soumettre" />
</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");
paquet 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-constructeur de dossiers généré
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Définir le type de contenu de la réponse
        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);
    }
}

Maintenant, compilez et déployez le Servlet ci-dessus, et testez-le avec l'HTML hello.html utilisant la méthode POST, comme suit :

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

Voici la sortie réelle du formulaire ci-dessus, essayez d'entrer le nom et l'URL du site Web, puis cliquez sur le bouton "Soumettre", comme suit :


Transmettez les données des cases à cocher au programme Servlet

Utilisez les cases à cocher lorsque vous devez sélectionner une ou plusieurs options.

Voici un exemple de code HTML checkbox.html, un formulaire avec deux cases à cocher.

<!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="w"3codebox" checked="checked" />    Réseau de tutoriels de base
<input type="checkbox" name="google"  />    Google
<input type="checkbox" name="taobao" checked="checked" />    Taobao
<input type="submit" value="Choisir le site" />
</form>
</body>
</html>

Voici le programme Servlet CheckBox.java, traitant les entrées des cases à cocher fournies par le navigateur Web.

paquet 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;
/**
 * Classe d'implémentation Servlet CheckBox
 */
@WebServlet("/CheckBox)
public class CheckBox extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // Définir le type de contenu de la réponse
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Lecture des données des cases à cocher";
        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>菜鸟教程    Identifiant : </b>: "
                + request.getParameter("w"3codebox() + "\n" +
                "    <li><b>Google    Identifiant : </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-constructeur de dossiers généré
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Définir le type de contenu de la réponse
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Lecture de toutes les données du formulaire";
        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> Nom du paramètre</th><th> Valeur du paramètre</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);
            // lire une valeur de données unique
            if (paramValues.length == 1) {
                String paramValue = paramValues[0];
                if (paramValue.length() == 0)
                    out.println("<td><i>pas de valeur</i></td>");
                else
                    out.println("<td>" + paramValue + "</td>");
            } else {
                // lire plusieurs valeurs de données
                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-généré par la méthode d'appoint
        doGet(request, response);
    }
}

Maintenant, essayez le Servlet suivant via le formulaire suivant :

<!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" /> Mathématiques
<input type="checkbox" name="physics"  /> Physique
<input type="checkbox" name="chemistry" checked="checked" /> Chimie
<input type="submit" value="Choisir la discipline" />
</form>
</body>
</html>

Définir le web.xml approprié:

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

Utilisez maintenant le formulaire ci-dessus pour appeler le Servlet, adresse d'accès : http://localhost:8080/TomcatTest/test.html Voir les résultats de la sortie.

Vous pouvez essayer d'utiliser le Servlet ci-dessus pour lire d'autres données de formulaires, telles que les zones de texte, les boutons radio ou les listes déroulantes, etc.