Comment choisir le bon haricot portée?

j'ai remarqué qu'il y a différents scopes de haricots comme:

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped

Quel est le but de chacun? Comment choisir une bonne portée pour mon haricot?

354
demandé sur BalusC 2011-08-11 23:44:33

2 réponses

Introduction

il représente la portée (la durée de vie) de la fève. C'est plus facile à comprendre si vous êtes familier avec le fonctionnement "sous les couvertures" d'une application web servlet de base: Comment fonctionnent les servlets? L'instanciation, les sessions, les variables partagées et le multithreading .


@Request/View/Flow/Session/ApplicationScoped

Un @RequestScoped de la fève de vies aussi longtemps qu'un cycle de requête-réponse HTTP unique (notez qu'une requête Ajax compte aussi comme une requête HTTP unique). Un @ViewScoped bean vit aussi longtemps que vous interagissez avec la même vue JSF par postbacks qui appellent des méthodes d'action retournant null / void sans aucune navigation/redirection. Une fève @FlowScoped vit aussi longtemps que vous naviguez à travers la collection spécifiée de vues enregistrées dans le fichier de configuration de flux. Un @SessionScoped bean vit aussi longtemps que la session HTTP établie. Un @ApplicationScoped bean vit aussi longtemps que l'application web fonctionne. Notez que le CDI @Model est essentiellement un stéréotype pour @Named @RequestScoped , donc les mêmes règles s'appliquent.

la portée à choisir dépend uniquement des données (l'état) que le haricot détient et représente. Utilisez @RequestScoped pour les formulaires/présentations simples et non ajax. Utilisez @ViewScoped pour les vues dynamiques riches en ajax (validation basée sur AJAX, Rendu, dialogues, etc.). Utilisez @FlowScoped pour le schéma"wizard" ("questionnaire") de la collecte des données d'entrée réparties sur plusieurs pages. Utilisez @SessionScoped pour les données spécifiques au client, telles que les préférences de l'utilisateur (langue, etc.). Utilisez @ApplicationScoped pour des données/constantes à l'échelle de l'application, comme des listes déroulantes qui sont les mêmes pour tout le monde, ou des haricots gérés sans aucune variable d'instance et ayant seulement des méthodes.

abuser d'un @ApplicationScoped bean for session/view / request scoped données ferait qu'il soit partagé entre tous les utilisateurs, de sorte que n'importe qui d'autre peut voir les données de l'autre qui est tout simplement faux. Abuser d'un @SessionScoped bean for view / request scoped données ferait à être partagé entre tous les onglets / fenêtres dans une seule session de navigateur, de sorte que l'utilisateur final peut éprouver des inconsitenties lors de l'interaction avec chaque vue après commutation entre les onglets qui est mauvais pour l'utilisateur expérience. Abuser d'un @RequestScoped haricot pour les données de vue scoped ferait des données de vue scoped être réinitialisé par défaut sur chaque simple (ajax) postback, causant éventuellement des formes non-travail ( voir aussi les points 4 et 5 ici ). Abuser d'un @ViewScoped haricot pour la demande, la session ou l'application scoped données, et abuser d'un @SessionScoped haricot pour l'application scoped données n'affecte pas le client, mais il occupe inutilement la mémoire du serveur et est tout simplement inefficace.

notez que la portée ne devrait pas être choisi en fonction des implications de performance, à moins que vous vraiment avoir une faible empreinte mémoire et de vouloir aller complètement apatride; vous auriez besoin d'utiliser exclusivement @RequestScoped haricots et violon avec les paramètres de demande pour maintenir l'état du client. Notez également que lorsque vous avez une seule page JSF avec des données de scoped différent, alors il est parfaitement valide de les mettre dans des fèves de support séparées dans un scope correspondant aux données portée. Les haricots peuvent simplement se rejoindre via @ManagedProperty dans le cas des haricots gérés par JSF ou @Inject dans le cas des haricots gérés par le CDI.

voir aussi:


@CustomScoped/NoneScoped/Dependent

ce n'est pas mentionné dans votre question, mais (legacy) JSF supporte aussi @CustomScoped et @NoneScoped , qui sont rarement utilisés dans le monde réel. Le @CustomScoped doit faire référence à une mise en œuvre personnalisée Map<K, Bean> dans une portée plus large qui a dépassé Map#put() et / ou Map#get() afin d'avoir un contrôle plus fin sur la création de haricots et/ou de détruire.

le JSF @NoneScoped et le CDI @Dependent vit essentiellement aussi longtemps qu'une seule EL-évaluation sur le haricot. Imaginez un formulaire de connexion avec deux champs d'entrée renvoyant à une propriété bean et un bouton de commande renvoyant à une action bean, donc avec au total trois expressions EL, puis effectivement trois instances seront créées. L'un avec le nom d'utilisateur, un ensemble avec le mot de passe activé et sur lequel l'action est invoquée. Vous voulez normalement utiliser cette portée seulement sur les haricots qui devraient vivre aussi longtemps que le haricot où il est injecté. Donc si un @NoneScoped ou @Dependent est injecté dans un @SessionScoped , alors il vivra aussi longtemps que le @SessionScoped haricot.

voir aussi:


Flash scope

comme dernier, JSF supporte également le flash scope. Il est soutenu par un petit cookie vivant qui est associé à une entrée de données dans la session scope. Avant la redirection, un cookie sera placé sur le HTTP réponse avec une valeur qui est associé uniquement à la saisie des données dans l'étendue de session. Après la redirection, la présence du cookie Flash scope sera vérifiée et l'entrée de données associée au cookie sera retirée de la session scope et placée dans la requête scope de la requête redirigée. Enfin, le cookie sera supprimé de la réponse HTTP. De cette façon, la requête redirigée a accès aux données de la requête scoped qui ont été préparées dans la requête initiale.

ce n'est en fait pas disponible comme une portée gérée de haricot, c.-à-d. il n'y a pas une telle chose comme @FlashScoped . Le flash scope n'est disponible que sous forme de carte via ExternalContext#getFlash() dans les haricots managés et #{flash} dans le EL.

voir aussi:

451
répondu BalusC 2017-06-22 13:08:07

de JSF 2.x il y a 4 portées:

  • @SessionScoped
  • @RequestScoped
  • @ApplicationScoped
  • @ViewScoped

portée de la Session: la portée de la session persiste à partir du moment où une session est établie jusqu'à la fin de la session. Une session se termine si l'application web appelle la méthode invalidate sur le Objet HttpSession,ou si cela se produit.

RequestScope: la portée de la requête est de courte durée. Il commence lorsqu'une requête HTTP est soumise et se termine lorsque la réponse est renvoyée. pour le client. Si vous placez un bean managé dans le champ d'application de la demande, un nouveau l'instance est créée avec chaque requête. Il est intéressant d'examiner la demande scope si vous êtes préoccupé par le coût de stockage de scope session.

ApplicationScope: la portée de l'application persiste pendant toute la durée de l'application web. Cette portée est partagée par tous les demandes et à toutes les séances. Vous placez des haricots managés dans le champ d'application si un seul haricot doit être partagé entre tous les instances d'une application web. Le haricot est construit quand il est d'abord demandée par n'importe quel utilisateur de l'application, et il reste en vie jusqu'à ce que l'application web soit retirée du serveur d'application.

ViewScope: la portée de la vue a été ajoutée dans JSF 2.0. Un point de vue de portée persiste alors que la même page JSF est redessinée. (Le JSF spécification utilise le terme view pour une page JSF. Dès que l'utilisateur navigue vers une autre page, le haricot sort de la portée.

choisissez la portée que vous avez en fonction de votre exigence.

Source: Core Java Server Faces 3rd Edition by David Geary & Cay Horstmann [Page no. 51-54] enter image description here

117
répondu Kishor Prakash 2013-08-06 10:56:52