Java Servlet-MySQL错误

Java Servlet-MySQL错误,java,mysql,servlets,Java,Mysql,Servlets,我试图用以下代码将数据输入MySQL数据库。任何帮助都将不胜感激,因为我不明白为什么会有例外。请求参数是由HTML表单提供的,看起来根本没有任何问题,数据可以顺利通过。这个问题似乎发生在servlet完成之后,可能在DAO或连接管理器中的某个地方。非常感谢 相关Servlet代码: UserRegistrationBean user = new UserRegistrationBean(); user.setUsername(request.get

我试图用以下代码将数据输入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;

            }
用户道:

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>");