Java Servlet-MySQL错误
我试图用以下代码将数据输入MySQL数据库。任何帮助都将不胜感激,因为我不明白为什么会有例外。请求参数是由HTML表单提供的,看起来根本没有任何问题,数据可以顺利通过。这个问题似乎发生在servlet完成之后,可能在DAO或连接管理器中的某个地方。非常感谢 相关Servlet代码:Java Servlet-MySQL错误,java,mysql,servlets,Java,Mysql,Servlets,我试图用以下代码将数据输入MySQL数据库。任何帮助都将不胜感激,因为我不明白为什么会有例外。请求参数是由HTML表单提供的,看起来根本没有任何问题,数据可以顺利通过。这个问题似乎发生在servlet完成之后,可能在DAO或连接管理器中的某个地方。非常感谢 相关Servlet代码: UserRegistrationBean user = new UserRegistrationBean(); user.setUsername(request.get
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;
}
用户道:
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>
您使用的是非常旧的type-1
sun.jdbc.odbc.JdbcOdbcDriver
,它对所有数据库都很常见,而且还存在许多问题。因此,我的建议是使用特定于数据库的驱动程序,并相应地更改连接URL
对于Ex:
如果您使用的是mysql,请使用
// this will load the MySQL driver, each DB has its own driver
Class.forName("com.mysql.jdbc.Driver");
// setup the connection with the DB.
connect = DriverManager
.getConnection("jdbc:mysql://<ip>/<db name>?"
+ "user=<username>&password=<password>");
//这将加载MySQL驱动程序,每个数据库都有自己的驱动程序
Class.forName(“com.mysql.jdbc.Driver”);
//设置与数据库的连接。
connect=DriverManager
.getConnection(“jdbc:mysql://?”
+“user=&password=”);
我认为您的问题就在这里(为了可读性,代码稍微精简):
ResultSet searchRs=stmt.executeQuery(searchQuery);
//用户名可用
if(searchRs.next()==false){
setExists(false);
}
//用户名不可用
else if(searchRs.next()==true){
setExists(true);
}
if(bean.getExists()==true){
//返回错误并阻止注册
bean.setSuccess(false);
返回豆;
}
next()
将ResultSet
的内部光标移动到下一行。这意味着对next()
的后续调用不能保证返回相同的结果
因此:
if(searchRs.next()==false){
几行之后可能不会返回与此相同的内容:
else if(searchRs.next()==true){
这意味着存在一条通过此代码的潜在路径,其中两个条件都不是真的。具体来说,如果第一次调用next()
返回true
,第二次调用返回false
,则两个分支都不会执行
有很多方法可以解决这个问题。我个人会这样做:
//首先检查true条件,不需要==true
if(searchRs.next()){
//用户已存在
setExists(true);
bean.setSuccess(false);
//由于副作用,返回bean对象并不是绝对必要的
返回豆;
}否则{
//用户不存在
setExists(false);
stmt.executeUpdate(insertQuery);
//您需要提交事务才能使其正常工作:
currentCon.commit();
bean.setSuccess(true);
返回豆;
}
本质上,因为在这个上下文中,boolean
比较只能有两个结果,所以可以使用if{}else{}
而不是if{}else if{}
注意:我假设getExists()
的返回类型是Boolean
,而不是Boolean
(因为Boolean
不能为null
)。考虑到这一点,我相信您没有初始化getExists()后面的变量
由于上述问题,因此它仍然设置为默认值,对象的默认值为null
由于对bean
的更改是,实际上不需要从方法返回它,因此对对象的更改也应该在方法外部可见
对于您的异常处理,如果您没有在不报告的情况下吞下它,那么它将(非常)有用。可能调用方法需要知道某些异常发生了错误,因此与其捕获并不执行任何操作,不如执行以下操作:
试试看{
//您的数据库访问代码在这里
}捕获(SQLE异常){
//您不想保留任何无用数据,因此回滚连接
currentCon.rollback();
//将异常向上传播到调用方法
抛出新的RegistrationException(“注册用户时出错”,e);
}
其中,RegistrationException
是您自己创建的自定义异常类(您应该至少定义一个构造函数,该构造函数将字符串
和可丢弃的
作为参数)。您还必须修改方法签名以声明异常:
publicstaticuserregistrationbean寄存器(UserRegistrationBean)
抛出注册异常{
这将强制调用方法重新抛出(从而进一步传播)异常或处理它。您说您遇到了错误,但您没有告诉我们错误是什么,也没有堆栈跟踪供我们使用。您可以更新您的问题并提供给我们吗?另外,作为观察,您正在使用
executeQuery()
而不是executeUpdate()执行更新语句
。发布您的errorstacktrace。您真的应该对异常进行处理,至少在某个地方打印它们!为什么不使用com.mysql.jdbc.Driver作为您的DB驱动程序?sun.jdbc.odbc.JdbcOdbcDriver非常过时,应该避免使用。如果您现在就要进行这些更改,我目前在获取异常的方法上遇到问题我正在尝试修复它。我会尽快发布异常消息。是的,看起来还可以。那么现在有什么问题吗?好的,我正在努力解决如何制作我的tomcat(eclipse内部)向我显示异常,它不会在调试模式下启动。我现在还有一个关于自定义异常jsp的问题,如果我能让它正常工作,那么我将能够向您提供一个异常,告诉您出了什么问题。每当我提交此HTML表单时,我都会收到一个错误,我需要确定。似乎您有一大堆问题
// this will load the MySQL driver, each DB has its own driver
Class.forName("com.mysql.jdbc.Driver");
// setup the connection with the DB.
connect = DriverManager
.getConnection("jdbc:mysql://<ip>/<db name>?"
+ "user=<username>&password=<password>");