Atelier Création : Servlet et JSP agrémentée de JSTL

L’API Servlet fait partie du monde du Java Enterprise Edition. Cette API mature a vu le jour afin de répondre aux problématique Internet qui sont omniprésentes aujourd’hui. Elle est la base de nombreux frameworks qui permettent la création de pages HTML dynamiques notamment Struts. Cette API n’est plus souvent très utilisé en l’état, les développeurs vont préférer les frameworks plus complets se basant dessus. Mais je pense qu’il est important de connaître la base de ce que l’on utilise.

Java Servlet et Jsp

L’API Servlet est composée de nombreuses classes qui lui permettent de recevoir des requêtes HTTP, de réaliser des actions à partir de cette requête et d’y répondre. Les Servlets sont gérées au sein d’un conteneur de Servlets. Le conteneur est en charge de la gestion du cycle de vie des Servlet qu’il contient. En effet, les performances imposent à la Servlet de ne pas être instanciée comme les autres classes. C’est le conteneur qui va créer l’instance de la Servlet et qui va la conserver et la rendre disponible pour les requêtes suivantes. Le conteneur va associer les Servlet à des URLs et transmettre les requêtes HTTP à la Servlet visée. Tomcat est le conteneur de Servlet le plus utilisé. Il est le conteneur de référence de l’API Servlet et il est écrit en Java, ce qui lui permet de fonctionner sur toutes les plates-formes supportant Java.

Dans cet article, nous allons voir comment créer un projet simple avec des Servlets et des pages JSP (JavaServer Pages) avec la JSTL (Java Server Pages Standard Tag Library) notamment.

Construction du projet

Pour la mise en place du projet je vous conseil l’utilisation de l’archetype webapp de Maven:

Ceci va générer l’architecture de dossier suivante:

Ensuite, il faut avoir les dépendances suivantes vers l’API de Servlet et de la JSTL (si vous l’utilisez).

Mise en place de la Servlet

Une Servlet est une classe qui va hériter de la classe javax.servlet.http.HttpServlet. Cette classe fournit un ensemble de méthodes permettant la réception de requêtes HTTP. Il faut implémenter ces méthodes dans notre Servlet pour en définir le comportement.

/src/main/java/com/yourgroupId/servlets/BasicTotoServlet.java

Ces méthodes prennent en paramètres un objet HttpServletRequest qui va contenir les informations de la requête initiale et un objet HttpServletResponse qui va contenir les éléments de réponse renvoyés au client. Ces méthodes sont en réalité appelées par la méthode service() de la classe Servlet, mais aucune surcharge n’est nécessaire. Deux autres méthodes assez utiles des Servlets sont les méthodes init() et destroy() qui sont appelées respectivement après l’instanciation et avant la destruction de l’instance de la classe. Leur définition est facultative mais il peut être intéressant de les connaître.

Une fois cette classe créée, on va la déclarer et lui associer un chemin dans le web.xml.

/src/main/webapp/WEB-INF/web.xml

Notre Servlet est prête, il ne reste plus qu’à implémenter les méthodes. Bien sûr le PrintWriter présent dans l’exemple ci-dessus n’est qu’un exemple. Plutôt que de créer entièrement notre page HTML dans la Servlet, nous allons rediriger la requête sur une page JSP contenant nos balises HTML après le traitement locale de la requête.

Page JSP Simple

Les pages JSP sont des documents dans lesquels nous allons écrire notre code HTML. Afin de transmettre la JSP lors d’une requête faite sur une Servlet nous avons juste à insérer cette ligne dans notre méthode de Servlet :

/src/main/java/com/yourgroupId/servlets/BasicTotoServlet.java

/src/main/webapp/index.jsp

Cette page est statique, mais nous n’avons plus de code HTML dans notre Servlet. Afin de créer une page dynamique, nous avons deux possibilités. La première s’appelle les JSP scriptlets, elles consistent en l’insertion du code Java à l’intérieur de notre page :

Personnellement, je n’aime pas cette solution car elle implique l’insertion de code Java directement dans la vue. Je ne donnerai donc pas plus de détails sur les scriptlets mais si cela vous intéresse, ce site est très précis sur leur fonctionnement.

La seconde méthode est l’utilisation des Expressions Langages (EL) et des librairies de tags comme la JSTL. Les EL permettent d’accéder directement à des données dans les environnement de l’application web (page, request, session et application). Ces données peuvent être très diverses : listes, tables, objets, chaîne de caractères, booléen… Et il est possible de réaliser des opérations avec elles.

/src/main/webapp/index.jsp

Afin de pouvoir utiliser cet objet user, il faut l’avoir précédemment insérer dans un des environnements précédents. La request est sûrement la plus imple à utiliser pour un accès temporaire sur une seule page.

/src/main/java/com/yourgroupId/servlets/BasicTotoServlet.java

Comment tout ceci fonctionne? En réalité les JSP sont des documents qui vont être compilés sous forme de Servlet. Chaque page va être interprétée, et réécrite sous la forme utilisée lors du premier exemple avec le PrintWriter. C’est cette surcouche qui nous permet d’utiliser les scriptlets ou les EL. Le conteneur va générer les Servlet correspondantes aux pages JSP que nous avons créées et ce sont des Servlets qui répondront lorsque l’on fera un appel à cette JSP. Les fichiers .java et .class de nos pages JSP sont d’ailleurs accessibles à l’intérieur de notre IDE.

Quelques mots sur la JSTL

La Java Standard Tag Library est une implémentation de Sun de plusieurs actions algorithmiques basiques en Java. Elles comportent plusieurs balises permettant de développer des pages JSP dynamiques. Je ne vais décrire ici que certaines balises. Plus d’informations sont présentées dans les liens en sources.

Tout d’abord, il faut faire un import de la librarie que l’on veut. Pour la librairie « core », il faut utiliser la ligne suivante dans toutes les JSP qui l’utilisent.

Cette librairie fournit des balises permettant la gestion des variables des environnements que nous avons vu plus haut (request, page, application, session), des actions conditionnels, des itérations et la gestion des URLs. Le prefix indique le nom que vont prendre les balises utilisées

Dans les balises conditionnels et d’itération, on retrouve le cœur de ce qui fait l’algorithmique, les tests et les boucles.

La balise <c:if> permet de réaliser un test comme le mot clé if en Java.

L’attribut test est la condition qui va être tester avant de rentrer dans le corps de la balise, il est obligatoire. L’attribut var va lui stocker le résultat du test sous forme de booléen.

Les balises <c:choose>, <c:when> et <c:otherwise> correspondent respectivement aux mots clés Java switch, case et default et permettent donc d’avoir une structure de type switch(<c:choose>) qui va tester les cas (<c:when>) les uns après les autres et si aucun ne correspond aller dans le <c:otherwise>.

Les itérations sont particulièrement appréciables lorsque l’on a une liste sur notre serveur et que l’on veut en afficher le contenu sur notre page. Ainsi la balise <c:forEach> va parcourir les éléments d’un objet Iterable et nous donner accès aux objets de manière individuelle.

L’attribut items va prendre l’objet Iterable et var va définir le nom de l’instance récupérée à l’intérieur de la balise.

 

Ressources complémentaires :
Blog et cours de José Paumard : Java le soir.
Cours de F. Martini sur Développez.com : Expressions Languages et JSTL.

spacer

Laisser un commentaire