Introduction aux pages JSP
Introduction
Une page JSP est essentiellement une page HTML dans laquelle on peut injecter du code Java. Une page JSP peut accéder facilement à l'objet request provenant d'un servlet afin d'y récupérer des informations.
Un des avantages d'utiliser les pages JSP, c'est qu'on peut clairement séparer le traitement de la requête par le servlet de la structure de la page en tant que tel.
Le code HTML permet de créer la structure statique de la page, tandis que le code Java intégré permet de générer des éléments de façon dynamique.
Éléments de base
Éléments de script
Il existe 4 types d'éléments de script dans les pages JSP
| Élément | Syntaxe |
|---|---|
| Commentaires | <%-- ... --%> |
| Déclaration | <%! ... %> |
| Scriplet | <% ... %> |
| Expression | <%= ... %> |
- Commentaires: Ceci nous permet d'ajouter des commentaires dans la page, comme on le ferait dans le code.
- Déclaration: Permet de déclarer des variables ou fonctions qu'on peut par la suite réutiliser dans la page, dans un scriplet ou une expression par exemple.
- Scriplet: Permet l'exécution de code Java. Ce code sera exécuté par le servlet. Un scriplet n'affiche pas de valeur automatiquement, il faut utiliser l'objet
outsi on veut afficher quoi que ce soit sur la page. - Expression: Évalue une expression Java et affiche automatiquement le résultat sur la page JSP.
Les objets implicites
Certains objets sont disponibles à toutes les pages JSP. On peut s'en servir pour récupérer différentes informations ou faire afficher du contenu.
| Objet | Utilité |
|---|---|
| request | L'objet request fourni par la classe HttpServletRequest. On pourra y retrouver l'information ajoutée par le servlet dans l'objet request avant le transfert vers la page JSP. |
| response | L'objet response fourni par la classe HttpServletResponse |
| out | C'est le flux de sortie de la page JSP. On peut s'en servir pour faire l'affichage d'information comme l'objet PrintWriter des servlet. |
| session | La variable de session Java |
| exception | Disponible sur les pages d'erreur, permet de récupérer les informations sur l'erreur qui est survenue |
Les directives JSP
En plus des balises déjà présentées, il existe une balise de "directive", la balise <%@ ... %>. Nous utiliserons deux directives précises.
- La directive page: Une page JSP doit absoluement avoir cette directive pour bien fonctionner. Elle permet de configurer différents attributs de la page en tant que tel.
| Attribut | Rôle de l'attribut | Valeur par défaut |
|---|---|---|
| contentType | Indique le type MIME de la page, le type de contenu de la réponse | text/html |
| pageEncoding | L'encodage de la page (on voudra généralement UTF-8) | charset=ISO-8859-1 |
| import | Permet d'importer des modules Java dans la page | aucune |
| errorPage | L'URL de la page vers laquelle rediriger en cas d'erreur sur la page | aucune |
| isErrorPage | Indique que la page est considérée comme une page d'erreur | "false" |
Exemple d'une directive page simple
<%@ page contentType="text/html; charset=UTF-8" %>
- La directive include: Cette directive nous permet d'inclure d'autres fichiers dans notre page JSP.
<%@ include file=”chemin relatif vers le fichier” %>
Transmettre des informations grâce à l'objet request
Pour transférer de l'information entre les pages JSP et le servlet, nous pourrons utiliser l'objet request. Cet objet est disponible dans chacune des méthodes doXXX du servlet et il est également disponible de façon implicite dans les pages JSP. On pourra utiliser la méthode setAttribute("clé", "valeur") du côté du servlet et la méthode getAttribute("clé") du côté de la page JSP.
Voici un exemple démontrant comment on peut envoyer une liste de noms du servlet vers la page JSP et afficher son contenu sur la page JSP.
@WebServlet(name = "DemoServlet", value = "/demo")
public class JspServlet extends HttpServlet {
public List<String> names = new ArrayList<String>() {{
add("Bruno");
add("Rémy");
add("Valérie");
add("Dalicia");
add("Sébastien");
}};
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
request.setAttribute("names", names);
request.getRequestDispatcher("/liste.jsp").forward(request, response);
}
}
Puis dans la page JSP
<%@ page import="java.util.List" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Demo</title>
</head>
<body>
<h1><%= "Hello World!" %>
</h1>
<p>Liste de noms</p>
<ul>
<% List<String> names = (List<String>) request.getAttribute("names");
if (names != null) {
for (String name : names) { %>
<li><%= name %></li>
<% }
}%>
</ul>
</body>
</html>
La page JSP résultante devrait ressembler à ceci:

Note
Le principe est le même pour récupérer des informations qui seraient envoyées via un formulaire avec une méthode HTTP POST. Les informations feront partie de la requête et le nom des attributs correspondent à la valeur donnée à l'attribut name de chaque champ du formulaire.
Utiliser des dispositons (layouts)
Avec les pages JSP, il n'existe pas de méthode pour créer des pages de dispositions à proprement parler. Pour garder une certaine uniformité on utilisera la directive include pour utiliser des blocs de construction pour nos pages.
Par exemple, je peux écrire tout le contenu de la navigation dans une page JSP nommée navigation.jsp et le bas de page dans pied-page.jsp.
Pour les utiliser sur toutes les pages je pourrai écrire le contenu de mes pages de la façon suivante
<%@include file="navigation.jsp"%>
<body>
<!-- Contenu de la page actuelle -->
</body>
<%@include file="pied-page.jsp"%>
De cette façon, la page résultante contiendra le code de la page JSP navigation.jsp suivi du contenu de la page, puis le contenu de pied-page.jsp.