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?
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:
- différence entre la portée de la vue et de la demande dans les haricots gérés
- avantages de l'utilisation de JSF Faces Flow au lieu du système de navigation normal
- la Communication dans JSF2-Managed bean scopes
@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:
- date D'expiration de l'instance de gestion spécifique après l'intervalle de temps
- ce n'est portée bean et quand l'utiliser?
- Quel est le champ D'application par défaut de la gestion des fèves dans une application JSF 2?
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:
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]