Bonjour à tous,
Je développe actuellement une application J2EE hébergée sur JBoss AS 5.0, utilisant principalement Hibernate + EJB3 (pour le métier), JSF 1.2 + Richfaces 3.3 + Facelets pour la partie Web de l'application.
Je ne suis pas à ce jour un grand connaisseur de tous ces frameworks, mais je me suis beaucoup documenté à ce sujet.
J'ai bien intégré le fonctionnement des EJB (Entity et Session) avec les JSF (via des Managed Bean).
Là où est-ce que je bloque, c'est pour ma partie navigation entre les pages.
Afin d'illustrer ma question, je vais définir un exemple fictif.
Supposons que mon application gère plusieurs objets métier :
- des projets
- des tâches
- des tickets
- des membres
De façon simpliste, on admettra ces quelques règles de gestion :
- (1) Un membre peut créer, modifier un projet.
- (2) Plusieurs membres peuvent gérer un même projet.
- (3) Des tâches peuvent être créées pour un projet en particulier.
- (4) Des tickets peuvent être créés pour un projet en particulier (anomalies, demande d'évolution ou d'assistance par exemple).
Une fois les EJB (Entity et Session) implémentés, il est très simple d'implémenter les différentes pages suivantes :
Les formulaires pour l'ajout/modification :
- editProject.xhtml
- editTask.xhtml
- editIssue.xhtml
- editMember.xhtml
Formulaire d'identification pour l'espace membre :
Pages d'accueil :
- homeMember.xhtml : page d'accueil de pour un membre identifié, quand il s'identifie manuellement
- homeProject.xhtml : page d'accueil d'un projet, qui propose des liens pour afficher la liste des tâches, la liste des tickets, pour créer des tâches etc...
Puis les pages de listing :
- listProject.xhtml
- listTasks.xhtml
- listIssues.xhtml
- listMembers.xhtml
Maintenant, prenons un ou deux workflows de l'application.
I - Workflow 1
Je ne suis pas "membre" de l'application et je veux enregistrer un projet dans l'application pour faciliter sa gestion.
Afin de créer le projet, nous avons besoin de plusieurs informations :
- Le compte du membre qui sera propriétaire du projet
- Des informations concernant le projet à créer
Afin de mieux comprendre l'intérêt de ma question, imaginez que la page d'accueil de l'application soit en fait une liste de liens avec toutes les procédures possibles. Cette liste sera disponible à tout le monde (membre identifié ou non).
J'arrive donc avec mon navigateur préféré sur la page d'accueil, je ne suis pas identifié. Je clique sur le lien "Créer un nouveau projet".
La procédure "Créer Projet" se met donc en route. L'application connait la liste des informations nécessaires pour pouvoir effectuer la création du projet.
(1) la page login.xhtml m'est affichée :
- Si je possède un compte, je m'identifie, puis je passe à l'étape (2)
- Si je ne possède pas de compte, je clique sur le lien "S'inscrire", puis je passe à l'étape (1-a)
(1-a) Le formulaire editMember.xhtml m'est affiché, je le remplis, puis je retourne à l'étape (1)
(2) Le formulaire editProjet.xhtml m'est affiché je le remplis, mon nouveau projet est créé, je passe à l'étape (3)
(3) La page d'accueil du projet (homeProject.xhtml) est affichée
II - Workflow 2
Dans l'exemple I, je me suis créé un compte et j'ai maintenant un projet. Je viens d'arriver sur la page d'accueil de l'application et je voudrais créer une tâche pour mon projet.
C'est donc une nouvelle procédure qui s'appelle "Créer tâche", accessible via un lien présent sur la page d'accueil de l'application. Cette procédure aura donc besoin :
- d'un membre (pour savoir qui a créé la tâche)
- d'un projet (pour savoir à quel projet la tâche est liée)
- des informations concernant la nouvelle tâche
Je ne suis pas identifié sur l'application.
(0) Je clique sur le lien "Créer une tâche" depuis la page d'accueil de l'application.
La partie concernant l'information du membre est identique à l'exemple I. A partir de l'étape suivante, on admettra donc que l'on est identifié.
(1) La liste de mes projets est affichée (listProjects.xhtml) :
- Si mon projet existe déjà, je le sélectionne, et je passe directement à l'étape (2)
- Si mon projet n'existe pas encore, clique sur le lien "Nouveau projet", puis je passe à l'étape (1-a)
(1-a) la page editProjet.xhtml est affichée, je remplis le formulaire puis je valide
(2) J'arrive directement sur la page editTask.xhtml, qui me permettra d'ajouter une tâche pour le projet précédemment sélectionné. Je remplis le formulaire, puis valide, ma tâche est créée, fin de la procédure.
Ces deux exemples m'amènent cette question : est-il possible, et par quel moyen, de définir de tels workflows, en utilisant à chaque fois des pages de formulaires communes à plusieurs workflows ? Dans l'application, on pourrait accèder à chaque page unitairement en cliquant sur les liens proposés à chaque étape. Mais est-il possible de mettre en place des procédures qui enchaîneront les pages dans un ordre bien précis ?
J'ai regardé le système de navigation de base proposé par JSF 1.2, je n'ai pas trouvé de solution dans celui-ci. J'ai ensuite regardé ce que proposait JSF 2, et apparemment, les choses ont un peu changé, j'ai cru comprendre que les méthodes d'action des Managed Beans pouvaient retourner directement un view-id. La solution serait donc de créer un managed bean par procédure (workflow) et que les pages soient appelées dans l'ordre voulu grâce au retour des méthodes d'actions :
Avec pour exemple ceci : un managed bean MaProcédure1 qui possède les différentes action-methodes suivantes : doAction1(), doAction2(), doAction3() et la méthode 1 retournerait le view-id de la page pour l'action2, etc.
Le truc qui gênent dans cette solution, c'est que :
- JSF 2 avec JBoss est implémenté à partir de la version 6.0.0, et que la version actuelle n'est qu'une M2 (à en déduire BETA)
- un formulaire pouvant être lié à plusieurs procédures, que faut-il mettre dans les pages xhtml pour définir l'action a exécuter (quel managed bean et quelle méthode), puisque suivant la procédure, ça change forcément.
Ca fait un très long TOPIC, merci d'avoir lu jusqu'ici, mais je voulais être le plus clair possible pour poser ma question.