首页 > 开发 > JAVA > 正文

MyEclipse+tomcat实现注册功能遇到的问题

2017-09-07 09:24:24  来源:网友分享

web.xml中的register部分如下:

  <servlet    <servlet-name>RegisterServlet</servlet-name>    <servlet-class>servlet.RegisterServlet</servlet-class>  </servlet>   <servlet-mapping>     <servlet-name>RegisterServlet</servlet-name>     <url-pattern>/registerServlet</url-pattern>  </servlet-mapping>

Register.java代码段如下

public class RegisterServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)        throws ServletException, IOException {    request.setCharacterEncoding("gb2312");    response.setContentType("gb2312");    String username = request.getParameter("username");    String pwd = request.getParameter("pwd");    if(new DB().insertUser(username, pwd)){        response.sendRedirect("login.jsp");    }}public void doPost(HttpServletRequest request, HttpServletResponse response)        throws ServletException, IOException {    doGet(request, response);}

运行之后,浏览器没啥反应,我估计是Register.java中的if判断语句出现了问题,于是我添加了如下代码:

        if(new DB().insertUser(username, pwd)){        response.sendRedirect("login.jsp");    }else{        response.sendRedirect("success.jsp");    }

果然返回了success.jsp界面。其中register.jsp代码段如下:

    <form action="registerServlet"method = "post">    <table>    <caption>register</caption>    <tr>      <td>name:</td>      <td><input type = "text" name = "username" /></td>    </tr>    <tr>      <td>Password:</td>      <td><input type = "password" name = "pwd"/></td>    </tr>    </table>    <input type = "submit" value = "register"/></form>

其中DB.java的数据库连接代码段如下:

    Connection con;PreparedStatement pstmt;public DB(){    String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";    String url = "jdbc:sqlserver://localhost:1433; DatabaseName=JSP";     String username = "load";    String password = "hww";    //加载驱动程序以连接数据库    try {        Class.forName(driverName);         con = DriverManager.getConnection(url, username, password);    }    //捕获加载驱动程序异常    catch (ClassNotFoundException e){        System.err.println("加载JDBC/ODBC驱动程序失败。");        e.printStackTrace();        System.exit(1);    }    //捕获连接数据库异常    catch (SQLException e){        System.err.println("无法连接数据库");        e.printStackTrace();        System.exit(1);    }}

判断是否添加注册用户的代码段如下:

    public boolean insertUser(String username,String pwd){    try{        pstmt = con.prepareStatement("insert into[userTable]values(?,?)");        pstmt.setString(1, username);        pstmt.setString(2, pwd);        pstmt.executeUpdate();        return true;    }catch(Exception e){        e.printStackTrace();        return false;    }}

请问在哪里出错了,搞不明白。谢谢。

解决方案

通过你的描述,可以发现时insertUser方法的问题,看你贴的方法返回false是抛出了异常,确切的说是SQLException,出现异常调用的可能点:

  1. con.prepareStatement("insert into[userTable]values(?,?)")
  2. pstmt.setString(index, value)
  3. pstmt.executeUpdate()

下面是这3点的异常在Javadoc中的描述:

@exception SQLException if a database access error occurs or this method is called on a closed connection

@exception SQLException if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement

@exception SQLException if a database access error occurs; this method is called on a closed PreparedStatement or the SQL

从你的代码来看,异常的原因应该是:

a database access error occurs

你在代码中捕获了异常,加了一个e.printStackTrace(),好吧,去控制台看日志就知道原因了。

PS: 不知你是否是刚接触这种常见的前端Web+后台DB的Java编程,碰到问题好好分析一下代码,然后根据打印出的日志,一般能很快找出原因,而且在这个过程能锻炼到自己。这种自己独立分析问题,解决问题的方法很重要,再不行,还有google,求助论坛,问答网站这种及时性相对较差的方式应该是最后的选择。而且,自己独立解决问题,哪怕再小而简单的问题,难道不是一件很爽的事情吗?