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! :)
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
@ user3138997 ... Aber meine Eclipse Popup keine einzige Warnung oder Fehler, wie Methode nicht gefunden oder etwas. –
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