Pourquoi ne JSF nécessité de sauvegarder l'état des composants de l'INTERFACE utilisateur sur le serveur ?
Parce que HTTP est sans état et JSF est dynamique. La JSF composant de l'arbre est soumis à la dynamique (programmatique) des changements. JSF simplement besoin de connaitre l'état où il était lorsque le formulaire a été affiché à l'utilisateur, de sorte qu'il peut traiter avec succès l'ensemble de JSF le cycle de vie sur la base des informations fournies par le composant JSF arbre lorsque le formulaire a été envoyé sur le serveur. Le composant de l'arbre fournit des informations sur le paramètre de la requête noms, les convertisseurs/validateurs, le managed bean propriétés et des méthodes d'action.
Jusqu'à quel point dans le temps ne JSF enregistrer l'état des composants de l'INTERFACE utilisateur sur le serveur et quand exactement est le composant de l'INTERFACE utilisateur de l'état de l'information supprimés de la mémoire du serveur?
Ces deux questions semblent faire bouillir la même. De toute façon, c'est la mise en œuvre spécifique et dépend aussi de savoir si l'état est enregistré sur le serveur ou le client. Un peu décent de mise en œuvre de l'enlever quand il a été expiré ou lorsque la file d'attente est pleine. Mojarra, par exemple, a une limite par défaut de 15 logique de vues lors de l'état de l'enregistrement est mis à la session. C'est configureable avec le contexte suivant param en web.xml
:
<context-param>
<param-name>com.sun.faces.numberOfLogicalViews</param-name>
<param-value>15</param-value>
</context-param>
Voir aussi Mojarra FAQ pour les autres Mojarra spécifiques params et cette réponse com.soleil.des visages.numberOfViewsInSession vs com.soleil.des visages.numberOfLogicalViews
Comme un utilisateur connecté sur l'application accède bien des pages, l'état des composants continuent à accumuler sur le serveur?
Techniquement, cela dépend de la mise en œuvre. Si vous parlez de la page-à-page de navigation (seulement les requêtes GET) puis Mojarra de ne pas sauver quoi que ce soit dans la session. Si ils sont cependant les requêtes POST (formes avec commandlinks/boutons), puis Mojarra permettra d'économiser de l'état de chaque forme en session jusqu'à la limite maximum. Cela permet à l'utilisateur d'ouvrir plusieurs formes dans les différents onglets du navigateur dans la même session.
Ou, lorsque l'état de l'enregistrement est réglé sur le client, puis JSF ne rien stocker dans la session. Vous pouvez le faire par le contexte suivant param en web.xml
:
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
Il va alors être sérialisé à une chaîne cryptée dans un champ caché avec le nom javax.faces.ViewState
de la forme.
Je ne comprends pas ce que le l'avantage de garder le composant de l'INTERFACE utilisateur de l'état du côté serveur. N'est pas directement en passant validés/convertis en données pour la gestion de haricots assez? Peux/dois-je essayer de l'éviter?
Ce n'est pas suffisant pour assurer l'intégrité et la fiabilité de JSF. JSF est un cadre dynamique avec un seul point d'entrée de contrôle. Sans une gestion de l'état, on serait en mesure d'usurpation/hack des requêtes HTTP en une certaine manière (par exemple en manipulant disabled
, readonly
et rendered
d'attributs), pour laisser JSF faire différent et potentiellement hazardful - choses. Il en irait de même être sujette à des attaques CSRF et le phishing.
Et ne fait pas que consommer trop de mémoire sur le serveur, si il y a des milliers de sessions utilisateur simultanées? J'ai une application où les utilisateurs peuvent publier des blogs sur certains sujets. Ce sont les blogs assez grande taille. Quand il y aura la publication ou de la demande pour l'affichage sur les blogs, les gros blogs seront enregistrées en tant que partie de l'état des composants. Cela permettrait de consommer trop de mémoire. N'est-ce pas un sujet de préoccupation?
La mémoire est particulièrement bon marché. Juste donner le appserver assez de mémoire. Ou si la bande passante du réseau est moins cher pour vous, il suffit de passer de l'état d'économie d'à côté client. Pour trouver la meilleure correspondance, juste test de résistance et le profil de votre webapp avec montant maximum d'utilisateurs simultanés et de donner ensuite la appserver 125% ~ 150% de la valeur maximale mesurée de la mémoire.
Notez que JSF 2.0, s'est beaucoup améliorée dans la gestion de l'état. Il est possible de sauvegarder partielle de l'etat (par exemple, seulement l' <h:form>
sera enregistrée au lieu de l'ensemble de <html>
tout le chemin à la fin). Mojarra par exemple le fait que. Une moyenne formulaire avec 10 champs de saisie (chacun avec une étiquette et le message) et 2 boutons prendrait pas plus de 1 KO. Avec 15 points de vue dans la séance, cela ne devrait pas être plus de 15 KO par session. Avec ~1000 sessions utilisateur simultanées, cela ne devrait pas être plus de 15 MO.
Votre préoccupation doit être plus axé sur les objets réels (géré les haricots et/ou même DB entités) dans la session ou de la portée de l'application. J'ai vu beaucoup de codes et de projets qui inutilement double emploi avec l'ensemble de la table de base de données en Java dans la mémoire de la saveur d'une session d'étendue de haricot où Java est utilisé au lieu de SQL pour filtrer/groupe/organiser les dossiers. Avec ~1000 enregistrements, qui pourrait facilement passer plus de 10 MO par session utilisateur.