2013-07-04 5 views
0

JSF를 처음 사용하고 로그인 페이지가 있습니다. 여기에 사용자 클래스입니다JSF에서 Setter 메소드가 작동하지 않습니다.

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://xmlns.jcp.org/jsf/html"> 
<h:head> 

</h:head> 
<h:body> 

    <h:form> 
     <h:panelGrid columns="2" border="1"> 
      <h:outputText value="User:"></h:outputText> 
      <h:inputText id="username" value="#{login.username}"></h:inputText> 
      <h:outputText value="Password"></h:outputText> 
      <h:inputSecret id="password" value="#{login.password}"></h:inputSecret> 
      <h:commandButton value="Login" action="#{login.checkDB}"></h:commandButton> 

     </h:panelGrid> 
    </h:form> 
</h:body> 
</html> 

그리고 여기에 로그인 JSF 페이지

@Named(value = "login") 
@Dependent 
@RequestScoped 
public class Login{ 

private String username = "", password = ""; 

public String getUsername() { 
    return username; 
} 

public String getPassword() { 
    return password; 
} 

public void setUsername(String Username) { 
    username = Username; 
} 

public void setPassword(String Password) { 
    password = Password; 
} 

public void checkDB() { 
    try { 
     con=DB.connect(); 
     PreparedStatement checkDB = (PreparedStatement) con.prepareStatement(
       "SELECT * FROM Users where username = ? AND password = ?"); 
     checkDB.setString(1, username); 
     checkDB.setString(2, password); 
     ResultSet rs = null; 
     rs = (ResultSet) checkDB.executeQuery(); 

     if (rs.next()) { 
      User.customer = new Customer(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7)); 
      rs.close(); 
      DB.disconnect(con); 
      FacesContext.getCurrentInstance().getExternalContext().redirect("main.xhtml");    

     } else { 
      rs.close(); 

      DB.disconnect(con); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

그리고 :

@ManagedBean(name = "user") 
@SessionScoped 
public class User implements Serializable { 

public static Customer customer; 
private Connection con=null; 
public void setCustomer(Customer customer) { 
    User.customer = customer; 
} 

public Customer getCustomer() { 
    return customer; 
} 

public User() { 
} 

public void editInfo() { 
    String name = customer.getName(), surname = customer.getSurname(), password = customer.getPassword(); 
    String phone = customer.getPhone(), address = customer.getAddress(), email = customer.getEmail(); 


    try { 
     con=DBConnect.connect(); 
     int result = -1; 
     PreparedStatement checkDB = (PreparedStatement) con.prepareStatement(
       "UPDATE users set password=?,name=?,surname=?,phone=?,address=?," 
       + "email=? where username=?"); 
     checkDB.setString(7, customer.getUsername()); 
     checkDB.setString(1, password); 
     checkDB.setString(2, name); 
     checkDB.setString(3, surname); 
     checkDB.setString(4, phone); 
     checkDB.setString(5, address); 
     checkDB.setString(6, email); 
     result = checkDB.executeUpdate(); 
     con.close(); 
     FacesContext.getCurrentInstance().getExternalContext().redirect("editsuccesfull.xhtml"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

이 문제는, 사용자 이름과 암호가 설정 한 후

여기있다 setter는 함수가 관리 Bean에서 리턴 할 때 대기 상태가됩니다. 왜 이런 일이 일어나는 걸까요? 어떻게 해결할 수 있습니까?

+0

빈은 요청 범위가 –

+0

@KorayTugay입니다. 여기에있는 유일한 문제는 아닙니다. –

+0

[질문 [*]에 대한 답변에서 언급 한 요점을 조사하는 대신 동일한 후속 질문을 게시하는 이유는 무엇입니까? (http://stackoverflow.com/questions/17469667/not-sure-if-i-am-using- the-sessionscope- 올바르게)? 또한 여러 계정을 갖는 것은 SO에서 권장하지 않습니다. – skuntsel

답변

1

설정자가 올바르게 작동하지 않으면 Login#checkDB 방법에서 NullPointerException이 표시됩니다. 문제는 당신 Login 관리 빈은 @RequestScoped 또는 @ViewScoped로 표시되는 모양이다 (그 @RequestScoped 에디션 후) 당신은이 라인에 의해 발견 main.xhtml 대신 전달의에 리디렉션을하고있는 :

FacesContext.getCurrentInstance().getExternalContext().redirect("main.xhtml"); 

Login#checkDB 메소드 내에 수동으로 User 클래스의 인스턴스를 작성하므로 POJO로 작동하고 메소드 끝 부분에서 가비지 콜렉션 (기본 Java)으로 표시됩니다. 또한 리디렉션을 실행하면 모든 요청 속성이 손실됩니다.

문제를 해결하려면 세션에 사용자 데이터를 저장하고 CDI 컨테이너가 수동으로 수행하는 대신 Bean을 관리하게하십시오. 이를 수행하려면 사용자 데이터를 처리하기 위해 @SessionScoped 관리 Bean을 주입해야합니다 (보안 문제를 피하기위한 암호 제외). 여기에 설명되어 있습니다 : Get access to session scoped CDI bean from request scoped CDI Bean (이 Q/A는 당신이 찾고있는 로그인의 예입니다).

중요 참고 : 당신은 하나 또는 다른,하지만 NEVER 동시에 두 AT를 사용한다 CDI 콩과 JSF를 혼합하지 마십시오. User bean을 @ManagedBean에서 @Named으로 변경하여 CDI 전원으로 작업하십시오.

+0

사실 나는 User.customer = new Customer (rs.getString (1), rs.getString (2), rs.getString 3), rs.getString (4), rs.getString (5), rs.getString (6), rs.getString (7)); 로그인 빈에서, 나는 질문을 편집하고 User 클래스를 넣는다. 세션 스코프이다. 이것은 잘못된 길입니까? –

+0

@constructor 답변이 업데이트되었습니다. –

+0

난 당신이 세션 문제에 대한 FacesContext를 사용하는 방법을 생각해 주셔서 감사합니다 –

관련 문제