Configuration EJB3 avancée avec Seam
Au chapitre précédent, vous avez bâti votre application sur EJB3 et JSF et mis en oeuvre les innovations apportées par la nouvelle spécification. Dans cet ultime chapitre, vous reprendrez l’application exemple webstock en partie générée à l’aide de l’atelier EclipseUML d’Omondo. Vous utiliserez pour ce faire le framework Seam, présenté au chapitre 8, mais cette fois appliqué au développement EJB3. Vous découvrirez les aspects avancés de ce framework, en particulier pour la gestion des contextes, un des points forts de Seam. Comme expliqué au chapitre 8, JBoss Seam simplifie les échanges entre les différentes couches des applications JEE, en particulier entre la partie présentation, représentée par la technologie JSF, et la partie EJB3, comme illustré.
La possibilité de gérer plusieurs conversations simultanées est une fonctionnalité remarquable de Seam permise par le support du contexte conversationnel, qui permet de simuler virtuellement des sessions multiples sans avoir à les créer physiquement. Pour Seam, tous les composants d’une application en cours d’exécution sont des objets avec état (stateful). Ces objets sont souvent des EJB, comme dans notre exemple.Chaque instance d’un composant est associée à un contexte défini et possède un nom permettant de la référencer. Par définition, un contexte est une vue sur les composants d’une application à base de conteneur en cours d’exécution, comme l’illustre.
Les contextes Seam sont créés et détruits par le conteneur JBoss. Ils ne sont plus contrôlés avec une API Java spécifique, mais gérés d’une manière explicite, déclarée à l’aide des annotation JDK5.Chaque type de composant Seam possède un contexte par défaut, que le développeur peut modifier à l’aide de l’annotation @Scope. Le tableau 13.1 récapitule les contextes par défaut de Seam.• Event. C’est le contexte le plus simple et le plus utilisé dans les applications Web. Les objets enregistrés dans le cadre de ce contexte sont détruits à la fin de la requête. Les JavaBeans sont stockés par défaut dans ce contexte événementiel. • Page. Les composants de ce contexte sont attachés à une page spécifique. Vous avez accès à ces composants pour tout événement émis à partir de cette page. • Conversation. Ce contexte est détaillé ultérieurement dans ce chapitre. • Session. Gère l’état associé à la session utilisateur afin de garder trace de certaines informations relatives à cet utilisateur et des données susceptibles d’être partagées entre différentes conversations. • Business. C’est le contexte associé aux processus métier de longue durée. L’état de ce contexte est géré et persisté par le moteur de workflow JBoss jBPM (JBoss Business Process Management). Rappelons qu’un processus métier est un ensemble d’actions réparties sur différents types d’utilisateurs. L’état de ce contexte est partagé entre ces différents utilisateurs selon une réglementation définie.• Application. Utilisé pour garder les informations statiques relatives à une application donnée, comme les métamodèles ou les objets de référence. Par exemple, Seam persiste ses configurations et métamodèles dans le contexte de l’application.
Gestion des états de composants Seam
Les instances de composants Seam sont associées à une variable de contexte. Le nom du composant est attribué via l’annotation @Name et le contexte auquel il sera associé à l’aide de l’annotation @Scope.La conversation est un concept bien connu du développement J2EE. JBoss Seam est toutefois le premier framework à l’implémenter complètement et à l’enrichir avec le scope de conversation. Une conversation peut être vue comme un genre de pas-à-pas. C’est une action qui s’étend sur plusieurs petites actions et qui permet a l’utilisateur de se promener aisément d’avant en arrière, sans se soucier de la perte de ses données, mais sans pour autant les persister dans la base.Toutes les informations utilisées pendant une conversation sont stockées dans le scope de conversation. La notion de conversation est introduite par Seam à travers le support de ses nouveaux contextes. Pour Seam, une conversation est une requête utilisateur qui s’étend sur plusieurs pages avant d’être close. Le panier d’achats en ligne en est un exemple. Chaque cycle requête/ réponse est aussi une conversation élémentaire entre la page qui expose le formulaire de la requête et la page de réponse. En d’autres termes, une conversation est une unité de travail élémentaire : ce qu’on fait à un moment donné sur une page donnée. Par défaut, les objets Seam avec état (stateful) ont une conversation de type Scope. Le contexte conversationnel par défaut se résume ainsi : le composant est instancié quand la première page est émise puis est détruit quand la page de réponse est définitivement affichée. Les composants utilisent des conversations temporaires, qui ont lieu tout au long de la requête avant d’être détruites à l’affichage de la page de réponse.