Développement serveur avec Java 


Exercices  

Exercice 1
Controleur  de login - Utilisation de JUnit
Exercice 2
Controleur de login avec JDBC
Exercice 3
Première servlet
Exercice 4
Servlet traitant les paramètres d'une requête
Exercice 5
Page JSP traitant un formulaire
Exercice 6
Page JSP définissant une méthode Java
Exercice 7
Page JSP utilisant un JavaBean
Exercice 8
Coopération entre servlet et JSP
Exercice 8 bis
Tests web - Utilisation de HttpUnit
Exercice 9
Servlet et page JSP avec controleur de login JDBC
Liens utiles


Controleur  de login - Utilisation de Junit

On se propose de mémoriser sur le serveur l'ensemble des login/password utilisés.
On va donc développer (avec une approche "développement dirigé par les tests" ou Test Driven Development) une classe LoginController qui va se charger de ce travail (en utilisant par exemple une Hashtable).

Créer un nouveau projet Java (attention : pas un Projet Tomcat) appelé ex1 puis un package cnam.cours.util.
Y créer l'interface ILoginController déclarant les méthodes suivantes :

  1. boolean isValidLogin(String login); // should return true if the login is already stored
  2. boolean isValidLoginPassword(String login, String password); // should return true if the login is already stored withe the associated password
  3. boolean addLogin(String login, String password); // should return false if the login is already stored
  4. boolean modifyPassword(String login, String newPassword); // should return false if the login is not already stored

Créer également la classe LoginController qui implémente cette interface (dans Eclipse utiliser File->New->Class..., en précisant l'interface ILoginController pour obtenir une implémentation par défaut).

Sélectionner la classe LoginController nouvellement créée puis créer un nouveau "Test unitaire JUnit" (File->New->JUnit Test Case).
L'assistant propose alors la création de la nouvelle classe LoginControllerTest; cliquer sur le bouton "Next", cocher les boîtes à cocher devant les méthodes isValidLoginPassword et  modifyPassword de LoginController et valider. La classe LoginControllerTest est alors créée avec 2 méthodes de test vides.

Définir une fixture et une méthode setup pour initialiser l'objet testé comme dans cet exemple.

Démarche TDD

Pour la majorité des méthodes publiques de la classe LoginController à développer : 

  1. implémenter dans la classe LoginControllerTest une méthode de test (ex.: testisValidLoginPassword qui va tester isValidLoginPassword )
  2. (compiler et) exécuter la classe de test (Run As->Junit Test) => obtention d'une "Barre rouge"
  3. implémenter plus ou moins partiellement la méthode testée correspondante (ex.: isValidLoginPassword)
  4. exécuter la classe de test (ou simplement la méthode de tests),
    itérer les étapes 3 et 4 jusqu'à l'obtention de la "Barre verte".
Définir de nouvelles méthodes de tests pour tester les cas particuliers d'utilisation (testAddNullLogin, testAddNullPassword, testAddAlreadyAddedLogin, testAddEmptyLogin, testAddTooShortLogin, ...)

Pour chacune de ces méthodes de test : 

  1. implémenter la méthode de test (ex.: testAddNullLogin)
  2. (compiler et) exécuter la classe de test (Run As->Junit Test) => obtention d'une "Barre rouge"
  3. corriger  la méthode testée correspondante (ex.: addLogin)
  4. exécuter la méthode de tests,
    itérer les étapes 3 et 4 jusqu'à l'obtention de la "Barre verte".

Controleur de login avec JDBC

On dispose dans une base SQL sur le serveur de l'ensemble des login/password utilisés. Cette base est décrite par ce schéma  et contient ces données de tests. (Créer cette base de données appelée tps_jdbc avec phpMyAdmin).

Créer un nouveau projet appelé ex2 puis un package cnam.cours.util.
Y créer l'interface ILoginController.

Créer également la classe DBLoginController qui implémente cette interface (dans Eclipse utiliser File->New->Class..., pour obtenir une implémentation par défaut).

Sélectionner la classe DBLoginController nouvellement créée puis créer un nouveau "Test unitaire JUnit" (File->New->JUnit Test Case).
L'assistant crée alors la nouvelle classe DBLoginControllerTest; remplacer le code généré par celui de ce test unitaire DBLoginControllerTest.java.

Dans la classe DBLoginController, définir :

  1. un constructeur qui reçoit les 4 paramètres suivants : String jdbcDriverClassName, String dbUrl, String dbuser, String dbpassword (paramètres nécessaires à l'établissement d'une connection JDBC).
  2. un constructeur par défaut :
    public DBLoginController() {
              this("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/
    tps_jdbc", "root", "");
          }

Ajouter le driver JDBC pour MySQL dans le CLASSPATH (Project->Properties->Java BuildPath->Libraries->Add Externals Jars).
Implémenter incrémentalement chaque méthode de la classe DBLoginController (en utilisant la base SQL) et les valider à l'aide du test unitaire.

Première servlet

Prise en main d'Eclipse et du plugin Tomcat.: création d' une servlet BonjourServlet qui affiche la chaine de caractère : "Bonjour".

  1. créer un nouveau projet appelé ex3 de type Tomcat (dans un nouveau répertoire de nom ex3)
  2. créer (File->New->File) le fichier web.xml minimaliste dans le répertoire WEB-INF à partir de ce fichier.
  3. créer (File->New->Package) le package servlet dans WEB-INF/src
  4. créer (File->New->Class) la classe BonjourServlet dans WEB-INF/src/servlet (préciser sa superclasse javax.servlet.http.HttpServlet)
  5. implémenter la méthode doGet()

Etape 1 :

Ne pas ajouter de formatage dans cette première étape.

Pour tester l'application, cliquer sur l'URL suivante : http://localhost:8080/ex3/bonjour

Etape 2 :

Reprendre le code de l'étape 1 et ajouter des balises HTML afin de mettre en forme le texte affiché par la servlet.


Servlet traitant les paramètres d'une requête

Créer un nouveau projet Tomcat appelé ex4.

Etape 1 :

Créer la servlet LoginServlet (dans le package servlet). Cette servlet récupère 2 paramètres login et password et répond en créant dynamiquement une page HTML contenant la chaîne :

BONJOUR <login>

Pour tester l'application, cliquer sur l'URL suivante : http://localhost:8080/ex4/login?login=Jules&password=Verne

Etape 2 :

Créer un fichier LoginForm.html directement à la racine du projet. Y créer un formulaire d'identification contenant 2 champs nommés login et password.
Vérifier que la servlet LoginServlet  traite correctement le formulaire d'identification http://localhost:8080/ex4/LoginForm.html


Page JSP traitant un formulaire

Etape 1 :

Créer un nouveau projet appelé ex5 de type Tomcat (dans un nouveau répertoire de nom ex5)
Créer (directement sous la racine du projet)  la page JSP login.jsp qui récupère 2 paramètres login et password et qui répond en affichant la chaîne :

BONJOUR <login>

Pour tester la page, cliquer sur l'URL suivante :
http://localhost:8080/ex5/login.jsp?login=Jules&password=Verne

Noter qu'il est inutile d'arrêter le serveur Web pour que les modifications de la page JSP soient prises en compte.

Etape 2 :

Rajouter un test dans login.jsp vérifiant si le paramètre login a été passé en paramètre. Si ce n'est pas le cas, afficher le formulaire d'identification de l'exercice précédent (l'action de ce formulaire référençant login.jsp).
Tester.

Page JSP définissant une méthode Java

On se propose de mémoriser sur le serveur l'ensemble des login/password utilisés dans une Hashtable.

Copier la page login.jsp précédente dans loginTrace.jsp. Y rajouter la définition de la méthode checkPassword(String login, String password) : cette méthode range dans la Hashtable la paire login/password si la clé login n'y existe pas encore et retourne true. Dans les autres cas, elle retourne false sauf si le password saisi correspond au premier password saisi lors du premier login.

Appeler la méthode checkPassword dans la page jsp ; si elle retourne false, afficher de nouveau le formulaire de login précédé d'un message d'erreur "Password invalide".
Tester.


Page JSP utilisant un JavaBean

On va réutiliser le JavaBean LoginController de l'exercice 1 pour vérifier les couples de login/password saisis; l'incorporer dans le projet.

Ajouter dans le constructeur de la classe LoginController des appels à addLogin()  pour chaque couple login/password autorisé.

Copier la page loginTrace.jsp précédente dans loginTrace2.jsp. Y remplacer :

Tester.
(Attention, le comportement est un peu différent de celui de l'exercice précédent : seuls les logins déjà présents dans le LoginController seront  acceptés.)

Coopération entre servlet et JSP 

Au contraire d'une page JSP, une servlet n'est pas adaptée pour générer du code HTML.

On va donc faire les traitements "métiers" dans la servlet et laisser le minimum de code Java dans la page jsp (modèle MVC). Plus précisément :

Définir les pages betterLogin.jsp et welcome.jsp ainsi que la servlet LoginServlet conformément à ce modèle et au diagramme de séquence ci-dessous :

Login sequence diagram

Plus précisément, définir :

Tester.


Tests web - Utilisation de HttpUnit


Il est possible de tester les pages web en combinant JUnit avec le framework HttpUnit.. HttpUnit émule le comportement d'un navigateur et supporte notamment la soumission de formulaires. Il permet de tester le contenu d'une page web en accédant à ses différents éléments (titre, formulaires, tables, ...).

Reprendre le projet Eclipse précédent, y créer le répertoire de source "test/src" (File->New->Source Folder) puis insérer dans ce répertoire  la classe de test  WebTest.java.

Ajouter dans le CLASSPATH (Project->Properties->Java BuildPath->Libraries->Add Externals Jars) chacune des librairies contenues dans l'archive xunit.zip.

Etudier la classe WebTest (notamment les méthodes testBadLogin() et testValidLogin()),  l'exécuter en tant que test unitaire JUnit (Run As->Junit Test)  jusqu'à l'obtention de la "Barre verte".


Servlet et page JSP avec controleur de login JDBC

On va utiliser le loginControler JDBC à la place du loginController simple utilisé dans l'exercice 2.

Créer un nouveau projet de type Tomcat appelé ex9.

Recopier dans ce projet ex9 le fichier web.xml et l'ensemble des pages jsp et des sources java (dont la classe de test  WebTest) de l'exercice précédent.

Supprimer la classe LoginController,  la remplacer par la classe DBLoginController (exercice 2)

Définir la méthode init() dans la servlet LoginServlet; cette méthode va se charger d'instancier un LoginController en appelant le constructeur de DBLoginController à 4 arguments (ces arguments devront être obtenus au travers de paramètres déclarés dans le fichier web.xml).

Réexécuter la classe WebTest en tant que test unitaire JUnit (Run As->Junit Test)  jusqu'à l'obtention de la "Barre verte".


Liens utiles

Javadoc

Javadoc Standard Edition API Hashtable.
Java doc servlet API
JavaDoc JUnit 3.8 APIAssert
JavaDoc HttpUnit

Outils

Guides

Guide d'utilisation d'Eclipse
Tutorial sur le développement J2EE avec Eclipse et Tomcat