2016-03-08 114 views
-1

如果驗證成功,我的servlet應該將我重定向到welcome.jsp頁面,否則將我重定向到fail.jsp。爲什麼我的代碼會拋出這個異常?

user = request.getParameter("name"); 
pass = request.getParameter("pass"); 
String q = "select * from users where user=" + user 
     + " and password=" + pass + ""; 
Statement st = con.createStatement(); 
ResultSet rs = st.executeQuery(q); 
String username = null; 
String password = null; 

while (rs.next()) { 
    username = rs.getString(2); 
    password = rs.getString(3); 

} 
if (username.equals(user) && password.equals(pass)) { // <-- Here is line 56 
    response.sendRedirect("Welcome.jsp"); 

} else { 
    response.sendRedirect("Fail.jsp"); 
} 

Avertissement: StandardWrapperValve[LoginServlet]:Servlet.service() for servlet LoginServlet threw exception 
       java.lang.NullPointerException 
       at com.DemoLogin.LoginServlet.service(LoginServlet.java:56) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
     at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
     at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
     at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) 
     at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
     at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
     at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
     at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
     at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
     at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
     at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
     at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
     at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
     at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
     at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
     at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
     at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
     at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
     at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
     at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
     at java.lang.Thread.run(Thread.java:745) 
+0

好的,我會的。謝謝你的時間 – JohnnySparow

+0

@JohnnySparow。不,你的問題沒有什麼不同。當你明白爲什麼時,你將成爲一個更好的編碼器。 –

+0

@MadPhysicist:我希望我能成爲一個更好的人。是的,我明白我的錯誤,我編輯了我的代碼,所以沒有更多的字符串username = null;和String password = null;我只是首先聲明它們,然後分配rs.getString();的值。 – JohnnySparow

回答

0

你正在做等於在一個String,它爲空,如果查詢返回0的元素,無論是用戶名和密碼都爲空,從而使一個空指針。

if(username==null || password==null){ 

      response.sendRedirect("Fail.jsp"); 
      return; 
} 
if (username!=null && username.equals(user)&& password.equals(pass)) 
     { 
      response.sendRedirect("Welcome.jsp"); 
      return; 

     } 
     else { 
      response.sendRedirect("Fail.jsp"); 
      return; 
     } 

你也應該使用返回;重定向後只是要確定,並建立一個DAO也將幫助其在servlet代碼中的SQL代碼會變得一團糟,從長遠來看

0

試試這個下面的代碼

if(rs.next()) 
    { 
     response.sendRedirect("Welcome.jsp"); 

    }   
    else { 
     response.sendRedirect("Fail.jsp"); 
    } 

如果用戶名和密碼是正確的,那麼rs.next()將是真實的,因爲你的查詢將從數據庫中檢索一行。所以你可以重定向到Welcome.jsp的用戶。否則,用戶提供了錯誤的用戶名或密碼,因此您可以重定向到用戶Fail.jsp

但在你的方法,如果用戶提供了錯誤的用戶名或密碼,那麼你肯定會得到一個NullPointerException,因爲你不正確地關心空檢查。

您使用ConnectionStatementResultSet時的一個重要一點,您應該適當注意打開和關閉這些。

+0

是的,你是對的..這很聰明!但我面臨的問題與jdbc連接器,我不知道爲什麼。它向我展示了這一點:Avertissement:Web應用程序[/ WebApplication5]註冊了JDBC驅動程序[com.mysql.jdbc.Driver],但在Web應用程序停止時未註銷它。爲了防止內存泄漏,JDBC驅動程序已被強制註銷。 信息:訪問未訪問引用 – JohnnySparow

+0

您沒有關閉連接或語句或ResultSet。可以請更新您的代碼並嘗試。 – Bikku

+0

是的,我修改了我的代碼。現在我不會收到錯誤,但我總是被重定向失敗。甚至當我輸入正確的用戶名和密碼時jsp。 – JohnnySparow

相關問題