Servlets - Gestion des formulaires

Décembre 2016

Introduction aux formulaires

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é) :
Nom :
Prénom :
Age :

Le codage des informations

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

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

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.

Lire les paramètres avec une servlet

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()

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")

La méthode getParameterValues()

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.

La méthode getParameterNames()

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.

Un exemple de formulaire

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>");  
  }
}

Lister l'ensemble des paramètres

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()

A voir également :

Ce document intitulé «  Servlets - Gestion des formulaires  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.