【发布时间】:2026-01-07 21:20:08
【问题描述】:
我正在尝试使用以下代码将数据输入 MySQL 数据库。任何帮助将不胜感激,因为我无法弄清楚为什么会出现异常。请求参数由 HTML 表单提供,似乎根本没有任何问题,数据通过就好了。该问题似乎是在 servlet 完成后发生的,并且可能在 DAO 或连接管理器中的某个位置。非常感谢!
相关Servlet代码:
UserRegistrationBean user = new UserRegistrationBean();
user.setUsername(request.getParameter("Username"));
user.setPassword(request.getParameter("Password"));
user.setEmail(request.getParameter("Email"));
user = UserDAO.register(user);
if (user.getExists() == true) {
ErrorMessage = "The user name you entered has already been registered!";
request.setAttribute("ErrorMessage", ErrorMessage);
request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response);
return;
}
用户DAO:
public static UserRegistrationBean register(UserRegistrationBean bean) {
Statement stmt = null;
String username = bean.getUsername();
String password = bean.getPassword();
String email = bean.getEmail();
String searchQuery = "SELECT * FROM tblusers WHERE Username='"
+ username
+ "'";
String insertQuery = "INSERT INTO tblUsers (Username, Password, Email) VALUES ('"
+ username +
"', '"
+ password +
"', '"
+ email +
"')";
try {
currentCon = ConnectionManager.getConnection();
stmt = currentCon.createStatement();
//check if user exists
ResultSet searchRs = stmt.executeQuery(searchQuery);
//User name is available
if (searchRs.next() == false) {
bean.setExists(false);
}
//User name is not available
else if (searchRs.next() == true) {
bean.setExists(true);
}
if (bean.getExists() == true) {
//Return error and prevent registration
bean.setSuccess(false);
return bean;
}
else {
stmt.executeUpdate(insertQuery);
bean.setSuccess(true);
}
}
catch(Exception ex) {
//exception available here
}
return bean;
}
连接管理器:
public class ConnectionManager {
static Connection connection;
static String url;
public static Connection getConnection() {
try {
String url = "jdbc:odbc:" + "localhost:3306";
Class.forName("com.mysql.jdbc.Driver");
try {
connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/the_atrium_beauty?"
+ "user=System&password=sYstem~9");
}
catch (SQLException ex) {
//Stack trace available here
//ex.printStackTrace();
}
}
catch(ClassNotFoundException e) {
//Exception check available here
//System.out.println(e);
}
return connection;
}
}
尝试捕获块:
catch(Throwable exception) {
String errorMessage = exception.getMessage();
Throwable errorCause = exception.getCause();
String errorLocation = this.getServletName();
request.setAttribute("ErrorMessage", errorMessage);
request.setAttribute("ErrorCause", errorCause);
request.setAttribute("ErrorLocation", errorLocation);
request.getRequestDispatcher("/WEB-INF/errorDisplay.jsp").forward(request, response);
}
错误显示 JSP:
<body>
<% final String errorMessage = (String)request.getAttribute("ErrorMessage"); %>
<% final Throwable errorCause = (Throwable)request.getAttribute("ErrorCause"); %>
<% final String errorLocation = (String)request.getAttribute("ErrorLocation"); %>
<h1>An Error Occurred...</h1>
<p>
<%= errorMessage %><br><br>
<%= errorCause %><br><br>
<%= errorLocation %>
</p>
</body>
堆栈跟踪:
java.lang.NullPointerException
at com.atrium.userServlets.UserRegistrationServlet.doPost(UserRegistrationServlet.java:231)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
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:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
【问题讨论】:
-
你说你得到一个错误,但你没有告诉我们它是什么,并且没有堆栈跟踪可供我们使用。您能否更新您的问题并向我们提供这些问题?此外,作为观察,您正在使用
executeQuery()而不是executeUpdate()执行 update 语句。 -
发布你的错误堆栈跟踪。
-
你真的应该做一些有异常的事情,至少在某个地方打印出来!
-
为什么不使用 com.mysql.jdbc.Driver 作为数据库驱动程序? sun.jdbc.odbc.JdbcOdbcDriver 非常过时,应该避免使用。
-
现在将进行这些更改,我目前获取异常的方法有问题,我正在尝试修复它。将尽快提出异常消息。