TP d’applications web : JSP

Transformation d’une page HTML en JSP

  1. Renommez statistics.html en statistics.jsp. Félicitations, vous venez de créer votre première page JSP !
  2. Afin d’éviter des problèmes d’affichage dus à de mauvais en-têtes HTTP envoyés par le serveur, ajoutez la directive suivante en tête de fichier : <%@ page contentType="text/html; charset=UTF-8" %> Attention : il vaut mieux faire cette modification avec un éditeur de texte lambda car Netbeans veut être trop malin et modifie automatiquement le contenu de la page quand on ajoute la directive.
  3. Modifiez index.html pour pointer sur le nouveau nom de la page statistiques.
  4. Recompilez, déployez l’application, cliquez sur le lien « statistiques » et constatez que rien n’a changé en apparence.
  5. Vérifiez dans votre installation tomcat la présence du servlet généré à partir de votre jsp (répertoire work). Le code du servlet peut également être vu directement depuis netbeans depuis l’item view servlet du menu contextuel (clic droit) sur le fichier statistics.jsp de l’onglet projet. Attention : cette entrée n’est disponible que si le projet a été exécuté au moins une fois afin que le servlet soit généré.
    Cherchez dans ce code source comment est maintenant traité votre code HTML.
  6. En utilisant les balises <%!...%>, ajoutez au servlet généré par la page deux méthodes, donneesFormulaire et descriptionTextuelle, prenant 4 entiers en paramètres et construisant respectivement la chaîne "GRE=3&SMH=4&GIE=1&OTH=2" et la chaîne "Grenoble : 3, Saint-Martin d’Hères : 4, Gières : 1, Autres : 2" (en remplaçant les valeurs par les paramètres).
  7. En utilisant les balises <%...%>, ajoutez 4 variables locales représentant des entiers, gre, smh, gie, oth, et donnez-leur des valeurs arbitraires pour le moment.
  8. Modifiez maintenant les attributs de l’élément <img> en appelant les méthodes que vous avez définies avec ces variables locales. On utilisera les balises <%=...%>.

Accès à des objets externes

On souhaite maintenant interroger la base de données pour récupérer le nombre réel d’habitants résidant dans chaque ville. Pour cela, récupérez et adaptez le cas échéant le fichier VillesDAO.java (DAO = Database Access Object).

L’accès aux ressources tomcat est possible depuis les servlets mais pas depuis les autres classes, c’est pourquoi VillesDAO ne contient pas l’annotation @Resource. Ajoutez à votre JSP un attribut privé contenant la ressource JDBC correspondant au pool de connexions à la base de données. Vous devrez ajouter les directives import appropriées (mais netbeans peut aussi les ajouter automatiquement) :

<%@ page import="javax.sql.DataSource" %> <%@ page import="javax.annotation.Resource" %>

Il ne vous reste plus qu’à créer une instance de VillesDAO et à l’utiliser pour initialiser les variables gre, smh, gie, oth.

Page d’erreur

Vous avez peut-être pu constater que toute exception non rattrapée déclenche une erreur 500. Ceci est pratique pour débugguer mais pas très présentable pour un utilisateur final.

Création d’une page d’erreur

Les informations sur l’erreur qui s’est produite sont accessibles à cette page via pageContext.getErrorData(), un objet de classe ErrorData. Pour afficher le message, on pourra donc écrire : <%= pageContext.getErrorData().getThrowable().getMessage() %>

Ou en utilisant l’expression language : ${pageContext.errorData.throwable.message}

La page statistics.jsp doit également désigner la page erreur.jsp comme la page à invoquer en présence d’une exception. Ceci est réalisé en ajoutant en tête de statistics.jsp :

<%@ page errorPage="erreur.jsp" %>

Remarque : le détail des informations sur l’erreur (stacktrace etc.) sera dans tous les cas indiqué dans le log de tomcat. Généralement le but de la page d’erreur n’est pas de donner des détails techniques mais d’avoir quelque chose de présentable pour l’utilisateur final.

Cacher une page JSP : WEB-INF

La page d’erreur que nous avons créée ne devrait être appelée qu’en cas d’erreur. Cependant actuellement il est possible pour l’utilisateur de se rendre sur l’URL relative erreur.jsp et d’accéder directement à cette page interne. Vérifiez-le.

Pour éviter cela, on peut utiliser le dossier standard WEB-INF dont le contenu n’est jamais accessible par URL. Créez ce dossier s’il n’existe pas (il doit se trouver dans src/main/webapp au même niveau que META-INF) et déplacez-y le fichier erreur.jsp. N’oubliez pas de modifier statistics.jsp pour indiquer maintenant errorPage="WEB-INF/erreur.jsp". Nettoyez, recompilez, redéployez et constatez que la page est toujours appelée en cas d’erreur mais n’est plus accessible directement.