Avant tout développement d'une application WEB, il est important de réfléchir à son architecture. A mon sens une architecture bien conçue est d'une part une architecture robuste qui respecte les patterns standards et d'autre part une architecure qui reste simple en termes de développement. Ayant eu une petite expérience sur les EJB 2.0, cette architecture est certes robuste et suit les patterns standards, mais sa mise en place reste pénible.
L'architecture ne peut pas être conçue sans connaître les fonctionnalités de l'application à réaliser. Par exemple, il est important de se poser les questions sur les fonctionnalités, comme la pagination, le tri, la complexité des critères de recherches dans les formulaires de recherches... Voir la section fonctionnalites pour connaître les fonctionnalités utilisés dans gestCV (qui se retrouvent dans la plupart des applications WEB).
Il est important, lors de la mise en place d'une architecture de ne pas "réinventer la roue" mais de s'appuyer sur des frameworks (cadre de développement) robustes, simples et qui ont fait leur preuve.
Dans le monde J2EE, il existe de nombreux frameworks disponibles. L'architecture proposée dans le projet GestCV tentera de respecter au mieux les patterns existant, tout en restant simple en terme de développement. Plus l'architecture restera simple, moins il y aura de développement à effectuer et par conséquent moins de bugs.
GestCV s'appuie sur plusieurs frameworks qui aujourd'hui ont fait leur preuve, et sont toujours en pleine effervescence :
L'objectif de ce site a pour but de décrire l'utilisation de ces 3 frameworks combinés. Il tentera aussi de décrire les mécanismes importants utilisés dans l'application. Ces mécanismes ont pour but de simplifier le développement. Tout au long de ce site, je tenterai d'expliquer la démarche de ma réflexion, les choix de conception, et les questions que je me suis posées lors de la réalisation de GestCV.
Voici un schéma global de l'architecture de GestCV :
GestCV est basée sur Struts, framework MVC (Modéle Vue Contrôle) :
A la fin du traitement d'une Action Struts, après avoir peuplé le formulaire Struts avec les DTO retournés par les Services, et/ou enregistré dans la request les listes de DTO à afficher, le composant vue est appelé (redirection vers une JSP).
Le pattern Service/DAO sera implémenté par l'utilisation de deux frameworks :
Dans une application WEB, la Vue, autrement dit la page HTML, doit afficher les informations provenant de la base de données et/ou doit mettre à jour les données de la base par l'intermédiare de fomulaire HTML. Les données postées par le formulaire sont des chaînes de caractères String et les données de la base sont des types plus complexes (String, Integer, Date,...).
Une conversion de type de données est nécessaire à moment ou un autre, pour faire communiquer les données de la vue avec la base de données.
La question qui vient alors l'esprit est quelle est la meilleure architecture qui permet de gérer la communication entre la vue et la base de données ? La réponse selon moi est aucune. Il existe de nombreux articles traitant de ce sujet, mais aucun me paraît l'unique solution à mettre en place.
Selon la couche Action, Service et DAO, GestCV manipule trois types d'objets : les Bean, les Form et les DTO.
Les objets Bean sont les objets persistants de l'application GestCV (communicant avec la base de données). Ces objets permettent de :
GestCV utilisant Hibernate comme couche de persistance, ceux-ci sont surveillés par la session Hibernate. Autrement dit la modification (appel d'un setter) d'un de ces objets engendrera une modification dans la base de données. L'appel de certaines méthodes (initialisés en mode lazy) d'un objet Bean, engendrera la récupération des données de la base.
Dans une application Struts, le formulaire est représenté par une classe qui doit hériter de la classe de base ActionForm (ou autres classes dérivées de ActionForm). La classe représentant un formulaire doit implémenter tous les getter/setter des champs constituant le formulaire.
Les formulaires de GestCV seront constitués de getter/setter de type simple java.lang.String uniquement. Voir la section Formulaire Struts pour connaître la raison de ce choix et avoir plus de détail sur l'implémentation des formulaires de gestCV.
Les objets DTO (Data Transfert Object) ont pour but d'assurer la communication entre les données de la base (Bean) et les formulaires (Form). Cette communication s'effectue dans les deux sens :
L'architecture Form/DTO/Bean présentée, celle-ci peut être maintenant critiquée. Voici les questions que je me suis posé face à cette architecture :
Le découpage DTO et bean, permet aussi de retourner des DTO complexes qui peuvent être construites à partir de plusieurs Bean.
La fusion DTO/Form engendre de plus un très fort couplage a Struts. Ce choix de conception ne permettra pas par exemple d'utiliser les services dans une autre application qui ne serait pas implémentée en Struts.
Le tri et la pagination sur des listes de données sont des fonctionnalités qui se retrouvent souvent dans une application WEB. Il existe deux grands principes d'implémentation de ses fonctionnalités :
Suite à mon expérience, je préfère le tri/pagination aux niveau bases. Je trouve que beaucoup de patterns sous-estiment les capacités de la base de données qui n'est pas seulement un containeur de données.
GestCV en termes de volumétrie ne parait pas très conséquent, cependant, l'application implémentera la pagination/tri au niveau base de données. En effet DisplayTag 1.1 permet aujourd'hui d'utiliser sa propre gestion de pagination en implémentant l'interface PaginatedList. GestCV implémentera :
L'accueil de GestCV affiche la liste des CV disponibles. Plusieurs critères de recherche d'un CV dont les compétences le nom, le prénom du collaborateur sont disponibles. Pour aider l'utilisateur dans sa recherche, un assistant d'aide (autocomplétion) s'affiche en temps réel avec les données de la base correspondant aux caractères saisis. Cette fonctionalité utilise le principe d'AJAX.
Ce composant n'a pas été developé, il s'appuie sur la librairie AjaxTags, qui permet de gérer des composant AJAX. Vous trouverez plus d'information dans la section AJAX.
Toutes les classes utilisées dans GestCV, que ce soit les classes Services, DAO, Criteria, DTO, Bean, ValidatorActionForm, DispatchAction,... héritent toutes d'une classe de base (BaseService, BaseCriteria, BaseDTO,...). Je conseille d'en faire autant, lorsque vous mettez en place un nouveau type de données. Même si votre classe de base ne contient aucune méthode, aucune propriéte lorsque vous mettez en place votre type de données, une application WEB évolue dans le temps lors de l'ajout de nouvelles fonctionnalités. Il se peut que votre type de données évolue aussi, et qu'il soit aussi susceptible de gérer une méthode, une propriété en commun.