想把注册信息添加到数据库,怎么添不上去啊?
DBConnection.java的代码如下:package cn.com.systop.l02.connection;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 * 数据库连接类
 * @author Administrator
 *
 */
public class DBConnection {
//数据库连接字符串
private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";// SQL Server 2005的JDBC驱动类 private static final String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=Book";// 用于标识数据库的URL private static final String UNAME = "sa";// 数据库用户名 private static final String UPWD = "123";// 数据库密码 /**
 * 获得数据库连接
 * @return 数据库连接对象
 */
public static Connection getConnection(){
Connection con = null;
try {
//加载驱动
Class.forName(DRIVER);
//获得数据库连接
con = DriverManager.getConnection(URL, UNAME, UPWD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
}
BaseDAO.java的代码如下:package cn.com.systop.l02;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class BaseDAO {
private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";// SQL Server 2005的JDBC驱动类 private static final String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=Book";// 用于标识数据库的URL private static final String UNAME = "sa";// 数据库用户名 private static final String UPWD = "123";// 数据库密码 protected Connection con;// 数据库连接对象 protected PreparedStatement pstm;// 预编译的SQL语句对象 protected Statement stmt;// SQL语句对象 protected ResultSet rs;// 结果集对象 // 获取数据库连接
protected void getConnection() throws Exception {
Class.forName(DRIVER);
con = DriverManager.getConnection(URL, UNAME, UPWD);
} // 释放数据库资源
protected void closeAll() {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstm != null) {
try {
pstm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
if (con != null && con.isClosed() == false) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**
 * 执行SQL语句,可以执行增、删、改的操作,不能执行查询
 * @param sql    预编译的sql语句
 * @param param  sql语句参数数组
 * @return rows  返回受影响的行数
 */
protected int executeSQL(String sql, String[] param) throws Exception {
int rows = 0; // 受影响的行数 try {
this.getConnection();
if (param != null && param.length > 0) {
pstm = con.prepareStatement(sql);
// 循环,将SQL语句参数数组中的值依次赋给预执行语句
for (int i = 0; i < param.length; i++) {
// 注意,setXXX()方法的索引值从1开始,所以有i+1
pstm.setString(i + 1, param[i]);
}
rows = pstm.executeUpdate();
} else {
// 创建Statement对象,执行更新sql语句,返回受影响的行数
stmt = con.createStatement();
rows = stmt.executeUpdate(sql);
}
} finally {
this.closeAll();// 释放资源
}
System.out.println("调用通用的增、删、改方法成功!");
return rows;// 返回受影响的行数
}
}
UserRegisterBean.java的代码如下:package cn.com.systop.l02;public class UserRegisterBean {
private String userName;//用户名
private String userPassword;//密码
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}

public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
//get/set方法
public String toString(){
return "欢迎"+this.getUserName()+"注册成功,密码为:"+this.getUserPassword();
}
}
Users.java的代码如下:package cn.com.systop.l02;public class Users {
private int userID;//用户ID private String userName;//用户名 private String userPass;//用户密码 public int getUserID() {
return userID;
} public void setUserID(int userID) {
this.userID = userID;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getUserPass() {
return userPass;
} public void setUserPass(String userPass) {
this.userPass = userPass;
}}
UsersDAO.java的代码如下:package cn.com.systop.l02;import cn.com.systop.l02.Users;public interface UsersDAO { // 用户注册
public int save(Users users); // 修改密码
public int update(Users users); // 登录验证
public Users doLogin(String userName, String passWord);
}
UsersDAOImpl.java的代码如下:package cn.com.systop.l02;import cn.com.systop.l02.UsersDAO;
import cn.com.systop.l02.Users;public class UsersDAOImpl extends BaseDAO implements UsersDAO { // 用户注册
public int save(Users users) {
int row = 0;
String sql = "INSERT INTO t_users VALUES(?,?)";// 带输入参数的SQL语句
// 创建String数组放置输入参数的值
String[] param = { users.getUserName(), users.getUserPass() };
try {
// 调用父类的executeSQL方法,返回受影响的行数。
row = super.executeSQL(sql, param);
} catch (Exception e) {
e.printStackTrace();
}
return row;
} // 修改密码
public int update(Users users) {
int row = 0;
String sql = "UPDATE t_users SET userPass = ? WHERE userID = ?";// 带输入参数的SQL语句
// 创建String数组放置输入参数的值
String[] param = { users.getUserPass(), users.getUserID() + "" };
try {
// 调用父类的executeSQL方法,返回受影响的行数。
row = super.executeSQL(sql, param);
} catch (Exception e) {
e.printStackTrace();
}
return row;
}

// 登录验证
public Users doLogin(String userName, String passWord) {
Users users = null;
String sql = "SELECT * FROM t_users WHERE userName=? AND userPass=?";// SQL语句
try {
super.getConnection();// 调用父类方法获取数据库连接
pstm = con.prepareStatement(sql);// 创建预编译的SQL语句对象
// 设置输入参数的值
pstm.setString(1, userName);
pstm.setString(2, passWord);
rs = pstm.executeQuery();// 执行sql语句,返回结果集。
if (rs.next()) {
// 如果用户名和密码都正确遍历结果集创建用户对象封装数据
users = new Users();
users.setUserID(rs.getInt(1));
users.setUserName(rs.getString(2));
users.setUserPass(rs.getString(3));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
super.closeAll();// 释放数据库资源
}
return users;// 返回用户对象
}
}
register.jsp的代码如下:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="cn.com.systop.l02.Users" %>
<%@ page import="cn.com.systop.l02.UsersDAO" %>
<%@ page import="cn.com.systop.l02.UsersDAOImpl" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   </head>
  
  <body>
  <form action="register.jsp" method="post">
<table>
<tr>
<td colspan="2">
<h3>请您注册</h3>
</td>
</tr>
<tr>
<td>注册名:</td>
<td><input type="text" name="userName"></td>
</tr>
<tr>
<td>密&nbsp;&nbsp;码:</td>
<td><input type="password" name="userPassword"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="注册"> <input
type="reset" value="重置"></td>
</tr>
</table>
</form>
  <jsp:useBean id="userRegister"
class="cn.com.systop.l02.UserRegisterBean"></jsp:useBean>
<jsp:setProperty name="userRegister" property="userName" />
<jsp:setProperty name="userRegister" property="userPassword" />
<%
if (userRegister.getUserName() != null) {
%>
<%=userRegister.toString()%>
<%
}
%>
<jsp:setProperty name="userRegister" property="*"/>
<%
if (userRegister.getUserName() != null) {
%>
注册成功!<br>
用户名:<jsp:getProperty name="userRegister"  property="userName"/><br>
密码:<jsp:getProperty name="userRegister"  property="userPassword"/>
<%
}
%>
<%
    //设置request编码的字符集方式,简体中文使用UTF-8字符集
request.setCharacterEncoding("UTF-8");
//下面获取表单元素的值,封装到Users实体类对象中
Users user = new Users();
user.setUserName(request.getParameter("userName"));
user.setUserPass(request.getParameter("userPass"));
//创建用户信息数据库访问类对象
   UsersDAO usersDAO = new UsersDAOImpl();
   //调用用户注册方法
int row = usersDAO.save(user);
//根据返回结果判断是否添加成功
if(row > 0){
//注册成功,重定向到首页
response.sendRedirect(path + "/register.jsp");
}else{
//注册失败,重定向回注册页面
response.sendRedirect(path + "/register.jsp");
}
%>
  </body>
</html>
然后在地址栏输入http://localhost:8080/JSPLogin/register.jsp
服务器栏就显示下面的好多重复的代码了信息: Jk running ID=0 time=0/47  config=null
2013-4-26 21:14:16 org.apache.catalina.startup.Catalina start
信息: Server startup in 2096 ms
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
调用通用的增、删、改方法成功!
还有好多调用增删改方法成功的文字呢,没复制完,我想把注册的信息添加到数据库,怎么出现这样的显示呢?对我这个新手真的好难

解决方案 »

  1.   

    第一不合适的地方:
    <%
    //设置request编码的字符集方式,简体中文使用UTF-8字符集
    request.setCharacterEncoding("UTF-8");
    //下面获取表单元素的值,封装到Users实体类对象中
    Users user = new Users();
    user.setUserName(request.getParameter("userName"));
    user.setUserPass(request.getParameter("userPass"));
    // System.out.println(user.getUserName());

    //创建用户信息数据库访问类对象
    UsersDAO usersDAO = new UsersDAOImpl();
    //调用用户注册方法
    int row = usersDAO.save(user);
    //根据返回结果判断是否添加成功
    if (row > 0) {
    //注册成功,重定向到首页
    // response.sendRedirect(path + "/register.jsp");
    } else {
    //注册失败,重定向回注册页面
    //response.sendRedirect(path + "/register.jsp");
    }
    %>
    在点击注册时,进行注册数据的保存(打印一句 调用通用的增、删、改方法成功),然后返回本页面,页面重新加载页面,又保存,又打印,死循环。你可以另写两个不同的页面。分别为注册成功和注册失败。
    第二个不合适:
    在BaseDAO中,因为你真正的保存操作,在这个DAO中,这个DAO由UserDAO调用的
    public int save(Users users) {
    int row = 0;

    String sql = "INSERT INTO t_users VALUES(?,?)";// 带输入参数的SQL语句
    // 创建String数组放置输入参数的值
    String[] param = { users.getUserName(), users.getUserPass() };
    try {
    // 调用父类的executeSQL方法,返回受影响的行数。
    row = super.executeSQL(sql, param);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return row;
    }看到当页面没有提交注册数据时,users.getUserName(),users.getUserPass()返回的是null.这样,传进去的param其实是有内存空间的,只是数据都为空。 if (param != null && param.length > 0) {
    pstm = con.prepareStatement(sql);
    // 循环,将SQL语句参数数组中的值依次赋给预执行语句
    for (int i = 0; i < param.length; i++) {
    // 注意,setXXX()方法的索引值从1开始,所以有i+1
    pstm.setString(i + 1, param[i]);
    }
    rows = pstm.executeUpdate();
    } else {
    // 创建Statement对象,执行更新sql语句,返回受影响的行数
    stmt = con.createStatement();
    rows = stmt.executeUpdate(sql);
    }这样一来,param永远不会为null,param.length永远为2,你上面的判断就一直成立。而真正保存的数据是两个空值。相信你的本意不是这个,所以可以直接为param时里的数据进行判断。
    for(String str:param)
    {
    if(str==null||str.length()<=0||str.equals(""))
    {
    return ;
    }
    }第三个不合适:
    在页面中user.setUserPass(request.getParameter("userPass"));里你用的是userPass而真正的name是userPassword。
      

  2.   

    请问大神,第二个不合适的地方,判断param数据时,在哪个源代码中修改呢?而当我添加String str:param这几个代码时,jre版本不行,我的jre版本是6.0 的,请问应该怎么改这段代码呢?谢谢