2013-02-14 67 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