Page Home (contact) Retour TPs
Vous allez utiliser l'IDE NetBeans pour écrire vos applications et le serveur d'application GlassFish pour les exécuter.
Récupérer la version "Java EE" sur le site netbeans.org. Pour l'installer il suffit de cliquer sur le fichier .exe récupéré.
GlassFish sera installé en même temps que NetBeans. Notez bien les login et mots de passe.
GlassFish écoute par défaut sur le port 8080. Ce port est souvent utilisé par d'autres serveurs (par exemple le SGBD Oracle XE ou Tomcat). Si vous avez des problèmes, vous pouvez changer ce port dans le fichier <repertoire installation GlassFish>/
glassfish/domains/domain1/config/domain.xml
.
Les lignes à modifier :
<network-listeners> <network-listener port="8080" protocol="http-listener-1" transport="tcp" name="http-listener-1" thread-pool="http-thread-pool"></network-listener> <network-listener port="8181" protocol="http-listener-2" transport="tcp" name="http-listener-2" thread-pool="http-thread-pool"></network-listener> <network-listener port="4848" protocol="admin-listener" transport="tcp" name="admin-listener" thread-pool="admin-thread-pool"></network-listener> </network-listeners>
Il faudra relancer ensuite GlassFish s'il était déjà lancé.
Créez un projet NetBeans de type "Web application" (sous "Java Web"), nommé Servlets.
Créez un premier servlet de classe ufe.HelloWorldServlet
(dans le paquetage ufe) : clic droit sur le projet, New et choix Servlet. Laissez les valeurs par défaut. Notez le "Context Path" qui correspond au nom qui sera utilisé pour désigner l'application dans l'URL qui lancera l'application (/Servlets
si vous ne changez rien). Notez aussi, sur la 2ème page du wizard de création du servlet, le nom du servlet qui va identifier le servlet, et l'"URL Pattern(s)" qui va indiquer quel(s) URLs lanceront l'exécution du servlet.
Examinez le servlet créé. Posez des questions à l'enseignant si vous ne comprenez pas. Regardez en particulier l'annotation de la classe et les méthodes doGet
et doPost
.
Question 1 : Qu'est censé faire ce servlet ? Examinez le code pour voir comment le servlet va générer la réponse à une requête de l'utilisateur de l'application ?
Lancez l'exécution du projet par un clic droit sur le projet à gauche et Run. Remarquez le lancement du serveur d'application GlassFish qui va servir en particulier de serveur Web.
Question 2 : Vous voyez l'affichage de "Hello World!" dans une page Web. D'où vient-il ?
Notez l'URL dans le navigateur : http://localhost:8080/Servlets/ . 8080 est le port IP sur lequel GlassFish écoute. L'URL n'indique pas d'adresse spéciale hormis le contexte de l'application que vous venez de créer. Cela signifie que l'URL "welcome" de votre application doit être affiché. Cet URL est indiqué dans le fichier web.xml mais votre projet n'a pas de fichier web.xml (voir "Configuration Files"). Par défaut, les fichiers index.html et index.jsp sont recherchés. C'est donc le fichier index.jsp qui est exécuté. Les fichiers JSP ne sont pas étudiés dans ce cours car ils sont de moins en moins utilisés dans les applications Java (ils ont été remplacés par d'autres types de fichiers).
Question 3 : Arrangez-vous pour que la page affichée corresponde au servlet de votre application plutôt qu'au fichier index.jsp.
Indications : Créez un fichier web.xml (clic droit sur le projet, New, Other, Web, Standard Deployment Descriptor (web.xml). Vous voyez qu'il est bien placé à la bonne place (WEB-INF). Vous devez maintenant modifier le fichier créé pour répondre à la question. Vous pouvez écrire directement le code XML ou vous pouvez utiliser les facilités offertes par NetBeans en cliquant sur "Pages" juste au-dessus du code de web.xml (en ce cas, regardez ensuite le code généré en cliquant sur "Source"). Attention de ne pas mettre de "/" devant HelloWorldServlet.
Question 4 : Modifiez le servlet pour qu'il affiche "Bonjour, de la part de <votre nom>" (utilisez une variable locale "nom" dans laquelle vous mettez votre propre nom) en plus de ce qu'il affichait. Testez en lançant l'application.
Question 5 : Ecrivez un autre servlet d'URL /Servlet2, qui affiche aussi votre nom en utilisant un paramètre de requête. Dans le premier servlet ajoutez un lien qui pointe vers cet autre servlet en lui passant en paramètre de l'URL le nom qui est dans la variable locale "nom" en paramètre de l'URL. Ajoutez 2 liens : un lien avec une adresse relative (de type "Servlet2") et un autre avec une adresse absolue (de type "/Servlets/Servlet2") . Pour ce dernier arrangez-vous pour que le nom de l'application (le contexte) ne soit pas écrit en dur (regardez comment faire dans le code généré par NetBeans pour les servlets). Testez.
Indication : pour récupérer le nom dans le deuxième servlet, cherchez la méthode de la classe HttpServletRequest
qui permet de récupérer un paramètre de la requête.
Fichier web.xml
Classe HelloWorldServlet
Classe Servlet2
Ecrivez un servlet "/Formulaire" qui génère un formulaire HTML tout simple qui demande son nom et sa date de naissance à l'utilisateur. Pour simplifier vous supposerez que l'utilisateur donne bien le bon format JJ/MM/AAAA à la date de naissance ; par exemple 15/09/2012 (ou 15/9/2012) pour le 15 septembre 2012.
Traitez le formulaire avec un autre servlet "/NomAge" qui affiche le nom saisi par l'utilisateur, et son âge, par exemple,
Bonjour Tom Sergent
vous avez 32 ans.
Dans le cas où l'utilisateur n'a pas tapé le bon format pour la date de naissance, un message d'erreur devra être affiché à la place de l'âge ; par exemple,
Bonjour Tom Sergent
.
'25/11' n'a pas le bon format 'JJ/MM/AAAA'
Indications :
private int calculerAge(String dateNaissanceString) throws ParseException { DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); Date dateNaissanceDate = df.parse(dateNaissanceString); Calendar dateNaissanceCalendar = Calendar.getInstance(); dateNaissanceCalendar.setTime(dateNaissanceDate); Calendar today = Calendar.getInstance(); int age = today.get(Calendar.YEAR) - dateNaissanceCalendar.get(Calendar.YEAR); if (today.get(Calendar.MONTH) < dateNaissanceCalendar.get(Calendar.MONTH)) { age--; } else if (today.get(Calendar.MONTH) == dateNaissanceCalendar.get(Calendar.MONTH) && today.get(Calendar.DAY_OF_MONTH) < dateNaissanceCalendar.get(Calendar.DAY_OF_MONTH)) { age--; } return age; }
<form action="..."> Nom :
<input name="nom"/> <br/> Date de naissance (JJ/MM/AAAA) : <input name="dateNaissance"/> <br/> <input type="submit" value="Soumettre les données"/> </form>
Vous allez écrire un servlet qui va afficher une page Web contenant la liste des employés qui sont enregistrés dans la base de données employes
que vous avez créée dans le cours TIC409 (TP sur JPA).
Obtenir une connexion à une base se fait différemment lorsqu'on utilise un serveur d'application. La définition de la base est donnée dans le serveur d'application par sa console d'administration, par un fichier de configuration de l'application ou par une annotation de l'application. Pour cet exercice vous allez utiliser une annotation que vous placerez juste après l'annotation @WebServlet
(vous ferez autrement dans les TPs suivants) :
@DataSourceDefinition(name = "java:app/env/jdbc/employes2", className = "org.apache.derby.jdbc.ClientDataSource", portNumber = 1527, serverName = "localhost", databaseName = "employes")
Cette annotation va enregistrer la définition de la base dans le serveur d'application sous le nom JNDI "java:app/env/jdbc/employes2
" (vous auriez pu choisir un autre nom à la fin ; une autre base sera plus tard enregistrée sous le nom employes
donc n'utilisez pas le nom employes
).
Au début de la classe, au niveau des variables d'instance, vous allez demander au serveur d'application d'injecter la source de données ainsi définie (le serveur d'application vous fournira/injectera la source de données dans la variable employes
, quand vous en aurez besoin ; plus de détails dans un des cours à venir) :
@Resource(lookup = "java:app/env/jdbc/employes2") private DataSource employes;
Ensuite, dans le code du servlet vous obtiendrez la connexion par le code suivant (il n'est pas bon d'écrire un mot de passe en dur dans une classe Java ; pour cet exercice dans un premier temps vous le mettrez dans une variable de la classe puis vous le mettrez ensuite comme paramètre d'initialisation du servlet) :
Connection conn = employes.getConnection("toto", mdp);
Ensuite vous travaillez avec la connexion exactement comme vous l'avez fait dans le cours TIC409 sur JDBC.
Voici un extrait de la table qui sera contenue dans la page HTML générée par le servlet :
<table> <tr> <td>LEROY</td> <td>80959.66</td> </tr> <tr> <td>NOIRET</td> <td>22800.0</td> </tr> ... </table>Pour tester, lancez le projet et tapez directement l'URL correspondant au servlet ; par exemple, http://localhost:8080/Servlets/ListeEmployes.
Si vous voulez en savoir plus sur les servlets, lisez le tutoriel d'Oracle à l'adresse http://docs.oracle.com/javaee/6/tutorial/doc/bnafd.html