Servlet Données de formulaire
Dans de nombreux cas, vous devez transmettre certaines informations depuis le navigateur au serveur web, puis au programme backend. Le navigateur utilise deux méthodes pour transmettre ces informations au serveur web, à savoir la méthode GET et la méthode POST.
Méthode GET
La méthode GET envoie les informations utilisateur encodées ajoutées à la requête de page. La page et les informations encodées sont séparées par le caractère ?, comme indiqué ci-dessous :
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 produit une longue chaîne qui apparaît dans la barre d'adresse du navigateur. Si vous souhaitez transmettre des mots de passe ou d'autres informations sensibles au serveur, n'utilisez pas la méthode GET. La méthode GET a une limite de taille : la chaîne de requête peut contenir au maximum 1024 caractères.
Ces informations sont transmises à l'aide de l'en-tête QUERY_STRING et sont accessibles via la variable d'environnement QUERY_STRING. Le Servlet utilise la méthodedoGet()pour gérer ce type de requête.
Méthode POST
Une autre façon fiable de transmettre des informations au programme back-end est la méthode POST. La méthode POST empaquette les informations pratiquement de la même manière que la méthode GET, mais au lieu d'envoyer les informations sous forme de chaîne de texte après le caractère ? dans l'URL, elle envoie les informations sous forme de message séparé. Le message est envoyé au programme back-end sous la forme de la sortie standard, et vous pouvez analyser et utiliser cette sortie standard. La Servlet utilise la méthode doPost() pour gérer ce type de requête.
Utilisation d'une Servlet pour lire les données de formulaire
La Servlet traite les données de formulaire, et ces données sont automatiquement analysées à l'aide de différentes méthodes selon la situation :
- getParameter():Vous pouvez appeler la méthode request.getParameter() pour obtenir la valeur d'un paramètre de formulaire.
- getParameterValues():Si le paramètre apparaît plus d'une fois, appelez cette méthode et elle renverra plusieurs valeurs, telles que des cases à cocher.
- getParameterNames():Si vous souhaitez obtenir une liste complète de tous les paramètres de la requête actuelle, appelez cette méthode.
Exemple de méthode GET utilisant une URL
Voici une URL simple qui transmettra deux valeurs au programme HelloForm à l'aide de la méthode GET.
http://localhost:8080/TomcatTest/HelloForm?name=Example&url=www.example.com
Voici le programme Servlet qui gère les entrées du navigateur web.HelloForm.javaNous utiliserons la méthodegetParameter()pour accéder facilement aux informations transmises :
package com.example.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-generated constructor 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 = "<!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);
}
}
Ensuite, nous créons l'entrée suivante dans le fichierweb.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>HelloForm</servlet-name>
<servlet-class>com.example.test.HelloForm</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloForm</servlet-name>
<url-pattern>/TomcatTest/HelloForm</url-pattern>
</servlet-mapping>
</web-app>
Maintenant, saisissez ce qui suit dans la barre d'adresse du navigateur :http://localhost:8080/TomcatTest/HelloForm?name=Example&url=www.example.com, et assurez-vous que le serveur Tomcat a été démarré avant de déclencher la commande ci-dessus. Si tout se passe bien, vous obtiendrez le résultat suivant :

Exemple d'utilisation de la méthode GET avec un formulaire
Voici un exemple simple qui utilise un formulaire HTML et un bouton d'envoi pour transmettre deux valeurs. Nous utiliserons le même Servlet HelloForm pour traiter l'entrée.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example(example.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>
Enregistrez ce code HTML dans le fichier hello.html, la structure du répertoire est la suivante :

Essayez de saisir le nom du site web et l'URL, puis cliquez sur le bouton "Submit". La démonstration GIF est la suivante :

Exemple d'utilisation de la méthode POST avec un formulaire
Apportons une petite modification au Servlet ci-dessus afin qu'il puisse gérer à la fois les méthodes GET et POST. Le programme Servlet suivantHelloForm.javautilise les méthodes GET et POST pour traiter l'entrée donnée par le navigateur web.
Remarque : Si les données soumises par le formulaire contiennent des caractères chinois, une conversion d'encodage est nécessaire :
String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
package com.example.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-generated constructor 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 = "<!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, puis testez-le avec hello.html en utilisant la méthode POST, comme indiqué ci-dessous :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example(example.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>
Voici la sortie réelle du formulaire ci-dessus. Essayez de saisir le nom du site web et l'URL, puis cliquez sur le bouton "Submit". La démonstration GIF est la suivante :

Transmission de données de cases à cocher à un programme Servlet
Lorsque vous devez sélectionner plusieurs options, utilisez des cases à cocher.
Voici un exemple de code HTML, checkbox.html, un formulaire avec deux cases à cocher.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example(example.com)</title> </head> <body> <form action="CheckBox" method="POST" target="_blank"> <input type="checkbox" name="example" checked="checked" /> Example <input type="checkbox" name="google" /> Google <input type="checkbox" name="taobao" checked="checked" /> 淘宝 <input type="submit" value="选择站点" /> </form> </body> </html>
Voici le programme Servlet CheckBox.java, qui traite l'entrée de case à cocher fournie par le navigateur web.
package com.example.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 {
// 设置响应内容类型
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>Example按教程标识:</b>: "
+ request.getParameter("example") + "\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);
}
}
Définissez le web.xml correspondant :
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>CheckBox</servlet-name>
<servlet-class>com.example.test.CheckBox</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CheckBox</servlet-name>
<url-pattern>/TomcatTest/CheckBox</url-pattern>
</servlet-mapping>
</web-app>
L'exemple ci-dessus affichera le résultat suivant :

Lecture de tous les paramètres de formulaire
Voici un exemple général, utilisant la méthodegetParameterNames()de HttpServletRequest pour lire tous les paramètres de formulaire disponibles. Cette méthode renvoie une énumération contenant les noms des paramètres dans un ordre non spécifié.
Une fois que nous avons une énumération, nous pouvons parcourir l'énumération de manière standard, en utilisant la méthodehasMoreElements()pour déterminer quand s'arrêter, en utilisant la méthodenextElement()pour obtenir le nom de chaque paramètre.
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-generated constructor 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 = "读取所有的表单数据";
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>参数名称</th><th>参数值</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);
}
}
Maintenant, essayez la Servlet ci-dessus avec le formulaire suivant :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example(example.com)</title> </head> <body> <form action="ReadParams" method="POST" target="_blank"> <input type="checkbox" name="maths" checked="checked" /> 数学 <input type="checkbox" name="physics" /> 物理 <input type="checkbox" name="chemistry" checked="checked" /> 化学 <input type="submit" value="选择学科" /> </form> </body> </html>
Définissez le web.xml correspondant :
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>ReadParams</servlet-name>
<servlet-class>com.example.test.ReadParams</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ReadParams</servlet-name>
<url-pattern>/TomcatTest/ReadParams</url-pattern>
</servlet-mapping>
</web-app>
Maintenant, appeler la Servlet avec le formulaire ci-dessus produira le résultat suivant :

Vous pouvez essayer d'utiliser la Servlet ci-dessus pour lire d'autres données de formulaire, telles que des zones de texte, des boutons radio, des listes déroulantes, etc.
Autres extensions