Aller au menu - Aller au contenu

Icône Paramètres de servlets

Mise à jour : 24/07/2009
Difficulté : Intermédiaire Intermédiaire Creative Commons BY-NC-SA
10 160 visites depuis 7 jours, dont 352 sur ce chapitre classé 25/786
Nous allons aborder un aspect bien pratique de nos chères servlets : les paramètres !
Nous allons voir que ceux-ci peuvent nous sauver la mise dans certains cas et nous évitent bien des tracas...
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Paramètres d'initialisation

Imaginez que vous souhaitez attribuer un titre à votre application et que celui-ci soit lié à vos servlets.
Pour éclaircir la chose, vous savez qu'une page JSP est appelée via une servlet :
Comment feriez-vous pour affecter un titre différent à votre JSP selon la servlet qui appellera cette JSP ?


Je suppose que la première chose à laquelle vous avez pensé était de mettre ce titre "en dur" dans le code de votre servlet... C'est-à-dire que ce nom est défini et attribué à votre page JSP dans une servlet ! Un peu comme ceci :

Code : Java
1
request.setAttribute("titre", "Titre de ma page");


Ou encore de définir une variable de classe initialisée avec le titre...
Ces méthodes fonctionnent très bien, je vous rassure ! Par contre, il y a un autre moyen de faire ceci : en utilisant des paramètres d'initialisation de servlets.

Les quoi ? o_O

Les paramètres d'initialisation.
C'est très simple. Lorsque votre servlet vient à la vie, vous pouvez lui dire qu'elle a, à sa disposition, différents paramètres que vous lui aurez attribués !
Afin de vous montrer que nous pouvons initialiser plusieurs paramètres, je ne vais pas en créer un, mais deux ! :waw:

Et comment tu fais ça ?

Ceci se fait grâce à notre bon vieux fichier web.xml. Par exemple, pour affecter l'attribut "nomPage" ayant pour valeur "Nom de ma page" et un autre ayant pour nom "sousTitre" et comme valeur "Sous titre de la page"à une servlet, vous n'avez qu'à faire ceci :

Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<web-app>

	<servlet>
		<servlet-class>com.sdz.control.Index</servlet-class>
		<servlet-name>StartPage</servlet-name>
		
		<init-param>
			<param-name>titrePage</param-name>
			<param-value>Nom de la page</param-value>
		</init-param>
		
		<init-param>
			<param-name>sousTitre</param-name>
			<param-value>Sous titre de la page</param-value>
		</init-param>
		
	</servlet>
	
	<servlet-mapping>
		<servlet-name>StartPage</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>


C'est simple et clair ! La balise XML <servlet></servlet> encapsule autant de balises <init-param></init-param> qu'elle le souhaite (enfin, que vous le souhaitez... ^^ ).
Comprenez bien que ces paramètres ne seront utilisables uniquement par la servlet concernée : ici, com.sdz.control.Index !

Et comment on les utilise ?


Voici la servlet liée au fichier web.xml sus-mentionné et qui utilise les paramètres :

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.sdz.control;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Index extends HttpServlet {

	public void doGet(	HttpServletRequest request, 
						HttpServletResponse response)
						throws IOException, ServletException{
		//Bon, là, c'est simple tout de même...
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		
		//La servlet a une méthode de récupération des noms de ces paramètres
		Enumeration e = getInitParameterNames();
		
		//On récupère un objet de configuration de servlets
		ServletConfig conf = getServletConfig();
		
		//Et on parcourt le tout
		while(e.hasMoreElements()){
			String name = e.nextElement().toString();
			//On appelle la méthode getInitParameter(String name) 
			//afin de récupérer la valeur 
			out.println("<p><strong>" + name + " = " + conf.getInitParameter(name) + "</strong></p>");
		}
		//Vous pouviez aussi y accéder comme ceci
		//out.println(getServletConfig().getInitParameter("titrePage"));
		//out.println(getServletConfig().getInitParameter("sousTitre"));
		
	}	
}


Ce qui nous donne :

Image utilisateur


C'est très simple d'utilisation et très utile !
Bon, nous avons utilisé une façon de faire un peu plus générique puisque nous avons récupéré tous les noms de paramètres afin de tous les afficher...
Nous avons récupéré la liste des noms de paramètres grâce à l'instruction Enumeration e = getInitParameterNames(); puis nous avons affiché le contenu des différents paramètres en les invoquant via cette instruction : getInitParameter(name); de l'objet ServletConfig.

C'est sûr, mais qu'est-ce que c'est que cet objet : ServletConfig ?

Dites-vous que votre conteneur, Tomcat, est très sympa et qu'au moment de créer votre servlet, il crée un objet contenant tous les paramètres d'initialisation ! :magicien:
Et cet objet est le suivant :

Image utilisateur


Cet objet n'a pas beaucoup de méthodes, mais vous pouvez deviner ce que celles-ci font...
Dis donc, la méthode getInitParameterNames() , tu n'as pas utilisé cet objet pour l'invoquer tout à l'heure ?

Votre sens de l'observation s'est grandement amélioré depuis le début de ce tuto, ou c'est moi... :-°
En fait, dans nos servlets, il y a une méthode qui s'appelle ainsi et qui a le même rôle que la méthode de l'objet en question, et pour cause : la méthode présente dans notre servlet invoque la méthode de l'objet ServletConfig... ^^

Par contre, que fait la méthode getServletContext() ?

Nous allons aborder ceci tout de suite...
Par contre, même si vous êtes d'accord sur l'utilité de ces paramètres d'initialisation, imaginez un instant le cas contraire à ce que je vous demandais plus haut :
imaginez que vous ayez besoin d'un titre d'application commun à chaque page !

Comment procéderiez-vous ? Où mettre ce titre ? Dans toutes nos servlets ? Dans toutes nos JSP ?
Je vous laisse réfléchir sur la marche à suivre quelques instants avant de vous donner une réponse, mais ceci a un rapport avec le fameux objet ServletContext.

Tout dépend du contexte...

Voilà un mot qui vous avait chatouillés lors d'un précédent chapitre...
En fait, c'était lorsque je vous avais expliqué à quoi servait le fichier web.xml.

Comme je vous le disais alors, ce fichier permet de définir le contexte de l'application !
Voyez un peu ça comme l'environnement de l'application : ce dont l'application a besoin pour travailler.
Vous savez déjà que c'est grâce à ce contexte que le conteneur sait faire fonctionner l'application, mais ce que vous ignorez, c'est que vous pouvez aussi définir des paramètres à ce contexte.

Ah oui ? o_O

En plus, ça se fait quasiment comme la déclaration de paramètres pour une servlet, à quelques différences près.
Vous l'aurez deviné, ça se passe encore dans le fichier web.xml...

Mais concrètement, en quoi cela va répondre à notre besoin concernant un titre commun à chaque page ?

Hi hi !
C'est là que la magie s'opère : les paramètres de contexte sont globaux à toute l'application !
Comprenez ceci dans le sens où tous ces paramètres seront accessibles à toutes nos servlets !

Tout comme les paramètres d'initialisation de servlets, le conteneur va créer un objet, mais cette fois, il s'agira d'un objet ServletContext qui sera partagé par toutes nos servlets !

La méthode getServletContext() de l'objet ServletConfig nous retourne donc cet objet ?

Tout à fait ! Mais comme les concepteurs de la technologie JEE sont des gens super gentils, ils ont fait en sorte que nos servlets puissent invoquer une méthode getServletContext() sans passer par l'objet ServletConfig.
Voyez ça comme un raccourci au même titre que la méthode getServletConfig() !

Bon, assez de blabla, voici comment on déclare des paramètres pour toute notre application :

Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<web-app>

	<servlet>
		<servlet-class>com.sdz.control.Index</servlet-class>
		<servlet-name>StartPage</servlet-name>
		
		<init-param>
			<param-name>titrePage</param-name>
			<param-value>Nom de la page</param-value>
		</init-param>
		
		<init-param>
			<param-name>sousTitre</param-name>
			<param-value>Sous titre de la page</param-value>
		</init-param>
		
	</servlet>
	
	<context-param>
		<param-name>contextParam</param-name>
		<param-value>Paramètre global à l'application !</param-value>		
	</context-param>
	
	<context-param>
		<param-name>contextParam2</param-name>
		<param-value>Paramètre global à l'application ! (numéro 2)</param-value>		
	</context-param>
		
	<servlet-mapping>
		<servlet-name>StartPage</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
</web-app>


Voici une servlet qui utilise les paramètres d'initialisation et des paramètres de l'application (vous pourrez comparer l'utilisation des deux types de paramètres) :

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.sdz.control;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Index extends HttpServlet {

	public void doGet(	HttpServletRequest request, 
						HttpServletResponse response)
						throws IOException, ServletException{
		
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		
		Enumeration e = getInitParameterNames();
		ServletConfig conf = getServletConfig();
		
		while(e.hasMoreElements()){
			String name = e.nextElement().toString(); 
			out.println("<p><strong>" + name + " = " + conf.getInitParameter(name) + "</strong></p>");
		}
		
		out.println("<h1>-------------------------------</h1>");
		
		//Ici, on récupère le contexte de l'application
		ServletContext context = getServletContext();
		//De la même manière que ci-dessus, nous récupérons la liste de paramètres
		e = context.getInitParameterNames();
		
		//Et on parcourt le tout
		while(e.hasMoreElements()){
			String name = e.nextElement().toString();
			//On appelle la méthode getInitParameter(String name) 
			//afin de récupérer la valeur 
			out.println("<p><strong>" + name + " = " + context.getInitParameter(name) + "</strong></p>");
		}
				
	}	
}


Et le résultat, sous vos yeux pétillants :magicien: :

Image utilisateur


Et là, vous pourrez faire autant de servlets que vous le souhaitez, ces paramètres seront accessibles à toutes !


Vous avez vu que, mis à part le nom de la balise, l'endroit où se trouvait la balise a son importance :

Image utilisateur


Vous voyez bien que les paramètres de la servlet se trouvent dans la balise <servlet></servlet> alors que les paramètres de l'application se trouvent dans la balise <web-app></web-app> .

C'est vrai que l'utilisation est très ressemblante aux paramètres d'initialisation de servlets...

Oui, là où la plateforme est bien faite, c'est que, mis à part le type d'objet utilisé, la méthode invoquée est la même :

Code : Java
1
2
3
4
//Pour récupérer un paramètre de la servlet
getServletConfig().getInitParameter("nomParamter");
//Pour récupérer un paramètre de l'application
getServletContext().getInitParameter("nomParamter");


Par contre, ne confondez surtout pas les deux ! Il y a un objet ServletConfig par servlet et un objet ServletContext par application !


Pourtant l'objet ServletConfig nous retourne un objet ServletContext via la méthode getServletContext() ?

Oui, bien sûr ! Mais il s'agit d'un seul et même objet !
Dans le chapitre suivant nous approfondirons ce point, mais pour le moment, sachez qu'il existe un et un seul objet ServletContext dans toute l'application alors qu'il y a un objet ServletConfig par servlet !

Voici un petit schéma afin d'illustrer tout ça :

Image utilisateur


Un autre point important et que vous aurez sans doute remarqué : qu'il s'agisse de paramètres de servlet ou de paramètres de contexte, on ne peut utiliser que des String comme valeurs de nos paramètres !

Tu veux dire que nous ne pouvons pas utiliser d'objets ?

Si, mais par un moyen détourné. En fait, nos servlets peuvent créer des paramètres prenant des objets comme valeurs ! Voyons ça tout de suite... ^^

Des objets en paramètres

Alors, déjà, au cas où ne l'auriez pas remarqué, l'objet ServletConfig n'a pas de méthode permettant de définir des paramètres ; d'ailleurs, l'objet ServletContext non plus.

Qu'est-ce que tu nous chantes ?

Je vous dis simplement que nous n'allons pas définir des paramètres d'initialisation, mais des attributs !
Et, en fait, ceci est logique puisque, dans nos servlets, la phase d'initialisation est terminée depuis longtemps. ^^
Nous verrons ceci en détail dans le prochain chapitre.

Du coup, comment fait-on pour définir des objets en attribut de l'objet ServletContext ?

De la même façon que vous avez procédé avec l'objet HttpServletRequest : avec la méthode setAttribute(String name, Object value).

La différence de taille ici, c'est que, vu que nous travaillons avec l'objet ServetContext, ces attributs seront accessibles depuis une autre servlet que celle les ayant définis. :waw:

Afin d'illustrer mes dires, je vous ai concocté un petit exemple. Nous allons définir trois attributs à notre objet ServletContext dans une servlet :
  • un objet Date ;
  • deux objets ZColor (objet créé par mes soins).


Voici le fichier ZColor.java



Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package com.sdz.model;

public class ZColor {

	private String color = "";
	public ZColor(String color){
		this.color = color;
	}
	
	public String toString(){
		return "COULEUR -> " + this.color;
	}
}



Nous utilisons donc ces objets dans une servlet de base dont voici le code.

Le fichier Index.java




Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.sdz.control;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Index extends HttpServlet {

	public void doGet(	HttpServletRequest request, 
						HttpServletResponse response)
						throws IOException, ServletException{
		
		
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		
		//Ici, on récupère le contexte de l'application
		ServletContext context = getServletContext();
		
		//On ne définit pas de paramètres d'initialisation mais des attributs !
		//Ceci en spécifiant un couple clé -> valeur
		context.setAttribute("obj", new java.util.Date());
		context.setAttribute("obj2", new com.sdz.model.ZColor("Rouge"));
		context.setAttribute("obj3", new com.sdz.model.ZColor("Jaune"));
		
		out.println("<h2>obj : " + context.getAttribute("obj") + "</h2>");
		out.println("<h2>obj2 : " + context.getAttribute("obj2") + "</h2>");
		out.println("<h2>obj3 : " + context.getAttribute("obj3") + "</h2>");
		out.println("<a href=\"context\">Lien vers une autre page</a>");
		
	}	
}


La servlet ci-dessus va affecter et afficher les attributs que nous passons à l'objet ServletContext.
En plus de ça, la servlet affiche un lien qui pointe vers une autre servlet, que voici :

Fichier TestContext.java



Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.sdz.control;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestContext extends HttpServlet{

	public void doGet(	HttpServletRequest request, 
			HttpServletResponse response)
			throws IOException, ServletException{
		ServletContext context = getServletContext();
		PrintWriter out = response.getWriter();
		
		response.setContentType("text/html");
		
		out.println("<h2>obj : " + context.getAttribute("obj") + "</h2>");
		out.println("<h2>obj2 : " + context.getAttribute("obj2") + "</h2>");
		out.println("<h2>obj3 : " + context.getAttribute("obj3") + "</h2>");
	}
	
}


Le tout mappé dans le fichier web.xml



Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<web-app>

	<servlet>
		<servlet-class>com.sdz.control.Index</servlet-class>
		<servlet-name>StartPage</servlet-name>		
	</servlet>
	
	<servlet>
		<servlet-class>com.sdz.control.TestContext</servlet-class>
		<servlet-name>TestContext</servlet-name>
	</servlet>

	<servlet-mapping>
		<servlet-name>StartPage</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	<servlet-mapping>
		<servlet-name>TestContext</servlet-name>
		<url-pattern>/context</url-pattern>
	</servlet-mapping>
	
</web-app>


Le résultat de tout ceci est le suivant :

Arrivés sur la page d'accueil, nous spécifions des attributs à notre contexte et nous les affichons :


Image utilisateur


Le lien de la page précédente nous envoie sur cette page :


Image utilisateur

:magicien:
Vous avez donc la preuve que les objets passés à notre contexte sont toujours accessibles via une autre servlet !

Bon, je crois que vous en avez assez vu pour aujourd'hui. Rendez-vous au QCM ! ;)

Q.C.M.

Quel est l'objet qui permet d'accéder aux paramètres d'initialisation d'une servlet ?
Quel est l'objet qui permet d'accéder aux paramètres d'initialisation de l'application ?
Où doit-on placer les balises <init-param></init-param> et leurs contenu ?
Où devons-nous mettre les balises <context-param></context-param> et leurs contenu ?
Votre première application JEE est composée de trois servlets, ayant toutes des paramètres d'initialisation et de quatre paramètres de contexte. Combien d'objets de chaque type comprendra l'application ?

Statistiques de réponses au QCM

Pour commencer cette partie 2, ce n'était pas un chapitre très copieux et très difficile à assimiler.
Par contre, les choses vont se compliquer avec le chapitre suivant...

Nous avons vu comment utiliser nos servlets, comment spécifier des paramètres à celles-ci mais nous ne savons toujours rien sur ce qu'il se passe dans notre cher conteneur. :o

Le chapitre suivant mettra quelques points au clair.
Chapitre précédent Sommaire Chapitre suivant

Partager

8 commentaires pour "Paramètres de servlets"
Note moyenne : 3.17 / 4 (294 votes)
Pseudo Commentaire
Hors ligne Tiamat # Posté le 17/05/2010 à 19:35:26
Uttini !!!
Avatar

petit détail anodin, dans la partie 3 tu as marqué ServetContext au lieu de ServletContext à un endroit.
Voilà...
Hors ligne 2become1 # Posté le 24/11/2010 à 21:02:20
Sm@il
Avatar

Avis : Très bon

100% ok avec SoftDeath

Sous Ubuntu, 99% des bugs se situent entre le clavier et la chaise de bureau...
 
Hors ligne hannibal.76 # Posté le 04/07/2011 à 13:56:09

Dans la partie "parametres de servlets" il y a une petite coquille:

TestServlet.java devrai etre remplacer par TestContext.java (du même nom que la class ;) )

Image utilisateur
Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne bobphilip # Posté le 06/07/2011 à 14:22:23

Salut tu as expliqué comment créer des variables de contexte, mais tu ne dis pas comment les afficher dans la vue, peux tu montrer un exemple ? Car tu les recupères dans ton controlleur, et la vue alors ? Faut faire une assignation dans le controlleur pour que ces variables soient accessibles dans la vue ?

Merci pour le feedback
Hors ligne cysboy # Posté le 06/07/2011 à 19:47:12
tout est bô dans l' info
Avatar

Avis : Très bon Groupe : Auteurs

Ville : Tremeur
Pays : France métropolitaine
Études : CNAM

Salut,
Ne t'inquiète pas, tout ceci sera vu dans la partie sur les JSP.
Partie qui devrait arrivée pour la rentrée si tout ce passe bien. :)

Image utilisateurImage utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur
 

Voir tous les commentaires