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
,出现异常调用的可能点:
con.prepareStatement("insert into[userTable]values(?,?)")
pstmt.setString(index, value)
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 closedPreparedStatement
@exception
SQLException
if a database access error occurs; this method is called on a closedPreparedStatement
or the SQL
从你的代码来看,异常的原因应该是:
a database access error occurs
你在代码中捕获了异常,加了一个e.printStackTrace()
,好吧,去控制台看日志就知道原因了。
PS: 不知你是否是刚接触这种常见的前端Web+后台DB的Java编程,碰到问题好好分析一下代码,然后根据打印出的日志,一般能很快找出原因,而且在这个过程能锻炼到自己。这种自己独立分析问题,解决问题的方法很重要,再不行,还有google,求助论坛,问答网站这种及时性相对较差的方式应该是最后的选择。而且,自己独立解决问题,哪怕再小而简单的问题,难道不是一件很爽的事情吗?