2012-10-24 3 views
7

JSF 및 PrimeFaces를 사용하여 로그인 양식을 구현했습니다. PrimeFaces 쇼케이스 웹 사이트에서 this example을 사용했습니다.Facelets 페이지의 세션 속성에 액세스하는 방법

저는 Facelets 페이지를 사용하여 dataTable을 표시합니다. 이제 위의 로그인 양식을이 테이블 페이지와 통합해야합니다. 그래서 세션 속성을 처리하기 위해 LoginBean.java에 몇 줄을 추가했습니다.

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

사용자가 로그인하지 않은 경우 나, DataTable의에서 열을 숨길 필요가있다. 지금 내 문제는 내가 어떻게 내 Facelets의 페이지 내에서 세션 속성에 액세스 할 수 있습니까?

답변

14

"user"라는 이름의 세션 속성으로 로그인 한 사용자를 저장했습니다.

#{user} 
가 존재의 여부를 경우 그냥 확인 EL의 empty 키워드를 사용할 수 있습니다

(즉, 그것은 로그인 또는 아니라면) 당신이 사용할 수있는 JSF를 다음과 같이

는 그래서 EL에서 사용할 수 구성 요소의 rendered 특성을 사용하여 HTML 출력을 생성할지 여부를 지정합니다. 속성이 ExternalContext#getSessionMap()를 사용하는 세션을 저장하는

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

더 좋은 방법을 다음과 같이 테이블 열을 숨기는 특정 경우

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

, 그냥 그것을 사용할 수 있습니다. 이 코드는 냄새가 무료입니다 javax.servlet.* 수입품입니다. 구체적인 문제에

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

관련없는 , 왜 다음과 같은 체크?

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

SELECT ... FROM user WHERE username=? AND password=?을 SQL로 변환하는 이유는 무엇입니까? 또는 DB가 올바른 행을 반환한다고 신뢰하지 않습니까?

+0

감사합니다. BalusC. 하지만 사용자를 뷰의 객체로 가져 왔습니다. 이런 식으로 "User @ 1a8b71e"가 나타났습니다. 어쨌든 나는 내 문제를 해결하기위한 답을 얻었습니다. 세션 설정 부분을 제거하고 LoginBean 클래스를 SessionScoped로 설정했습니다. 그리고 panelGroup 태그 내에서 값을 직접 가져올 수있었습니다. SQL advice에 대해 다시 한 번 감사드립니다. 준비된 문장을 사용하여 바꿨습니다. –

+0

코드에 표시된'username'은 분명히'String'이 아닙니다. 아마도 질문에서 코드를 단순화했을 것입니까? 그런데 SQL 주석은 준비된 명령문에 대해 암시하지 않았습니다. 사용자 이름과 암호 **를 두 번 비교합니다 ** (DB에서 한 번, Java에서 이후 한 번). 이것은 말이되지 않습니다. DB가 하나의 레코드를 반환했는지 확인하십시오. 그게 전부입니다. 이미 확인하고 반환 할 DB를 묻는 사용자 이름/암호를 다시 비교할 필요가 없습니다. – BalusC

+0

알았습니다! 하지만 마지막 SQL 쿼리에서 방금 Where 절에 username 만 사용했습니다. like : String query = "SELECT 사용자 이름, 비밀 번호 사용자 WHERE username = '"+ uname + "';"; 그래서 그냥 username.equals (getUsername_db() 부분을 제거 할 수 있습니다.이 경우에는 암호를 확인해야합니다 ... 제안을 주셔서 감사합니다. –

관련 문제