2012-10-24 17 views
7

Tôi đã triển khai biểu mẫu đăng nhập bằng JSF và PrimeFaces. Tôi đã sử dụng this example trong trang web giới thiệu PrimeFaces.Làm cách nào để truy cập thuộc tính phiên trong trang Facelets

Tôi có trang Facelets để hiển thị bảng dữ liệu. Bây giờ tôi cần tích hợp mẫu đăng nhập ở trên với trang bảng này. Vì vậy, tôi đã thêm vài dòng vào LoginBean.java để xử lý thuộc tính session.

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

tôi cần phải che giấu một cột từ DataTable, nếu người dùng không đăng nhập. Bây giờ vấn đề của tôi là, làm thế nào tôi có thể truy cập vào thuộc tính phiên bên trong trang Facelets của tôi?

Trả lời

14

Bạn đã lưu trữ người dùng đã đăng nhập dưới dạng thuộc tính phiên với tên "người dùng".

Vì vậy, nó ở EL có sẵn như sau:

#{user} 

Bạn chỉ có thể sử dụng từ khóa empty trong EL để kiểm tra xem nó có mặt hay không (tức là nếu nó đăng nhập hay không) và bạn có thể sử dụng JSF thuộc tính rendered của thành phần để hướng dẫn xem có tạo ra đầu ra HTML hay không.

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

Trong trường hợp cụ thể của bạn che giấu một cột trong bảng, chỉ cần sử dụng nó như sau:

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

Một cách đẹp hơn để lưu trữ một phiên thuộc tính được sử dụng ExternalContext#getSessionMap(). Bằng cách này, mã của bạn không có mùi nhập khẩu javax.servlet.*.

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

Không liên quan cho vấn đề cụ thể, lý do tại sao việc kiểm tra sau đây?

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

Tại sao bạn không chỉ thực hiện SELECT ... FROM user WHERE username=? AND password=? trong SQL? Hay bạn không tin tưởng DB rằng nó trả về hàng phải không?

+0

Cảm ơn BalusC. Nhưng tôi đã nhận người dùng làm đối tượng trong chế độ xem. một cái gì đó như thế này cho thấy "User @ 1a8b71e". Dù sao tôi có một phần từ câu trả lời của bạn để giải quyết vấn đề của tôi. Tôi đã xóa phần cài đặt phiên và đặt lớp LoginBean là SessionScoped. Và tôi đã có thể nhận được các giá trị trực tiếp bên trong tag panelGroup của tôi.Cảm ơn một lần nữa cho lời khuyên SQL. Tôi đã thay đổi nó bằng cách sử dụng báo cáo chuẩn bị. –

+0

Rõ ràng 'tên người dùng' như được hiển thị trong mã của bạn không phải là một' Chuỗi'. Có lẽ bạn đã quá đơn giản hóa mã trong câu hỏi? Theo cách bình luận SQL không có nghĩa là gợi ý về các câu lệnh chuẩn bị. Bạn đang so sánh tên người dùng và mật khẩu ** hai lần ** (một lần trong DB và một sau đó trong Java). Điều này không có ý nghĩa. Chỉ cần kiểm tra xem DB có trả lại một bản ghi hay không, đó là tất cả. Bạn không cần phải so sánh tên người dùng/mật khẩu một lần nữa mà bạn đã yêu cầu DB kiểm tra và trả lại. – BalusC

+0

OK! nhưng trong truy vấn sql cuối cùng của tôi, tôi chỉ sử dụng tên người dùng với mệnh đề Where. như: String query = "SELECT username, password FROM user WHERE username = '" + uname + "';"; Vì vậy, tôi có thể chỉ cần loại bỏ username.equals (getUsername_db() một phần.Tôi chỉ cần kiểm tra mật khẩu trong trường hợp này ... cảm ơn cho bạn gợi ý –