2012-10-24 19 views
7

JSF ve PrimeFaces kullanarak bir giriş formu uygulamıyorum. PrimeFaces vitrin web sitesinde this example kullanıyorum.Facelets sayfasındaki oturum özniteliğine nasıl erişebilirim?

Bir dataTable göstermek için bir Facelets sayfam var. Şimdi yukarıdaki giriş formunu bu tablo sayfasıyla bütünleştirmem gerekiyor. Bu yüzden session özniteliğini işlemek için LoginBean.java'ya birkaç satır ekledim.

 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 
     ... 

kullanıcı oturum değilse ben, DataTable bir sütunu gizlemek gerekir. Şimdi benim sorunum, nasıl benim Facelet'lerin sayfası içindeki oturumu özelliğini erişebilir edilir?

cevap

14

Oturum açan kullanıcıyı "kullanıcı" adıyla oturum özelliği olarak kaydettiniz.

#{user} 
o hediyesi olup olmadığını sadece kontrol etmek EL empty kelime kullanabilirsiniz

(yani o giriş yapmış veya değilse) ve kullanabileceğiniz JSF şu şekildedir:

yüzden EL kullanılabildiğine HTML çıktısının oluşturulup oluşturulmayacağını belirtmek için bileşenin rendered özniteliği. Öznitelik ExternalContext#getSessionMap() kullanan bir oturumu depolamak için

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

Daha güzel bir yolu şöyledir: Bir tablo sütunu gizleme özel durumda

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

, onu kullanmayın. Bu şekilde kodunuz javax.servlet.* ithalatından kokuyor. Beton sorununa

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

İlgisiz , neden aşağıdaki onay?

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

Neden sadece SQL içinde SELECT ... FROM user WHERE username=? AND password=? yapmıyoruz? Yoksa DB'ye doğru satırı döndürdüğüne inanmıyor musunuz?

+0

Teşekkürler BalusC. Ama kullanıcıyı görüşte bir nesne olarak aldım. Bunun gibi bir şey "Kullanıcı @ 1a8b71e" gösterdi. Her neyse benim problemimi çözmek için cevabınızdan aldım. Oturum ayarları bölümünü kaldırdım ve LoginBean sınıfını SessionScoped olarak ayarladım. Ve doğrudan panelGroup etiketinin içinde değerler elde edebildim. SQL tavsiyesi için tekrar teşekkürler. Hazırladığı ifadeleri kullanarak değiştirdim. –

+0

Görünüşe göre 'kullanıcı adı' kodunuzda gösterildiği gibi bir "String" de değil. Belki de sorudaki kodu sadeleştirdiniz? Bu arada, SQL yorumu hazırlanmış ifadeler hakkında ipucu vermek anlamına gelmiyordu. Kullanıcı adını ve şifreyi ** iki kez ** karşılaştırıyorsunuz (bir kez DB'de ve Java'da bir daha sonra). Bu hiçbir anlam ifade etmiyor. Sadece DB'nin bir rekor getirip getirmediğini kontrol et, hepsi bu. Kullanıcı adının/parolanın bir kez daha karşılaştırılmasının gerekmediğini ve DB'yi kontrol edip geri göndermesini istediniz. – BalusC

+0

Anladım! ama son sql sorgumda sadece Where cümlesiyle sadece kullanıcı adı kullandım. like: String query = "Kullanıcı adı ve şifreyi SEÇİN Kullanıcıdan WHERE kullanıcı adı =" "+ uname +" '; "; Bu yüzden sadece username.equals (getUsername_db() kısmını kaldırabilirim. Sadece bu durumda şifreyi kontrol etmem gerekiyor ... öneriniz için teşekkürler. –

İlgili konular