2012-10-24 15 views
7

Ich habe ein Login-Formular mit JSF und PrimeFaces implementiert. Ich habe this example in der PrimeFaces-Showcase-Website verwendet.Wie kann ich auf Sitzungsattribut in Facelets Seite zugreifen

Ich habe eine Facelets-Seite, um eine DataTable anzuzeigen. Jetzt muss ich das obige Login-Formular mit dieser Tabellenseite integrieren. Also habe ich einige Zeilen in LoginBean.java hinzugefügt, um das Sitzungsattribut zu behandeln.

 if (username.equals(getUsername_db()) && password.equals(getPassword_db())) {//valid user and paward 
     loggedIn = true; 
     msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", getUsername_db()); 
     //new lines 
     FacesContext context2 = FacesContext.getCurrentInstance(); 
     HttpSession session = (HttpSession) context2.getExternalContext().getSession(true); 
     session.setAttribute("user", username); 
     //end of new lines 
     ... 

Ich brauche eine Spalte aus der Datatable zu verstecken, wenn der Benutzer nicht angemeldet ist. Nun mein Problem ist, wie kann ich Zugriff auf Session Attribut in meiner Facelets Seite?

Antwort

14

Sie haben den angemeldeten Benutzer als Sitzungsattribut mit dem Namen "user" gespeichert.

So ist es in EL wie folgt erhältlich:

#{user} 

Sie können nur das empty Schlüsselwort in EL, um zu überprüfen, wenn es vorhanden ist oder nicht (dh, wenn es angemeldet oder nicht) und Sie können JSF verwenden Komponente rendered Attribut zu instruieren, ob HTML-Ausgabe generieren oder nicht.

<h:panelGroup rendered="#{not empty user}"> 
    <p>Welcome #{user}, you have been logged in!</p> 
</h:panelGroup> 

In Ihrem speziellen Fall einer Tabellenspalte versteckt, verwenden Sie es wie folgt:

<p:column rendered="#{not empty user}"> 
    ... 
</p:column> 

Ein schöner Weg, um eine Session-Attribut speichern ExternalContext#getSessionMap() verwendet. Auf diese Weise ist Ihr Code frei von stinkenden javax.servlet.* Importen.

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", username); 

Unrelated auf das konkrete Problem, warum die folgende Kontrolle?

if (username.equals(getUsername_db()) && password.equals(getPassword_db())) { 

Warum machen Sie nicht einfach eine SELECT ... FROM user WHERE username=? AND password=? in SQL? Oder traust du der DB nicht, dass sie die richtige Reihe zurückgibt?

+0

Danke BalusC. Aber ich habe den Benutzer als Objekt in der Ansicht. so etwas zeigte "User @ 1a8b71e". Wie auch immer, ich habe Teil von deiner Antwort, um mein Problem zu lösen. Ich habe den Sitzungseinstellungsteil entfernt und die LoginBean-Klasse als SessionScoped festgelegt. Und ich konnte Werte direkt innerhalb meines panelGroup-Tags erhalten. Danke nochmal für den SQL-Hinweis. Ich habe es mit vorbereiteten Aussagen geändert. –

+0

Anscheinend ist 'username', wie in Ihrem Code gezeigt, kein' String'. Vielleicht haben Sie den Code in der Frage zu stark vereinfacht? Der SQL-Kommentar sollte übrigens nicht auf vorbereitete Anweisungen hinweisen. Sie vergleichen den Benutzernamen und das Passwort ** zweimal ** (einmal in DB und anschließend in Java). Das macht keinen Sinn. Überprüfen Sie einfach, ob DB einen Datensatz zurückgegeben hat oder nicht, das ist alles. Sie müssen den Benutzernamen/das Passwort nicht noch einmal vergleichen, den Sie bereits von der DB angefordert haben, um zu überprüfen und zurückzugeben. – BalusC

+0

Verstanden! Aber in meiner letzten SQL-Abfrage habe ich nur den Benutzernamen mit der Where-Klausel verwendet. wie: String query = "SELECT Benutzername, Passwort FROM Benutzer WHERE Benutzername = '" + uname + "';"; Also konnte ich nur username.equals (getUsername_db() Teil entfernen. Ich brauche nur in diesem Fall das Passwort zu überprüfen ... danke für Ihren Vorschlag. –

Verwandte Themen