Les servlets rendent très simple la récupération de données envoyées
par l'intermédiaire de formulaires HTML, c'est-à-dire
une interface graphique permettant à l'utilisateur de saisir des données.
Grâce à la balise Form du langage HTML, il est
très facile de créer des formulaires comprenant:
- des champs de saisie
- des cases à cocher
- des boutons radio
- des listes à choix multiples
- ...
Pour utiliser un tel formulaire capable d'envoyer des informations à une servlet,
il suffit de mettre le nom de la servlet qui réceptionnera les informations en tant que valeur
de l'attribut Action de la balise Form, et de spécifier la méthode HTTP
désirée grâce à l'attribut Method. Les données sont envoyées
à l'aide de la méthode spécifiée (GET par défaut) après que l'utilisateur
clique sur un bouton de type Submit
Voici ce à quoi peut ressembler un formulaire en HTML, permettant d'envoyer les
coordonnées d'une personne à une servlet nommé UserInfo:
<FORM Method="POST" Action="http://serveur/servlet/UserInfo">
Nom : <INPUT type=text size=20 name=nom><BR>
Prénom : <INPUT type=text size=20 name=prenom><BR>
Age : <INPUT type=text size=2 name=age><BR>
<INPUT type=submit value=Envoyer>
</FORM>
Le résultat de ce code est le suivant (le bouton Envoyer est volontairement désactivé):
Chaque élément du formulaire doit possèder un nom unique, de
telle façon que la valeur associé à l'élément forme avec le nom
de celui-ci une paire nom/valeur du type:
Nom_de_l_element = valeur
L'ensemble des paires nom/valeur sont séparées par des ET commerciaux (le caractère
"&"). Ainsi, l'envoi d'un formulaire crée une chaîne de la forme:
champ1=valeur1&champ2=valeur2&champ3=valeur3
L'envoi de cette chaîne se fera différemment selon que la méthode utilisée
pour l'envoi du formulaire est GET ou POST.
La méthode GET permet d'envoyer les éléments du formulaire
au travers de l'URL du script, en ajoutant l'ensemble des paires nom/valeur à l'URL
du script, séparé de celui-ci par un point d'interrogation, ce qui donne
une URL du type:
http://nom_du_serveur/cgi-bin/script.cgi?champ1=valeur1&champ2=valeur2...
Toutefois, la longueur de la chaîne URL étant limitée à 255 caractères,
les informations situées au-delà de cette limite seront irrémédiablement perdues.
De plus, cela crée une URL surchargée dans la barre d'adresse d'un navigateur et peut dévoiler
des informations sensibles comme un mot de passe...
La méthode POST est une bonne alternative à la méthode GET. Cette méthode
code les informations de la même façon que la méthode GET (encodage URL
et paires nom/valeur) mais elle envoie les données à la suite des en-têtes HTTP, dans un champ
appelé corps de la requête. De cette façon la quantité de données envoyées
n'est plus limitée, et est connue du serveur grâce à l'en-tête permettant de connaître
la taille du corps de la requête.
L'un des points forts des servlets est la possibilité de traiter (dans le jargon de l'informatique on dira "parser")
automatiquement les données en provenance de formulaires.
En effet, l'objet HttpServletRequest possède de nombreuses méthodes (dont la plus courante getParameter())
permettant de retourner la valeur d'un champ du formulaire en lui passant en argument le nom du champ, qu'il s'agisse de
données pasées par la méthode POST ou GET.
La méthode getParameter() de l'objet HttpServletRequest permet
de retourner le valeur d'un champ dont on a passé le nom en argument :
public String getParameter(String Key)
Les noms des champs sont sensibles à la casse. Il faut donc veiller à les
saisir dans la servlet comme ils le sont dans le formulaire HTML. La méthode
getParameter() retourne une chaîne contenant la valeur du champ. Si le champ
est vide, une chaîne vide est retournée. Si le champ n'existe pas, la valeur
null est retournée.
Ainsi, un formulaire comportant une entrée comme suit :
<Input type="text" name="NomDuChamp">
sera traité dans la servlet de cette façon :
String Champ = req.getParameter("NomDuChamp")
Lorsqu'un champ d'un formulaire peut avoir plusieurs valeurs (liste à choix multiples,
cases à cocher, ...), il est possible d'utiliser la méthode getParameterValues() :
public String[] getParameterValues(String Key)
Cette méthode retourne un tableau contenant l'ensemble des valeurs affectées
à la clé spécifiée en paramètre.
Pour connaître l'ensemble des noms des champs du formulaire passé à la
servlet, il est possible d'utiliser la méthode getParameterNames() :
Enumeration getParameterNames()
Cette méthode retourne un objet Enumeration, contenant la liste des champs du formulaire.
Il est possible de transformer chaque entrée en chaîne, puis de la traiter avec
la méthode getParameter() afin de récupérer sa valeur.
Reprenons le formulaire présenté ci-dessus :
<FORM Method="POST" Action="http://serveur/servlet/UserInfo">
Nom : <INPUT type=text size=20 name=Nom><BR>
Prénom : <INPUT type=text size=20 name=Prenom><BR>
Age : <INPUT type=text size=2 name=Age><BR>
<INPUT type=submit value=Envoyer>
</FORM>
La servlet suivante permet d'afficher les valeurs des paramètres Nom, Prenom, Age
saisis par l'utilisateur dans le formulaire :
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class UserInfo extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>\n<BODY>\n" +
"<H1>Recapitulatif des informations</H1>\n" +
"<UL>\n" +
" <LI>Nom: "
+ request.getParameter("Nom") + "\n" +
" <LI>Prenom: "
+ request.getParameter("Prenom") + "\n" +
" <LI>Age: "
+ request.getParameter("Age") + "\n" +
"</UL>\n" +
"</BODY></HTML>");
}
}
Il est ainsi facile de créer une servlet permettant d'afficher l'ensemble des paramètres
qui lui ont été passés par formulaire grâce à la méthode
getParameterNames() :
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class Parametres extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>\n" +
"<h1>Tableau des paramètres</h1>\n" +
"<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n" +
"<tr>\n" +
"<th>Nom</th><th>Valeur(s)</th>");
Enumeration NomsParam = request.getParameterNames();
while(NomsParam.hasMoreElements()) {
String NomParam = (String)NomsParam.nextElement();
out.println("<tr><td>" + NomParam + "</td></tr>\n");
String[] ValeursParam = request.getParameterValues(NomParam);
if (ValeursParam.length() == 1) {
String ValeurParam = ValeursParam[0];
if (ValeurParam.length() == 0)
out.println("<td><b>Aucune valeur</i></td>");
else out.println(ValeurParam);
}
else {
out.println("<td><ul>");
for(int i=0; i < ValeursParam.length(); i++) {
out.println("<li>" + ValeursParam[i] + "</li>");
}
out.println("</ul></td></tr>");
}
}
out.println("</table>\n</body></html>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Quelques remarques :
- La boucle while(NomsParam.hasMoreElements()) permet de parcourir tous les éléments
du formulaire, associé à NomsParam.nextElement()
-
|