2012-04-25 56 views
0

嗨im很新的jsp和servlets,所以我有一個問題,理解爲什麼我不能做一個簡單的查詢。代碼用於登錄頁面,用戶servlet查詢用戶發送的數據,然後將其與數據庫匹配,然後當它找到匹配項時返回login == true,並執行另一個查詢以獲取與之匹配的員工ID號與用戶名和密碼無法連接到數據庫使用jdbc

import java.sql.Connection; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.sql.*; 
import javax.servlet.*; 
import java.io.*; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.sql.Driver; 
import java.sql.DriverManager; 
import javax.servlet.http.HttpSession; 


public class Login extends HttpServlet { 


    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException{ 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 
      HttpSession session = request.getSession(); 
      Connection conn = null; 
      PreparedStatement prepState = null; 
      Statement state = null; 
      ResultSet result = null; 
      boolean login = false; 
      String username = request.getParameter("username"); 
      String password = request.getParameter("password");     
      String checkLogin = ("SELECT * FROM users WHERE username = ? AND password = ?");  

      try{ 

      Class.forName("com.mysql.jdbc.Driver"); 
      conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/matrix","",""); 

      prepState = conn.prepareStatement(checkLogin);  
      prepState.setString(1, username); 
      prepState.setString(2, password); 

      result = prepState.executeQuery(); 

      login = result.next(); 

      if(login){ 
       out.println("login"); 
       String id = result.getString(1); 
       String getUser = ("SELECT empLastName, empFirstName FROM employees WHERE empID = ? "); 
       prepState = conn.prepareStatement(getUser); 
       prepState.setString(1, id); 
       result = prepState.executeQuery(); 
       String first = result.getString(2); 
       String last = result.getString(1); 

            out.println("<html>"); 
            out.println(first + " " + last); 
            out.println("</html>"); 
      } 


      }catch(Exception e){  
       out.println("ERROR"); 
        e.printStackTrace(System.err); 
      } 
     }catch(Exception db){ 


     } finally {    
      out.close(); 
     } 
    } 

這裏的錯誤,我得到

INFO: The start() method was called on component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Matrix]] after start() had already been called. The second call will be ignored. 
    java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:919) 
     at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:4004) 
     at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1284) 
     at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2312) 
     at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2122) 
     at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:774) 
     at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 
     at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:375) 
     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:289) 
     at java.sql.DriverManager.getConnection(DriverManager.java:582) 
     at java.sql.DriverManager.getConnection(DriverManager.java:185) 
     at Login.processRequest(Login.java:57) 
     at Login.doPost(Login.java:119) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 

回答

0

嘗試檢查您的MySQL用戶名和密碼。 MySQL有默認的用戶名「根」

試圖改變你的代碼到這個

Class.forName("com.mysql.jdbc.Driver"); 
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/matrix","root",""); 

這意味着你連接到MySQL服務器,在本地主機(同一臺計算機上),以用戶名「根」,密碼爲空字符串「」(這是默認值)

2

這個類是錯在很多方面:

  1. 空catch塊。你永遠不會知道是否有問題。
  2. 在servlet中打開一個連接,而不是使用連接池。
  3. 硬連線驅動程序類和連接URL。
  4. 沒有證書用於連接到數據庫。
  5. 一個班級可以完成所有任務。每班最好有一個責任。
  6. Mingling UI(HTML生成)和數據庫訪問。
  7. 您不關閉結果集,語句或連接。
  8. 嘗試嵌套在另一個嘗試;我只推薦一個。

現在我累了。

我不清楚問題是什麼。你有錯誤嗎?如果是的話,你可以發佈堆棧跟蹤嗎?如果不是,你觀察到了什麼行爲?

+0

+1點形式的許多建設性意見。 – Jasonw 2012-04-25 01:54:29

+0

是的,我知道這個班在很多方面都是錯誤的,抱歉回合:P。 – JLawrence 2012-04-25 02:13:18

+1

不要道歉 - 沒有必要。每個人都曾經是初學者。這是一個問題的地方,所以這不是問題。我在說有些地方我認爲你的代碼和你的問題都可以改善。幫助我們幫助你 - 發佈堆棧跟蹤或者幫助我們更快地解決問題的底部。 – duffymo 2012-04-25 09:06:25