2010-11-04 11 views
9

Dans JSP, il existe un attribut session utilisé pour désactiver la session d'autogénération dans une requête.Aucune génération de session dans jsf

<%@page contentType="text/html" pageEncoding="UTF-8" session="false" %> 

Y at-il un moyen de faire la même chose dans JSF2?

Merci

Pourquoi? Parce que nous avons une page de formulaire de registre public en tant que page par défaut dans une application. C'est une forme très simple et une session est créée chaque fois que des personnes (ou des robots, etc.) demandent la page principale. ManagedBean est RequestScope, mais JSF crée une session dans la première requête de navegation.

+0

@BalusC Ajouté pourquoi en question. – angelcervera

Répondre

7

Il suffit de ne pas utiliser la vue/séance scope haricots (donc utiliser uniquement la demande ou de l'application scope haricots) et de l'état mis à économie client plutôt que par le réglage (par défaut) server le paramètre contextuel suivant dans web.xml.

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
</context-param> 

Alors JSF ne crée pas la session et stocker l'état d'affichage dans un champ caché avec le nom javax.faces.ViewState sous la forme chaque fois que nécessaire.

Le coût de création et de gestion des sessions est cependant assez négligeable. De plus, vous devez toujours compenser le coût de la sérialisation de l'état d'affichage et de la bande passante du réseau lors de l'utilisation de l'état d'affichage côté client.


Mise à jour selon votre commentaire:

@BalusC Oui, cela pourrait être une solution globale. Mais j'ai besoin de cette méthode seulement dans cette page publique. Dans d'autres pages, je veux la méthode d'économie d'état côté serveur.

Ah oui. Désolé, je ne vois pas de façons sympas dans JSF/Facelets de désactiver la session ou de changer l'état de la vue en sauvegardant à la demande. J'envisagerais d'utiliser un HTML pur <form> au lieu d'un JSF <h:form>, de le soumettre à une autre page JSF et d'utiliser @ManagedProperty dans le bean associé à la page JSF. Par exemple.

<form action="register.jsf" method="post"> 
    <input type="text" name="username" /> 
    <input type="password" name="password" /> 
    <input type="submit" /> 
</form> 

avec

@ManagedBean 
@RequestScoped 
public class Register { 

    @ManagedProperty(value="#{param.username}") 
    private String username; 

    @ManagedProperty(value="#{param.password}") 
    private String password; 

    @PostConstruct 
    public void init() { 
     // Do your thing here. 
     System.out.println("Submitted username/password: " + username + "/" + password); 
    } 

    // ... 
} 
2

répondre En fait de BalusC n'est pas correct depuis Mojarra 2.1.19/2.2.0. Vous pouvez lire à ce sujet dans son blog here. maintenant assez bien que la série:

<f:view transient="true"> 
    Your regular content 
</f:view> 

Comme l'a dit en post mentionné:

L'état d'affichage n'est pas été créée et donc la session aussi ne sera pas créée lorsqu'ils ne sont pas encore créé. [...] N'oubliez pas de placer le bean géré associé dans la portée de la requête au lieu de la portée de la vue ou de la session, sinon vous allez simplement à l'encontre de la signification du mot "stateless".

Code suivant extrait présent dans com.sun.faces.application.view.FaceletViewHandlingStrategy classe:

 /* 
     * Make sure we have a session here if we are using server state 
     * saving. The WriteBehindStateWriter needs an active session when 
     * it writes out state to a server session. 
     * 
     * Note if you flag a view as transient then we won't acquire the 
     * session as you are stating it does not need one. 
     */ 
     if (isServerStateSaving() && !viewToRender.isTransient()) { 
      getSession(ctx); 
     }  

Il faut aussi savoir que certains composants 3e partie bibliothèques, par exemple ICEfaces ou d'autres cadres, par ex. Apache Shiro, pourrait créer une session par lui-même à des fins personnelles.

Questions connexes