Service de gestion d’utilisateurs Utilisation des frameworks CookXML et Struts 1.x Présentation • But de l’application : gestion de contacts (recherche et ajout) • Utilisation du pattern MVC : – Modèle -> CookXML – Vue, Controleur -> Struts 1.x • Limitation de CookXML : impossibilité de gérer l’ajout Persistance : CookXML (1) • But : chargement d’instances à partir de fichiers XML (une instance un fichier) • Bibliothèque dynamique de tags : creator, setter, adder, converter • Chargement d’une instance : CookXML.decodeXML(String filename) Persistance : CookXML (2) • Il est assez difficile de trouver un historique de versions sur le net. Toutefois, on peut trouver ces deux informations importantes : – Tout d'abord, le projet a été commencé en 2007 – Ensuite, contrairement à ce que j'affirmais dans la présentation orale, le Framework est toujours suivi, la dernière version étant sortie en février 2009 Persistance : CookXML (3) • La classe qui charge l'objet Java est un CookXML : new CookXml (builder, tagLibrary, (Object) null); • Le premier paramètre est un DocumentBuilder pour lire le XML. Le second est la librairie de tags qu'on utilise pour charger les objets. Le troisième définit la façon de charger le fichier XML (pas plus d'informations sur comment il marche) • La librairie de tags contient tout les Creator, Setter, Adder et Converter qui permettent de passer du fichier XML à des objets Java. Persistance : CookXML (4) • Tag Creator : à chaque noeud du fichier XML correspond une instance d'un objet Java. Le Creator permet de définir les règles qui permettent de créer une nouvelle instance. • Ajout d'un Creator à la librairies de tags : tagLibrary.setCreator ("user", DefaultCreator.getCreator(Personne.class)) • Fonctionnement : le premier paramètre définit le noeud qu'on traite, le second est le Creator en lui-même. Dans le cas d'un DefaultCreator, il faut que la classe correspondante dispose d'un constructeur vide, sinon ça ne marche pas. Persistance : CookXML (5) • Tag Setter : chaque attribut d'un noeud XML permet de définir la valeur d'un attribut dans l'objet qui lui correspond. Un Setter permet de définir les règles de correspondance entre les deux, XML et Java. • Ajout d'un Setter à la librairie de tags : tagLibrary.setSetter("user", "log", DefaultSetter.getInstance()) Fonctionnement : le premier paramètre correspond au noeud, le second au nom de son attribut qu'on veut traiter, le troisième est le Setter à utiliser. – A noter que le DefaultSetter implique que l'objet Java une méthode « set » appropriée, qui a le même nom que l'attribut XML • Persistance : CookXML (6) • Tag Adder : quand un noeud « N » a des noeuds fils, ces derniers correspondent à des instances d'objets stockés dans un conteneur quelconque dans l'objet qui correspond à « N ». Pour chaque type de sous-noeud correspond un conteneur différent. • Un Adder permet de remplir ces conteneurs : tagLibrary.setAdder("utilisateur", new ContactAdder()); • Fonctionnement : le premier paramètre désigne le noeud père. Il lance chaque Adder qu'on lui lie. Pour s'assurer de la bonne combinaison père/fils, une vérification dans le code est nécessaire. Le DefaultAdder est moins clair que l'équivalent pour les Setter et les Creator, il est préférable de coder ses propres Adder. Persistance : CookXML (7) • Tag Converter : ce genre de tag permet de convertir les données du XML, uniquement des String, en des types plus complexes • Ajout d'un Converter à la librairie de tags : tagLibrary.setConverter(boolean.class, BooleanConverter()) • Fonctionnement : à chaque fois qu'un Setter est appelé, si l'attribut correspondant dans l'objet Java est du type défini dans le premier paramètre de la fonction setConverter, le Converter associé (le second paramètre) sera appelé Persistance : CookXML (8) • Exemple de fichier XML : <user nom="Johan" prenom="Yoyo"> <contact pseudo="Sannom" password="ro" /> <contact pseudo="Shry" password="ne" /> </user> Ce fichier permet d'obtenir en sortie une instance de la classe Personne (qui correspond au nœud « user ») dont l'attribut « nom » sera égal à « Johan » et l'attribut « prenom » égal à « Yoyo ». Il aura aussi un conteneur d'objets de la classe « Contact » qui correspond au nœud « contact » Persistance : CookXML (9) • Comparaison avec Hibernate : • Hibernate et CookXML ne traitent pas le même type de données : Hibernate permet d'utiliser des bases de données SQL, tandis que CookXML utilise des fichiers XML. • Hibernate est vraiment beaucoup plus puissant et paramétrable que CookXML, et lui permet de passer du langage objet à la BDD, CookXml ne fait pas encore ce sens-là. • CookXML est plus pratique pour des petits projets. De plus, sa façon de procéder, un arbre XML par objet, a permis la mise en place de sous-projets qui permettent de définir une interface graphique en XML puis de la charger en Java. Cela permet d'avoir des interfaces plus faciles à modifier et à paramétrer. Persistance : CookXML (10) • Avantages : – Facilité de mise en place : il suffit de placer une archive JAR dans le buildpath (ici, dans le dossier WEB-INF/lib) – Très simple d'accès une fois les bases de chaque type de tag comprises • Inconvénients : – Il est difficile de traquer les exceptions – API non disponibles depuis le site officiel – Framework non terminé (pas de sauvegarde) Gestion: Struts 1.x (1) – But : Gérer et Afficher les informations données par le modèle – Plusieurs bibliothèques et classes utilisables – Classes Action et ActionForm utilisées Gestion: Struts 1.x (2) • Classe Action Les classes qui extends la classe Action sont les classes qui ‘font le travail’, c’est-à-dire qui sont exécuté lors de l’appel d’un formulaire. Dans ces classes, il existe une methode, la methode execute, qui retourne une action forward, qui sera appeler par le formulaire html. Les parametre de la methode execute sont : ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response. La response et la requette font le même travail que sutr des servlets normales, l’actionform permet de savoir quel formaulaire on veut executer, cf la calsse actionForm Gestion: Struts 1.x (3) • Classe ActionForm Les classes qui héritent de la classe actionForm sont les classes qui contiennent les formulaires de validation de la requête, permettant de mener vers une page d’erreur dans le cas de mauvaise donnée dans le formulaire. La méthode que sera exécutée sera alors la méthode validate, qui retourne une ActionError, et qui prend comme paramètre : ActionMapping et HttpServletRequest (la request servant a obtenir les informations données par le formulaire de la page html). Gestion: Struts 1.x (4) • Librairies Il y a 4 librairies qui peuvent être utilisé dans les pages JSP qui sont des librairies spécifique a Struts. Ces librairies sont : • La librairie HTML, qui remplace les balise html. Elles peuvent être utilisées pour modifier le formulaire, les inputs, etc. . • La librairie logic, qui permet de faire des tests logique, comme, par exemple, la présence de tel attribut dans la requête avec la balise logic:present. • La librairie Bean, qui va faire l’affichage des ressources dans le ressourceProperties avec la balise bean:message par exemple. • La librairie nested. Gestion: Struts 1.x (5) • Fichiers de configuration : struts-config.xml Le fichier struts-config.xml est un des fichiers XML qui permet de configurer Struts, mais c’est le fichier fondamental. En effet, c’est ce fichier qui permet de configurer aussi bien le mapping de l’application, c’est-à-dire dans quelle action le formulaire HTML doit aller. Il faut être sous la balise <action-mapping>. Par exemple, on a le code suivant : <action path="/LoginAction" type="gestionContact.LoginAction" name="loginForm" scope="request" validate="true" input="/Login.jsp"> <forward name="user" path="/pages/consultetContact.jsp" /> <forward name="admin" path="/pages/consultContact.jsp"/> <forward name="error" path="/Login.jsp"/> </action> Ce code va rediriger le formulaire LoginAction vers la classe gestionContact.LoginAction, en provenant de la jsp Login.jsp. En cas d’ActionForward avec dans son constructeur « user », on va aller dans la page /pages/consultetContact.jsp. Gestion: Struts 1.x (6) On a aussi les forms beans dans ce fichier, qui permet de rediriger vers la bonne ActionForm. Sous la balise <form-beans>, on a par exemple le code suivant : <form-bean name="loginForm" type="gestionContact.LoginForm" /> Ce code définit quel formulaire sera appelé, c’est-à-dire gestionContact.LoginForm.java quand on appellera le form loginForm. Dans le slide précédent, c’est ce form qui est appelé dans son mapping. • Enfin, il existe un projet struts que l’on peut installer directement, téléchargeable depuis http://struts.apache.org/download.cgi#struts1310. Il suffit ensuite de sélectionner un struts-blank.war dans apps afin de pouvoir installer struts. Gestion: Struts 1.x (7) • Avantages : – Grande puissance, documentation claire – Code facilement réutilisable • Inconvénients : – Usine à gaz – Débogage extrêmement difficile Moralité • Struts : utile pour de gros projets, mais démesuré pour de petits projets • CookXML : framework puissant et configurable, mais encore en développement