I. Cycle de vie d'une Servlet
Une requête dans un conteneur web est prise en charge par le conteneur; si une requête arrive pour la première fois dans le serveur Web (conteneur), on a le conteneur qui effectue les actions suivantes:
- chargement de la Servlet,
- Création d'une instance de la Servlet (pour chaque Servlet, au cours de son cycle de vie, on a une et une seule instance créée),
- Initialisation de la Servlet par appel de la méthode init() par le Conteneur web.
- Une fois que la Servlet est initialisée, elle est prête pour exécuter les requêtes.
- Pour chaque requête le conteneur génère une thread qui exécute la méthode service()
- Quand le conteneur reçoit l'ordre de détruire la Servlet, il fait appel à la méthode destroy() de la Servlet.
Les trois étapes (a, b, c) sont exécutées une et une seule fois; la quatrième étape (l'étape d) quant à elle, est exécutée à chaque fois qu'il y a une nouvelle requête. La dernière étape, quand elle est exécutée, la Servlet est définitivement détruite.
II. Cycle de vie de chaque Servlet en détail
1. Chargement de la classe Servlet
Pour qu'une classe java arrive dans la mode exécution, elle doit être chargée et c'est la même chose pour une Servlet. Lorsqu'une Servlet est chargée, il n'existe qu'une seule instance de la Servlet durant son cycle de vie.
2. Création de l'instance d'une Servlet
Une fois que la Servlet est chargée, le conteneur crée une seule instance de la Servlet.
Le container exécute cette étape un seule et une seule fois pour une Servlet donnée.
3. Initialisation de la Servlet (le Container appelle la méthode init())
L'initialisation est réalisée une fois lorsque la Servlet est créée. Dans la méthode init(), on peut avoir les paramètres d’initialisation dans le fichier de configuration web.xml; voir un exemple de web.xml (voir détail ultérieurement)
4. Appel de la méthode service()
C'est la méthode principale qui exécute la logique métier de l'application et c'est elle qui est aussi responsable du traitement des requêtes des clients. Quand une nouvelle requête d' une Servlet arrive, le conteneur génère une nouvelle Thread; la nouvelle thread exécute la méthode service() puis la logique métier de l'application ou la tâche prévue de la Servlet.
La définition de la méthode service() est:
public void service(ServletRequest request, ServletResponse response) throwsServletException, IOException{ }
La méthode service() prend deux arguments "request" de type ServletRequest et "response" de ServletResponse.
Une requête HTTP peut être de différents type comme GET, POST, PUT, DELETE, etc; le rôle de la méthode service() de voir la requête HTTP requise et de faire appel à la méthode adéquate qui peut être doGet, doPost, doPut, doDelete, etc .
doGet(ServletRequest req, ServletResponse res): le type par défaut de toute requête http est "GET"; cela veut dire que si on ne spécifie pas un type de requête c'est le type "GET" qui prend en charge la requête donc la méthode doGet() au sein d'une Servlet. Comme son nom l'indique la méthode doGet() récupère des données ou des informations du serveur via une ou plusieurs requêtes. Toutefois on peut aussi envoyer des données ou des informations au serveur via une requête. La méthode doGet(ServletRequest req, ServletResponse res)doGet a comme signature:
public void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { }
doPost(ServletRequest req, ServletResponse res): Cette méthode est utilisée pour envoyer des données au Serveur; pour faire des requêtes HTTP de type POST on le spécifie dans la balise "form" par l'attribut 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. La signature de la méthode doPost(ServletRequest req, ServletResponse res) est:
public void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { }
5. Appel de la méthode destroy()
La méthode destroy() est appelée à la fin du cycle de vie de la Servlet; elle permet aussi, si elle est invoquée, de fermer tous les fichiers ou bases de données ouverts par la Servlet lorsqu'elle était chargée par le conteneur.
Une Servlet est déchargée par le conteneur dans les deux cas suivants:
- Si le conteneur s'arrête,
- Si le conteneur recharge l'environnement d'exécution de l'application web
Après l'appel de la méthode destroy(), la Servlet es envoyée au ramasse-miette. La signature de la méthode destroy() est:
public void destroy(){
}
Comme mentionné ci-dessus, la Servlet est chargée dès qu'elle sollicitée pour la première fois pour traiter une requête. Il existe des cas où on veut qu'elle le soit avant la sollicitation d'une requête; pour cela on le définit dans le fichier de configuration "web.xml" en se servant de la propriété "<load-on-startup>" . La valeur qu'on donne à cette propriété permet de forcer le conteneur de charger la Servlet dès que le conteneur démarre.
<servlet> <servlet-name>MyFirstServlet</servlet-name> <servlet-class>MyFirstServlet</servlet-class> <init-param> <param-name>param-name</param-name> <param-value>param-value</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
Le nombre entre les deux balise ci-après "<load-on-startup>1</load-on-startup>" indique au conteneur de charger la Servlet dès que le que le conteneur est démarré. Si le nombre est négatif, la Servlet le conteneur peut charger la Servlet à n'importe quel moment.