今天是把昨天没有写完的功能补充完整。
在CustomerServlet.java 中,增加了添加信息的功能,补上代码如下:
1 private voidaddCustomer(HttpServletRequest request, HttpServletResponse response)2 throwsServletException, IOException {3
4 //1、获取表单信息:name、address、phone
5 String name = request.getParameter("name");6 String address = request.getParameter("address");7 String phone = request.getParameter("phone");8
9 //2、检验 name 是否被占用10 //2.1、调用 CustomerDao 的 getCountWithName(String name)方法,获取name 在数据库中是否存在
11 long count =customerDao.getCountWithName(name);12 //2.2、若返回值大于 0 , 则响应 newCustomer.jsp 页面:通过转发的方式
13 if(count > 0){14 //2.2.1、要求在 newCustomer.jsp 页面显示一个错误提示:用户名 name 已经被占用,请重新选择。15 //在 request 中放入一个属性 message:用户名 name 已经被占用,请重新选择。16 //在 newcustomer.jsp 页面上通过 request.getAttribute("message") 的方式来显示。
17 request.setAttribute("message", "用户名" + name + "已经被占用,请重新选择");18
19 //2.2.2、newCustomer.jsp 的表单可以回显。20 //通过 value=21 //来进行回显。
22
23 request.getRequestDispatcher("/newCustomer.jsp").forward(request, response);24 //2.2.3、结束方法 return
25 return;26 }27
28 //3、把表单参数封装为一个 Customer 对象 customer
29 Customer customer = newCustomer(name, address, phone);30 //4、调用 CustomerDao 的 save 方法,执行保存操作
31 customerDao.save(customer);32 //5.重定向到 success.jsp 页面。要是用转发,刷新页面会有表单的重复提交。
33 response.sendRedirect("success.jsp");34 }
然后我是创建了 newcustomer.jsp,代码如下:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
Insert title here8
9
10
11 Objectmes=request.getAttribute("message");12 if(mes != null){13 %>
14
15
16
17 }18 %>
19
20
21
22
23
Name:24
"/>25
26
27
Address:28
"/>29
30
31
Phone:32
"/>33
34
35
36
37
38
39
40
如果信息增加成功,会重定向到 success.jsp 页面。代码如下:
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
Insert title here8
9
10
操作成功 ^_^
11
12
返回。。。
13
14
然后就是新增加了修改信息的方法,首先会获取你要编辑的那一行的 id,根据 id 显示对应的Customer 的对象的信息,然后再 update 进行修改
所以就是分成了两个动作 edit.do 和 update.do ,在CustomerServlet.java 中补上代码,如下。
1 private voidedit(HttpServletRequest request, HttpServletResponse response)2 throwsServletException, IOException{3
4 String path = "/error.jsp";5
6 //1、获取请求参数 id
7 String idStr = request.getParameter("id");8 try{9 //2、调用CustomerDao 的 get 方法 获取和 id 对应的 Customer 对象
10 Customer cust=customerDao.get(Integer.parseInt(idStr));11 if(cust != null){12 path = "/updatecustomer.jsp";13 //3、将 customer 放入 request 中
14 request.setAttribute("customers", cust);15 }16 } catch(NumberFormatException e) {17 e.printStackTrace();18 }19 //4、响应 updatecustomer.jsp 页面:转发。
20 request.getRequestDispatcher(path).forward(request, response);21 }22
23 private voidupdate(HttpServletRequest request, HttpServletResponse response)24 throwsServletException, IOException{25
26 //1、获取当前 表单的参数 id、name、address、phone、oldName
27 String id = request.getParameter("id");28 String name = request.getParameter("name");29 String address = request.getParameter("address");30 String phone = request.getParameter("phone");31 String oldName = request.getParameter("oldName");32
33 //2、检验name 是否已经被占用。34 //2.1、比较 name 和 oldName 是否相同,若相同 说明 name 可用。35 //若不相同,则调用CustomerDao 的 getCountWithName 方法,获取name 在数据库中是否存在
36 if(!oldName.equalsIgnoreCase(name)){37 long count =customerDao.getCountWithName(name);38 //2.2、若返回值 > 0,则响应 updatecustomer.jsp 页面:通过转发的方式
39 if(count > 0){40 //2.2.1、要求在 updatecustomer.jsp 页面显示一个错误提示:用户名 name 已经被占用,请重新选择。41 //在 request 中放入一个属性 message:用户名 name 已经被占用,请重新选择。42 //在页面山通过 request.getAttribute("message") 的方式来显示。
43 request.setAttribute("message", "用户名" + name + "已经被占用,请重新选择。");44 //2.2.2、updatecustomer.jsp 的表单可以回显。45
46 //2.2.3、结束方法:return
47 request.getRequestDispatcher("/updatecustomer.jsp").forward(request, response);48 return;49 }50
51 }52 //3、若验证通过,把表单参数封装为一个 Customer 对象 customer
53 Customer customer = newCustomer(oldName, address, phone);54 customer.setId(Integer.parseInt(id));55
56 //4、调用 CustomerDao 的update 方法,执行保存操作。
57 customerDao.update(customer);58 //5.重定向到 query.do 页面
59 response.sendRedirect("query.do");60 }
调用 customerDao.update 方法时,发现之前写底层的时候 CustomerDao 接口,漏写了这个方法,所以补上:
CustomerDao.java 中补上:
1 /**
2 * 更新3 *@paramcustomer4 */
5 public void update(Customer customer);
CustomerDaoJdbcImpl.java 中补上:
1 @Override2 public voidupdate(Customer customer) {3 String sql = "update customer set name=?,address=?,phone=? where id=?";4 update(sql, customer.getName(), customer.getAddress(), customer.getPhone(), customer.getId());5 }
我的 修改信息的页面 updatecustomer.jsp 是这样写的,考虑到了这几点:1、不区分大小写,(因为MySQL 里是不区分大小写的原因)。2、因为我的name 是唯一的,所以要修改时,要先判断新的 name 和 旧的name 是否一致,一致的话,就说明这个name 可以用。不一致的话,就得去数据库里查询一下有没有这个记录,有的话,得给出错误提示。3、表单的回显,得考虑如果新的 name 和旧的name 一致,回显的数据就是 新的。如果不一致且新的name 在数据库中有记录,回显的得是旧的数据。
代码如下:
1
2
3
4 pageEncoding="UTF-8"%>
5
6
7
8
9
Insert title here10
11
12
13 Objectmes=request.getAttribute("message");14 if(mes != null){15 %>
16
17
18
19 }20
21 Stringid= null;22 Stringname= null;23 StringoldName= null;24 Stringaddress= null;25 Stringphone= null;26 Customer customer=(Customer) request.getAttribute("customers");27 if(customer != null){28 id=customer.getId()+ "";29 name=customer.getName();30 oldName=customer.getName();31 address=customer.getAddress();32 phone=customer.getPhone();33 }else{34 id=request.getParameter("id");35 name=request.getParameter("oldName");36 oldName=request.getParameter("oldName");37 address=request.getParameter("address");38 phone=request.getParameter("phone");39 }40 %>
41
42
43 "/>
44 "/>
45
46
47
Name:48
"/>49
50
51
Address:52
"/>53
54
55
Phone:56
"/>57
58
59
60
61
62
63
64
至此,实现了基本的增删改查的操作,其实里面很多的细节还值得自己今后完善。
有些细节的考虑还值得反复推敲一下,例如:隐藏域的问题,回显的问题,对 name 字段的验证,还有我的添加信息的界面和修改信息的界面其实可以写成一个的。