2013-02-14 73 views
0

有人可以幫我解決這個錯誤嗎? 它說在UserDao.login和LoginBean.loginproject上的NullPointerException。 我是JSF 2中的新過濾器。 從session.getAttribute(「attribute」)方法中正在使用哪個屬性?MySQL + JSF 2登錄過濾器

謝謝你受了不少

問候

UserDao.java

public class UserDAO {  

    ... 

    public static Connection getInstance(){ 
     if(connection == null) 
      new UserDAO(); 
     return connection; 
    } 

    public static boolean login(String user, String password) throws SQLException { 
      connection = getInstance(); 
      String Query1 = "SELECT nama, password " + "FROM user " + "WHERE nama = ? AND password = ?"; 
      PreparedStatement statement1 = (PreparedStatement) connection.prepareStatement(Query1); 
      statement1.setString(1, user); 
      statement1.setString(2, password); 

      ResultSet rs = statement1.executeQuery(); 
      if (rs.next()) // found 
      { 
       System.out.println(rs.getString("nama")); 
       return true; 
      } 
      else { 
       return false; 
      } 
    } 
} 

LoginBean.java

public class LoginBean implements Serializable { 

... 
//getters setters 

    public String loginProject() throws SQLException { 
     boolean result = UserDAO.login(uname, password); 
     if (result) { 
      // get Http Session and store username 
      HttpSession session = Util.getSession(); 
      session.setAttribute("username", uname); 

      return "home"; 
     } else { 

      FacesContext.getCurrentInstance().addMessage(
        null, 
        new FacesMessage(FacesMessage.SEVERITY_WARN, 
        "Invalid Login!", 
        "Please Try Again!")); 
      return "login"; 
     } 
    } 

    public String logout() { 
     HttpSession session = Util.getSession(); 
     session.invalidate(); 
     return "login"; 
    } 
} 
+1

你似乎已經不明白'NullPointerException'是什麼了。否則你會問爲什麼變量X是空的,這本來就是一個更清晰的問題。現在我們不知道'null'究竟是什麼,所以我們也不能解釋它爲什麼'null'。退後一步,學習基本的Java,以便在**發生'NullPointerException'時理解**。然後,告訴我們哪個變量完全是'null'。順便說一句,你的DAO泄漏了數據庫資源,也不是線程安全的,這是一個相當大的問題。但這是一個與你問到的不同的問題。 – BalusC 2013-02-14 15:00:06

+0

它說在布爾結果nullpointer = UserDAO.login(uname,password);來自LoginBean.java和PreparedStatement語句1 =(PreparedStatement)connection.prepareStatement(Query1);從UserDao.java – 2013-02-14 20:24:15

+0

實際上,我嘗試從這個鏈接的例子。該過濾器工作,但登錄doesnt。 http://knowledgeshare.awardspace.info/?p=204 – 2013-02-14 20:34:04

回答

1

在JSF中你不需要就做什麼到Session對象,除非明確需要。通過在會話範圍中放置託管bean,您將解除處理「原始」會話對象的必要性,因爲它處於Servlet + JSP組合的時代:Faces Servlet會在您引用會話時立即爲您管理作業,視圖中的有限範圍的bean。

因此,當您使用具有session.setAttibute風格的東西時意味着您不想使用JSF 2.0爲您提供的所有優點。

說明這一點,您將擁有一個會話範圍的bean,它持有當前登錄的用戶。可以將登錄操作移動到與包含登錄表單(登錄輸入字段/密碼輸入字段/提交登錄按鈕)的簡單視圖關聯的請求範圍bean。這兩種豆類可能看起來像

@ManagedBean 
@RequestScoped 
public class LoginUser { 

    @EJB 
    private UserService userService; 

    @ManagedProperty(value="#{userManager}") 
    private UserManager userManager; 

    private String login; 
    private String password; 

    public LoginUser() { 
    } 

    public String login() { 
     //checking for nulls and empty strings 
     User user = userService.find(login, password); 
     if(user == null) { 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Wrong username or password")); 
      userManager.setCurrentUser(null); 
      return null; 
     } 
     userManager.setCurrentUser(user); 
     return "mypersonalspace.xhtml"; 
    } 

} 

@ManagedBean 
@SessionScoped 
public class UserManager { 

    private User currentUser; 

    public UserManager() { 
    } 

} 

在此設置的會議將包含所有的數據,你給它,在我們的情況下,User對象。例如,您總是可以在您的視圖中以#{userManager.currentUser.username}來引用它。作爲一個附註,您必須始終關閉與JDBC相關的元素(ResultSet s/Statement s和首先Connection s)以防止資源泄漏。另外,花些時間閱讀關於EJB的文獻以適當地使用DAO /服務。

+0

thx快速響應。我對Filter類中的以下代碼的示例感到困惑。 if(reqURI.indexOf(「/ login.jsf」)> = 0 ||(ses!= null && ses.getAttribute(「nama」)!= null)|| reqURI.indexOf(「/ public /」)> = 0 || reqURI.contains(「javax.faces.resource」))。 ses.getAttribute(「nama」),它的屬性是什麼? – 2013-02-14 20:27:25

+0

或LoginBean.java。 HttpSession session = Util.getSession(); session.setAttribute(「username」,uname);我不知道setAttribute指的是什麼。 – 2013-02-14 20:35:57

+0

由於您對Web過濾器和Java EE不太滿意,因此請勿過分複雜。只需使用標準方法即可。使用構建在Servlet API之上的JSF來避免處理Web servlet,會話等。對於認證,最好的辦法是'j_security_check'或者嘗試使用一個衆所周知的安全框架,比如Apache Shiro,或者Spring Security。例如,Shiro最初可以很容易地配置在一個文本文件中,並會爲您認證。 – skuntsel 2013-02-15 08:11:22