2010-11-04 11 views
9

In JSP gibt es ein Attribut Sitzung für automatische Auto-Generator-Sitzung in einer Anfrage verwendet.Keine Sitzungsgenerierung in JSF

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

Gibt es eine Möglichkeit, dasselbe in JSF2 zu tun?

Danke

Warum? Weil wir eine öffentliche Formularseite als Standardseite in einer Anwendung haben. Es ist eine sehr einfache Form und die Sitzung wird jedes Mal erstellt, wenn Leute (oder Roboter usw.) die Hauptseite anfragen. ManagedBean ist RequestScope, aber JSF erstellt eine Sitzung in der ersten Navigationsanforderung.

+0

@BalusC Hinzugefügt warum in Frage. – angelcervera

Antwort

7

verwenden Sie einfach nicht ansehen/Session Beans scoped (so verwenden nur Anforderung oder Anwendung scoped Bohnen) und setzte Zustand client statt (Standard) server speichern, indem Sie die folgenden Kontextparameter in web.xml Einstellung.

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

Dann JSF wird die Sitzung nicht erstellen und den Ansichtszustand in einem verborgenen Eingabefeld mit dem Namen javax.faces.ViewState in Form bei Bedarf speichern.

Die Kosten für die Erstellung und Verwaltung der Sitzungen sind jedoch ziemlich vernachlässigbar. Außerdem müssen Sie die Kosten für die Serialisierung des Ansichtszustands und der Netzwerkbandbreite bei Verwendung der Statusspeicherung auf der Clientseite abwägen.


aktualisiert nach Ihrem Kommentar:

@BalusC Ja, könnte dies eine globale Lösung. Aber ich brauche diese Methode nur auf dieser öffentlichen Seite. Auf anderen Seiten möchte ich die serverseitige Zustandsspeichermethode.

Ah richtig. Entschuldigung, ich sehe keine schönen Möglichkeiten in JSF/Facelets, um die Sitzung zu deaktivieren oder das Speichern des Ansichtszustands auf Anfrage zu ändern. Ich würde in Erwägung ziehen, ein einfaches HTML <form> anstelle eines JSF <h:form> zu verwenden, lassen Sie es an eine andere JSF-Seite übergeben und verwenden Sie @ManagedProperty in der Bean, die der JSF-Seite zugeordnet ist. Z.B.

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

mit

@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

Eigentlich von BalusC Antwort ist nicht korrekt, da Mojarra 2.1.19/2.2.0. Sie können darüber in seinem Blog here lesen. voll genug jetzt nur gesetzt:

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

Wie erwähnt Beitrag wurde gesagt:

Der Ansichtszustand nicht erzeugt und somit wird die Sitzung auch nicht erstellt werden, wenn noch nicht erstellt. [...] Denken Sie daran, die zugehörige verwaltete Bean in den Anforderungsbereich anstatt in den Ansichts-/Sitzungsumfang zu setzen, sonst vereiteln Sie einfach die Bedeutung des Wortes "zustandslos".

Next Code-Schnipsel in com.sun.faces.application.view.FaceletViewHandlingStrategy Klasse:

 /* 
     * 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); 
     }  

Beachten Sie auch, dass einige 3rd-Party-Komponenten-Bibliotheken, z.B. ICEfaces oder andere Gerüste, z.B. Apache Shiro, konnte selbst Session für einige Zwecke erstellen.