1.首先在finduser.jsp中,加一个修改的链接
<td><a href="deleteUser?id=${u.id}">删除</a></td>
2.在修改之前,我们首要查一下我要修改的数是否还存在
3.在用户接口里面,定义一个查询某个用户的方法
/**
* 根据id查询某个用户
* @param id 用户编号
* @return
*/
public UserInfo findUserById(int id);
4.然后去实现这个方法
@Override
public UserInfo findUserById(int id) {
// TODO Auto-generated method stub
UserInfo userinfo=null;
// 1.获得数据库连接对象
Connection conn=DBHelper.getConn();
// 2.书写sql语句
String sql="select * from user_info where id=?";
// 3.预编译sql语句,得到preparement的对象
try {
PreparedStatement ps=conn.prepareStatement(sql);
// 4.给参数(占位符)赋值
ps.setInt(1, id);
// 5.执行查询命令,会得到结果集
ResultSet rs=ps.executeQuery();
// 6.循环从结果集中读取数据给实体类对象属性赋
if(rs.next()){// 返回值为true,意味着找到数据了,返回值为false,意味着没有找到数据
userinfo=new UserInfo(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return userinfo;
}
5.创建后端接口 FindUserByIdServlet
映射地址一定要和页面保持一致!! finduserbyid
6.操作和删除一样,就是调用的方法不太一样
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// response.getWriter().append("Served at: ").append(request.getContextPath());
// 1.设置请求和响应的编码格式
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 2.接收传递过来的id
String id=request.getParameter("id");
// 3.调用根据id查询某个用户的方法
UserInfoDao uid=new UserInfoDaoImpl();
// Integer.parseInt 字符串转换成整型
UserInfo ui=uid.findUserById(Integer.parseInt(id));
// 4.判断是否查找到
if(ui!=null){// 找到了
// request作用域的范围是同一个请求,超过同一个请求,存储的数据不存在
// 把查询出来的用户存储在request中
request.setAttribute("ui", ui);
// 转发到这个注册页面
request.getRequestDispatcher("register.jsp").forward(request, response);
// 重新定向到页面,重新定向到新的资源
// response.sendRedirect("finduser");
}
}
7.我们让修改和注册共页面(使用同一个页面)
难点是要判断我们当前的操作到底是修改还是注册
取决于我们的输入框有没有数据,有数据就是修改,没数据 就是注册
8.所以当我们查到到数据之后,我们要让数据回显到输入框中
我们使用request作用域,做数据回显就必须要保证他们是同一个请求
request作用域范围比session小
9.去注册页面拿request里面存的数据,然后判断到底是注册还是修改
<form action="register" method="post">
<!-- 查询之后做数据回显 value="${ui.??}"拿request里面存的数据 -->
用户名<input type="text" name="userName" value="${ui.name}"/><br/>
密码<input type="password" name="pwd" value="${ui.pwd}"/><br/>
<!-- 在这个接口里面通过id值判断到底是注册还是修改,如果是注册就没有id值,修改有id值 -->
<!-- 隐藏域 hidden -->
<input type="hidden" name="id" value="${ui.id}"/>
<input type="submit" value="注册/修改"/><br/>
</form>
10. 修改是转发过去的,虽然页面显示是注册页面,其实还是同一个请求,都在servlet里面,所以说数据可以取出来可以显示
11. 接下来还是在用户接口里面写个修改的方法
/**
* 修改用户信息
* @param ui 用户对象
* @return
*/
public int update(UserInfo ui);
12. 然后去用户接口实现类里实现修改方法
@Override
public int update(UserInfo ui) {
// TODO Auto-generated method stub
int result=0;
// 1.获得数据库的连接
Connection conn=DBHelper.getConn();
// 2.书写sql语句 注册时间是改不了的
String sql="update user_info set username=?,passwords=? where id=?";
// 3.预编译sql语句
try {
PreparedStatement ps=conn.prepareStatement(sql);
// 4.给参数(占位符)赋值
ps.setString(1, ui.getName());
ps.setString(2, ui.getPwd());
ps.setInt(3, ui.getId());
// 5.执行命令
result=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
13.接下来我们去RegisterServlet里面做判断,判断id的值
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// doGet(request, response);
// 1.设置请求和响应的编码格式
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 2.获取注册页面传递过来的数据
String username=request.getParameter("userName");
String pwd=request.getParameter("pwd");
String id=request.getParameter("id");
// System.out.println("***INNNNNNNNNNNNNNNNNNNNNNNNN***"+username+pwd);
// 3.调用注册的方法
UserInfoDao uid=new UserInfoDaoImpl();
int result=0;
if(id.equals("")||id.equals(null)){ // 为空就是注册
// new UserInfo创建用户实体类的对象,通过无id的构造方法,创建一个新的用户的对象
result=uid.register(new UserInfo(username, pwd, formate(new Date())));
}else{ // 注册时间不改 调用修改方法,调用无时间的构造方法 然后把当前传递过来的字符串的id转换成整型
result=uid.update(new UserInfo(Integer.parseInt(id), username, pwd));
}
// 判断注册成功还是失败
if(result>0){// 注册或修改成功,跳转到登录页面
response.sendRedirect("login.jsp");
}else{
response.sendRedirect("register.jsp");
}
}
14.写到判断id是否为空的else时,调用修改方法,注册时间不改,所以我们去实体类里面再创建一个没有注册时间的构造方法 alt+shift+s+o
public UserInfo(int id, String name, String pwd) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
}
15.