![]() |
![]() |
Accueil > Intranet Michel Buffa > Applications web, M1 Miage 2010-2011 > TP2 : Etude des servlets
TP2 : Etude des servletsDe $1Table des matières
IntroductionCe TP est consacré à l'étude des servlets. Nous allons étudier des exemples en Java EE 5 (où de nombreux éléments sont indiqués dans le descripteur web.xml, comme le mapping des servlets sur des URLs), mais aussi des exemples en Java EE 6 où les annotations de code sont omniprésentes. Etude d'un projet contenant de nombreux exemples J2EE 1.4Oui, il s'agit d'exemples en J2EE 1.4 (l'ancêtre de Java EE 5, lui-même ancêtre de Java EE 6 !). Ils sont toujours d'actualité, les seules choses qui peuvent changer en Java EE 6 sont les annotations de code qui permettraient de se passer d'une partie de ce qui est spécifié dans le descripteur web.xml (nous allons l'étudier un peu plus tard...) Ouverture du projetSous netbeans, faites file/nouveau projet, puis choisissez dans les exemples le projet suivant : Cela va ouvrir dans netbeans un projet Java web contenant de nombreux exemples : Lancer le projet, tester les exemples, regarder le code sourceFaites clic droit / run sur le projet, cela va ouvrir une page avec la liste des exemples de servlets que vous allez étudier. Regardez l'exécution, les URLs, et le code source. Regardez aussi le vrai code source des servlets (dans le package par défaut, sous "src"). Notez au passage la manière dont l'aspect "multi-langue" est géré (à l'aide de fichiers de propriétés et de la classe ResourceBundle) :
ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",request.getLocale()); Cette ligne indique que l'on ira chercher les "ressources" dans un fichier LocalStrings.properties par défaut, contenant des couples clé=valeur. Selon la langue du système, on ira chercher dans un fichier LocalStrings_fr.properties, LocalStrings_es.properties, LocalStrings_en.properties, etc le fichier de base étant celui par défaut. Puis ensuite, lorsqu'on veut manipuler une chaine de caractères pour l'affichage : String title = rb.getString("helloworld.title"); On retrouvera la valeur de cette chaîne de caractère dans le fichier LocalStrings_fr.properties si on est en français. Double cliquez sur le nom du fichier pour voir son contenu :
helloworld.title=Salut le Monde! requestinfo.title=Exemple d''information sur la requête requestinfo.label.method=Méthode: ... Regardons la partie "servlets" du fichier de configuration web.xmlDouble cliquez sur le fichier web.xml qui se trouve sous "configuration". Netbeans doit ouvrir une "vue" de ce fichier, vous pouvez en cliquant sur le bouton "XML" passer à la vue XML du fichier. Il contient de nombreuses informations. Pour le moment, nous allons nous intéresser à la partie "servlets", notamment au mapping entre les servlets et les URLs qui permettent de les invoquer. Vue "servlet" du fichier web.xml : Comme vous pouvez le voir, on peut utiliser des expressions régulières pour associer non pas un URL à une servlet, mais aussi plusieurs ! Ici la servlet RequestInfoExample est associée à tous les URLs de type /servlet/RequestInfoExample/* Executez donc cet exemple, et modifiez l'URL, par exemple en ajoutant "toto" à la fin : Regardez dans le source comment on peut récupérer le "/toto". Cet exemple montre comment on peut par exemple, développer une Servlet qui utilise l'URL complet pour un paramètre permettant par exemple d'aller chercher "toto" dans une base de données. Imaginez : http://www.monsite.com/disques/Beatles/AbbeyRoad, et une unique servlet "disques" qui saura à partir de cet URL aller chercher le disque "Abbey Road" des Beatles dans sa base de données. Modification de la page d'accueil par défaut du projetLorsqu'on exécute le projet il affiche la page par défaut du projet. On peut préciser quelle est cette page dans le descripteur web.xml, on peut même en indiquer plusieurs (si la première n'existe pas, c'est la seconde qui sera utilisée, etc.). Par défaut, c'est la page index.html qui est affichée. Les pages web se situent sous "Web Pages" dans la structure de projets de netbeans.
NOTE : il se peut que vous deviez faire shift-reload sur votre navigateur pour que la page s'affiche réellement, cela dépend des navigateurs et des options de cache. Positionnement de paramètres "globaux" à l'application dans le web.xml ("context parameters")Nous allons maintenant utiliser le fichier web.xml pour positionner des paramètres "globaux" à l'application. On les appelle des "Context Parameters". Vous allez, dans le fichier web.xml, positionner un de ces paramètres, que vous appellerez par exemple SMTP_server (cela peut être utile si vous écrivez une application qui envoie des mails). Vous lui donnerez comme valeur "smtp.google.com". Pour cela, double cliquez sur le fichier web.xml et utilisez l'onglet "general" pour positionner ce paramètre. Nous allons voir que l'on peut récupérer ces paramètres :
Une fois le paramètre positionné, ouvrez le fichier ContextListener.java et regardez un peu le code, nous allons nous intéresser plus particulièrement à la méthode contextInitialized() située à la fin... et nous allons ajouter deux lignes pour afficher la valeur du paramètre :
public void contextInitialized(ServletContextEvent event) { this.context = event.getServletContext(); String smtpServer = context.getInitParameter("SMTP_server"); log("contextInitialized()"); log("SMTP SERVER = " +smtpServer); } Nous allons observer ce qu'il se passe dans la console du serveur. Au passage, c'est là qu'apparaissent les erreurs s'il y en a, il faudra prendre l'habitude de l'utiliser ! Pour commencer, effaçons son contenu : Executons maintenant le programme et regardons à la loupe la trace dans la console : Habituellement, dans un contextListener, on "prépare les choses", en gros, on récupère un gros paquet de paramètres et on fait des initialisations globales à partir de ces paramètres... on crée de nouveau objets que l'on ajoute dans le servletContext (avec setAttribute). Un exemple concret : on écrit un CMS qui va utiliser de nombreux chemins sur le disque, pour gérer les images, les vidéos, les pages, etc. On va lire tous ces chemins, créer un objet de type PathManager, instance d'une classe à vous, avec des getPathForVideos() etc... et on va rajouter l'instance de ce PathManager dans le contexte. Dans n'importe quelle servlet qui devra utiliser ces chemins, dans sa méthode init() elle récupèrera dans le contexte une référence sur le PathManager et la conservera dans une variable qui sera utilisée pendant toute la durée de vie de la servlet. Exemple de code dans une servlet qui récupère le paramètre SMTP_server (ici dans la servlet SessionExample.java)
public class SessionExample extends HttpServlet { String smtpServer = ""; public void init() { smtpServer = getServletContext().getInitParameter("SMTP_server"); System.out.println("Dans la Servlet SessionExample.java : SMTP Server = " + smtpServer); } ... Faites donc cette modification puis exécutez la servlet, et regardez les traces du serveur comme précédemment. Utilisation de paramètres d'initialisation d'une Servlet (les "init parameters")Il est possible de passer des paramètes aux servlets, qui seront récupérables de la même manière que les paramètres globaux, sauf que cette fois-ci ils seront propres à une servlet. On utilise pour cela l'onglet "Servlet" de l'éditeur de fichier web.xml.
Redirection du traitement, gestion de session, authentificationDans une véritable application, les servlets jouent le rôle de contrôleurs web. En gros, on reçoit une requête, on la traite, puis on a passe la main à un autre élément (typiquement une page JSP ou une page JSF pour afficher des résultats), on peut aussi passer la main à une autre Servlet. Ce "passage" se fait à l'aide de ces quelques lignes de code :
RequestDispatcher dp = request.getRequestDispatcher("bienvenue.html"); dp.forward(request, response); Attention, on n'a pas le droit d'exécuter quoique ce soit après la dernière ligne, puisque la Servlet qui a exécuté ce code a déjà "passé la main". Notez que on passe à l'URL vers lequel on va la requête et la réponse dans l'état. Travail à faire :
Bien sûr dans les prochains cours, lorsque nous aurons vu les pages JSPs et JSFs nous feront tout cela de manière bien plus élégante ! Un peu de Java EE 6, annotations, ServletFilters et WebListenersDans Java EE 6 une des grosses différences est que le fichier web.xml n'est plus indispensable et que nombre d'annotations de code remplacent des éléments auparavant dans le web.wml, comme :
Travail à faire :
Création d'un gestionnaire de contactsVoilà, maintenant c'est à vous de jouer. On vous demande de créer un petit gestionnaire de contacts. Créez un projet de type "web application". Vous utiliserez la classe Contact.java que vous écrirez, avec comme attributs nom, prenoms, adresse, tel. Ajoutez constructeurs, get/set etc. Et une Servlet GestionnaireDeContacts + des pages html pour saisir un contact, et chercher des contacts, etc. L'affichage sera du HTML généré par la Servlet (nous n'avons pas encore vu comment créer une "vue" des résultats séparément de la Servlet, mais cela va venir...) Pour démarrer, vous ne ferez pas de persistence, utilisez une Collection pour gérer les contacts.
Par la suite nous verrons comment améliorer ce petit gestionnaire.
Mots clés:
|
Powered by MindTouch Deki Open Source Edition v.8.08 |