2017-05-13 3 views
0

Ich versuche, einen Login-Panel zu bauen, aber wenn ich versuche, eine Methode im Modell (CustomerDbUtil) zu nennen, von der Steuerung (LoginController), wirft es Ausnahmen. Ich bin etwas neu in JSP und ich kann es nicht debuggen. Der Code zusammen mit der Konsolenausgabe wird unten dargestellt:Mein Servlet wirft Ausnahmen

Login-Formular

<form action="LoginController" method="POST" id="login-form"> 

     <header class="text-center"> 
      <h2 class="font-light">Login</h2> 
     </header> 

     <input type="hidden" name="command" value="LOAD"> 

     <label>Username : </label> 
     <input type="text" name="username" placeholder="Username" class="form-control" required /><br> 

     <label>Password : </label> 
     <input type="password" name="password" placeholder="Password" class="form-control" required /><br> 

     <input type="submit" value="Login" class="btn btn-primary" /><br><br> 

     <span style="color:black">New users</span> <a href="user-register.jsp">Register here</a> 

    </form> 

LoginController (Controller-Klasse)

package com.loginpanel.web; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.security.MessageDigest; 

import javax.annotation.Resource; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.sql.DataSource; 

/** 
* Servlet implementation class LoginController 
*/ 

@WebServlet("/LoginController") 
public class LoginController extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    @Resource(name="jdbc/login_module") 
    DataSource datasource; 
    private CustomerDbUtil customerDbUtil; 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     try { 

      // Get the form data 
      String username = request.getParameter("username"); 
      String md5 = md5(request.getParameter("password")); 

      Customer theCustomer = validate(username, md5); 

     } catch (Exception e) { 
      throw new ServletException(); // Throws this exception 
     } 

    } 


    private Customer validate(String username, String md5) throws Exception { 

     Customer theCustomer; 
     System.out.println("inside validate"); // Gets printed in the console 

     try { 

      theCustomer = customerDbUtil.selectCustomer(username, md5); // Throws Exception at this statement 
      System.out.println("inside try"); // Not printed in the console 

      if(theCustomer==null) { 
       return null; 
      } 

     } catch(Exception e) { 
       throw new ServletException(); 
     } 
     return theCustomer; 

    } 


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     // Redirect back to the login page as the url does not support direct page access 
     RequestDispatcher dispatcher = request.getRequestDispatcher("./"); 
     request.setAttribute("message", "You need to login first"); 
     dispatcher.forward(request, response); 

    } 



    // Hash the string to MD5 
    private String md5(String str) throws Exception { 

     String plainText = str; 
     StringBuffer hexString = new StringBuffer(); 

     if(plainText!=null) { 
      MessageDigest mdAlgorithm = MessageDigest.getInstance("MD5"); 
      mdAlgorithm.update(plainText.getBytes()); 

      byte[] digest = mdAlgorithm.digest(); 

      for (int i = 0; i < digest.length; i++) { 
       plainText = Integer.toHexString(0xFF & digest[i]); 

       if (plainText.length() < 2) { 
        plainText = "0" + plainText; 
       } 

       hexString.append(plainText); 
      } 
     } 
     return hexString.toString(); 
    } 

} 

CustomerDbUtil (Modell)

package com.loginpanel.web; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 


import javax.sql.DataSource; 


public class CustomerDbUtil { 
    private DataSource dataSource; 

    public CustomerDbUtil(DataSource theDataSource) { 
     dataSource = theDataSource; 
    } 

    public boolean addCustomer(Customer theCustomer) throws Exception { 

     // Declare the DB objects 
     Connection con = null; 
     PreparedStatement myStmt = null; 
     boolean isExecuted = false; 

     try{ 
      // Get the connection 
      con = dataSource.getConnection(); 

      // Write the SQL for adding a student 
      String sql = "INSERT INTO customers (" 
        + " first_name, last_name, username, md5, country) " 
        + "VALUES (?, ?, ?, ?, ?)"; 

      // Prepare the statement 
      myStmt = con.prepareStatement(sql); 

      // Add the params 
      myStmt.setString(1, theCustomer.getCustomerFirstName()); 
      myStmt.setString(2, theCustomer.getCustomerLastName()); 
      myStmt.setString(3, theCustomer.getUsername()); 
      myStmt.setString(4, theCustomer.getMd5()); 
      myStmt.setString(5, theCustomer.getCountry()); 

      // Execute the SQL statement 
      if(myStmt.execute()){ 
       isExecuted = true; 
      } else { 
       isExecuted = false; 
      } 

     } catch(Exception e) { 
      e.printStackTrace(); 
     } finally { 
      // Clear the JDBC objects 
      close(con, myStmt, null); 
     } 
     return isExecuted; 
    } 


    public Customer selectCustomer(String user, String md) throws Exception { 

     Customer theCustomer = null; 

     // Get the connection 
     Connection con = null; 
     PreparedStatement myStmt = null; 
     ResultSet myRs = null; 

     System.out.println("What??"); 

     try { 

      con = dataSource.getConnection(); 

      // Write the SQL statement 
      String sql = "SELECT * FROM login_module.customers WHERE username = ? AND md5 = ?"; 

      // Prepare the statement 
      myStmt = con.prepareStatement(sql); 

      // Add the parameters 
      myStmt.setString(1, user); 
      myStmt.setString(2, md); 

      // Execute the query 
      myRs = myStmt.executeQuery(); 

      System.out.println("Hello"); 

      // Fetch the student details 
      if(myRs.next()) { 
       int customerId = myRs.getInt("customer_id"); 
       String firstName = myRs.getString("first_name"); 
       String lastName = myRs.getString("last_name"); 
       String user_name = myRs.getString("username"); 
       String md5 = myRs.getString("md5"); 
       String country = myRs.getString("country"); 

       // Create a customer object 
       theCustomer = new Customer(customerId, firstName, lastName, user_name, md5, country); 

      } else { 
       throw new Exception("Could not find the customer"); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      close(con, myStmt, myRs); 
     } 

     return theCustomer; 

    } 


    public void close(Connection conn, Statement stm, ResultSet rs) throws Exception{ 

     try{ 
      // Close the objects 
      if(conn!=null) { 
       conn.close(); 
      } 
      if(stm!=null) { 
       stm.close(); 
      } 
      if(rs!=null) { 
       rs.close(); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public List<Customer> getCustomers() throws Exception{ 

     List<Customer> listCustomer = new ArrayList<>(); 

     Connection con = null; 
     Statement myStmt = null; 
     ResultSet myRs = null; 

     try { 

       // Get the connection 
       con = dataSource.getConnection(); 

       // Create SQL statements 
       String sql = "SELECT * FROM login_module.customers"; 

       // Prepare the statement 
       myStmt = con.createStatement(); 

       // Execute the statement and store it into the ResultSet 
       myRs = myStmt.executeQuery(sql); 

       // Fetch the data one-by-one and add it to the list 
       while(myRs.next()){ 
        int id = myRs.getInt("customer_id"); 
        String firstName = myRs.getString("first_name"); 
        String lastName = myRs.getString("last_name"); 
        String username = myRs.getString("username"); 
        String md5 = myRs.getString("md5"); 
        String country = myRs.getString("country"); 


        Customer theCustomer = new Customer (id, firstName, lastName, username, md5, country); 

        // Add it to the list 
        listCustomer.add(theCustomer); 

       } 

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

       // Close the connection objects 
       close(con, myStmt, myRs); 

      } 

      // Return the list 
      return listCustomer; 


    } 

} 

Fehlerprotokoll

inside validate 
May 13, 2017 7:24:00 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [com.loginpanel.web.LoginController] in context with path [/loginpanel] threw exception [null] with root cause 
javax.servlet.ServletException 
    at com.loginpanel.web.LoginController.doGet(LoginController.java:38) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1504) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1460) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

Ich weiß nicht, ob ich etwas fehlt oder es etwas falsch zu machen. Bitte helfen Sie. Danke im Voraus! :)

+0

Ich vermute, dass Ihr customerDbUtil nicht Eigenschaft verdrahtet ist und als Ergebnis ist es null während des Aufrufs. In dieser Zeile -> theCustomer = customerDbUtil.selectCustomer (username, md5); // löst bei dieser Anweisung eine Ausnahme aus. – user3138997

+0

@ user3138997 ... Aber meine Eclipse Popup keine einzige Warnung oder Fehler, wie Methode nicht gefunden oder etwas. –

+0

Es ist eine Laufzeitausnahme und kein Kompilierungsfehler. Versuchen Sie, customerDbUtil zu initialisieren. CustomerDbUtil customerDbUtil = new customerDbUtil (Datenquelle); (mein Fehler anfänglich hatte ich gedacht, das ist ein Spring MVC) – user3138997

Antwort

0

Sie können Spring Bean zu Ihrem Servlet injizieren.

ApplicationContext context = WebApplicationContextUtils.getWebApplicationContex t(getServletContext()); 
InterfaceType bean = (InterfaceType)context.getBean("BeanName"); 
Verwandte Themen