Comme il a déjà été dit, l'interface Servlet
est l'interface centrale de cette
API. Toutes les instances de servlets implémentent cette interface, en général indirectement.
Cette interface ne définit que cinq méthodes :
L'interface Servlet
modélise un objet servlet encore très abstrait, et complètement
détaché de ce que fait une servlet HTTP. En toute rigueur, une instance de Servlet
est juste un objet qui vit dans un serveur, soumis à un cycle de vie très simple (création /
service / destruction), qui a accès à des information de configuration et des méta-données sur
lui-même.
init(SevletConfig)
et destroy()
appelée sur création et destruction
de cette servlet.
service(ServletRequest req, ServletResponse res)
: appelée lorsqu'une requête
doit être traitée par une servlet. Cette méthode est générique, et est appelée par les
méthodes doGet()
et doPost()
(entre autres).
getServletConfig()
et getServletInfo()
permettent de récupérer des
informations sur la servlet.
La classe GenericServlet
précise les choses : outre les implémentations des
méthodes de l'interface Servlet
, elle propose les méthodes suivantes.
init()
et init(ServletConfig config)
: ces méthodes permettent de gérer
une partie du déroulement du cycle de vie. Nous verrons ce cycle de vie dans la suite.
getInitParameterNames()
et getInitParameter(String name)
: ces
méthodes permettent de récupérer les paramètres d'initialisation de cette servlet, déclarés
dans le web.xml
.
log(String msg)
et log(String message, Throwable t)
: enfin
ces méthodes permettent d'enregistrer des messages dans les fichiers journal du container. Ces
méthodes n'ont que peu d'intérêt, on préfèrera en général utiliser des utilitaires comme
Log4J ou slf4J.
Enfin la classe HttpServlet
nous fait réellement entrer dans les servlets pour le web.
Elle propose un jeu de méthodes pour chaque requête HTTP qui existe : doDelete()
,
doGet()
, doHead()
, doOption()
, doPost()
,
doPut()
, doGet()
doTrace()
et doLastModified()
.
Les implémentations de ces méthodes sont vides : elles ne remplissent aucune fonction. Simplement,
elles sont appelées par le container de servlets sur requête d'un client, avec les bons paramètres,
de type HttpServletRequest
et HttpServletResponse
. Pour programmer une
servlet, il faut donc étendre cette classe, et fournir une implémentation qui convient à toute
ou partie de ces méthodes. En général, ce sont les méthodes doGet()
et
doPost()
qui sont étendues.
Le cycle de vie d'une servlet est entièrement contrôlé par le serveur d'application dans lequel vit cette servlet. Lorsqu'une requête arrive, qui doit être traitée par une servlet donnée, le serveur examine s'il possède déjà une instance de cette servlet.
Si ce n'est pas le cas, il en crée une, après avoir chargé la classe de cette servlet s'il ne l'a
pas déjà fait. Une fois cette instance créée, il appelle la méthode init()
de cette
servlet, pour lui signaler qu'elle doit se préparer à traiter des requêtes. Une fois cette méthode
exécutée, la servlet peut traiter des requêtes.
Cette méthode init()
est appelée par le serveur d'application avec un objet
de type ServletConfig
en paramètre. C'est par cet objet qu'une servlet peut
accéder à ses paramètres d'initialisation.
Les paramètres d'initialisation sont déclarés dans l'élément servlet
du fichier
web.xml
, et sont lus dans la méthodes init()
, via l'objet
ServletConfig
.
Exemple 3.3. Déclaration d'un paramètre d'initialisation d'une servlet
<servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>org.paumard.cours.servlet.TestServlet</servlet-class> <init-param> <description>paramètre d'initialisation</description> <param-name>max-retry</param-name> <param-value>10</param-value> </init-param> </servlet>
Exemple 3.4. Lecture d'un paramètre d'initialisation dans une servlet
public class TestServlet extends HttpServlet { private int maxRetry = 0 ; public void init(ServletConfig servletConfig) { String maxRetryString = servletConfig.getInitParameter("max-retry") ; this.maxRetry = Integer.parseInt(maxRetryString) ; } // suite du code de la servlet }
Si une servlet ne peut pas traiter de requête, alors elle doit jeter l'exception
UnavailableException
lors de l'exécution de sa méthode init()
.
On peut y accéder via la méthode getInitParameter(String)
, qui prend en paramètre
le nom du paramètre considéré, max-retry
dans notre exemple. Cette méthode retourne
une String
, qu'il va nous falloir convertir en int
dans notre exemple.
On peut également accéder à la liste de tous les paramètres d'initialisation par appel à la
méthode getInitParameterNames()
, qui retourne un Enumeration
.