博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[原创]java WEB学习笔记26:MVC案例完整实践(part 7)---修改的设计和实现
阅读量:4628 次
发布时间:2019-06-09

本文共 10506 字,大约阅读时间需要 35 分钟。

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

1.修改操作的思路:先显示页面,修改字段,提交表单,修改完成

     1)index.jsp 查询 

  2)查询结果 中的 Update 超链接  <a href="editeCustomer.do?id=<%=customer.getId()%>">Update</a>

  3)servlet 中的editeCustomer 通过 传入的 id号 进行查询 ,返回结果保存到 customer对象 ,转发到updatecustomer.jsp 

  4)在 updatecustomer.jsp 页面中显示所要修改的字段

  5)填写提交字段 ,提交到 servlet中的 updateCustomer.do 中

  6)先验证 name是否可以,若不可以,则通过转发的方式返回错误提示信息;若可以,则将提交的字段,封装为一个Customer对象,调用customerDAO.update(customer)方法处理更新

 

 

2.关键代码

 

  1)index.jsp  

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8"%> 3      4 <%@ page import="com.jsaon.mvcapp.domain.Customer" %> 5 <%@ page import="java.util.List" %> 6  7  8  9 10 
11 mve_index12 13
14 15 29 30 31 32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
CustomerName:
Address:
Phone:
Add New Customer
51
52
53 54 <%55 List
lists = (List
)request.getAttribute("list");56 if(lists != null && lists.size() > 0 ){57 %>58

59
60 61
62
63
64
65
66
67
68
69 70 <%71 for(Customer customer : lists){72 %>73
74
75
76
77
78
82
83 84 <%85 }86 %>87 88 89
ID CustomerName Address Phone Update\Delete
<%= customer.getId() %> <%= customer.getName() %> <%= customer.getAddress() %> <%= customer.getPhone() %> 79 Update80 Delete81
90 <% 91 }92 %>93 94 95

 

 

   2)updatecustomer.jsp

 

1 <%@page import="com.jsaon.mvcapp.domain.Customer"%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3     pageEncoding="UTF-8"%> 4  5  6  7 
8 updatecustomer 9 10 11 <%--可以用来回显 <%= request.getParameter("name") %> 若为空 则赋为 空串儿 ; 反之 ,赋原值 --%>12 13

<%=request.getAttribute("message") == null ? "" : request.getAttribute("message")%>

14 15 <%16 // 此步骤 避免了 nullPointerException 异常 ,即 从sevlet中未获取到 customer17 String id = null;18 String oldName = null;19 String name = null;20 String address = null;21 String phone = null;22 Customer customer = (Customer)request.getAttribute("customer");23 if(customer != null){24 //当从sevlet中的 updateCustomer 方法返回的customer 不为空,就用customer填充字段25 id = customer.getId() + "";26 oldName = customer.getName();27 name = customer.getName();28 address = customer.getAddress();29 phone = customer.getPhone();30 } else{31 //customer 为空,则 id,oldName 为32 id = request.getParameter("id");33 oldName = request.getParameter("oldName");34 name = request.getParameter("oldName");35 // address,phone 为请求参数, 通过转发 获取36 address = request.getParameter("address");37 phone = request.getParameter("phone");38 39 }40 %>41 42 43
44
45
46
47
48
49
51
52
53
54
56
57
58
59
61
62
63
64
65
CustomerName:
Address:
Phone:
66
67 68 69

 

 

   3 )CustomerServlet2.java     updateCustomer()  , editeCustomer()

    注意: updateCustomer 中的验证

 

1 private void updateCustomer(HttpServletRequest request, HttpServletResponse response) 2             throws ServletException, IOException { 3         System.out.println("update"); 4         request.setCharacterEncoding("UTF-8"); 5          6         //1.获取请求信息:id,name,address,phone,oldName 7          8             //1.1 隐藏域的 值 9             String  idStr = request.getParameter("id");10             String  oldNameStr = request.getParameter("oldName");11             12             //1.2 提交的值13             String  nameStr = request.getParameter("name");14             String  addressStr = request.getParameter("address");15             String  phoneStr = request.getParameter("phone");            16         17         //2.验证name 是否可用18             //通过equalsIgnoreCase() 方式 避免了  大小写的问题。equals 方法区分大小写, 而数据库SQL 不区分大小写19             if(!oldNameStr.equalsIgnoreCase(nameStr)){20                 //2.1  先比较name 和 oldName 是否相同,若相同,说明name 可用21                 //2.2 若不相同,则调用CustomerDAO 的getCostomerWithName(String name) 获取 name 在数据库中是否存在22                 long rel = customerDAO.getCountWithName(nameStr);23                 //2.2.1 若存在,则返回值大于 0,则响应 updatecustomer.jsp 页面:通过转发的方式24                 if(rel > 0){25                     // 进行回显字符串,在request 中放入一个属性 message:用户名 name26                     // 回显:updatecustomer.jsp 的表单值可以回显27                     // value="<%= request.getParameter("name") == null ? "" : request.getParameter("name")  %>"  进行回显28                     // 注意:name 显示的是 oldName,而address 和 phone 显示的是新的29                     request.setAttribute("message", "用户名 " + nameStr + " 已经被占用了,请重新选择!");30                     //2.2.2 存在,要求在updatecustomer.jsp 页面显示一条消息:用户名 name 已经被占用了,请重新选择31                     request.getRequestDispatcher("/updatecustomer.jsp").forward(request,response);32                     // 2.2.3 结束方法:return33                     return;34                 }35             }36         37         //3.通过验证后,则将表单封装为一个Customer 对象 customer38             Customer  customer = new Customer(nameStr, addressStr, phoneStr);39             customer.setId(Integer.parseInt(idStr));40             41         //4.调用CustomerDAO 的save(Customer customer) 执行更新操作42             customerDAO.update(customer);43             44         //5.重定向到 query.do 45             response.sendRedirect("query.do");46 47     }48 49     private void editeCustomer(HttpServletRequest request,50             HttpServletResponse response) throws ServletException, IOException {51         System.out.println("edit");52         String forwardPath = "/error.jsp";53         //1. 获取请求参数id54          String idStr = request.getParameter("id");55          int id = Integer.parseInt(idStr);56          try {57              //2. 调用CustomerDAO 的get(id) 方法,获取 和id  对应的Customer 对象58              Customer customer = customerDAO.get(id);59             if(customer != null){60                 forwardPath ="/updatecustomer.jsp";61                 //3. 将 customer 放入 request 中62                 request.setAttribute("customer", customer);63             }64         } catch (Exception e) {}65          //4. 响应updatecustomer.jsp 页面: 转发的形式66          request.getRequestDispatcher(forwardPath).forward(request, response);    67         68     }

 

 

   4)error.jsp

 

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2     pageEncoding="UTF-8"%> 3  4  5  6 
7 error page 8 9 10

页面出错了

11 12

 

 

  5)CustomerDAO 中的 update() 的声明

 

1 //更新操作2     public void update(Customer customer);

 

  

  6)CustomerDAOJdbcImpl 中 update 的实现

 

1 @Override2     public void update(Customer customer) {3         String sql = "UPDATE customers  SET name = ?, address = ?, phone = ? WHERE id = ?";4         update(sql, customer.getName(), customer.getAddress(), customer.getPhone(), customer.getId());5     }

 

 

 

 

总结:

  1.表单的回显(了解):

          <td><input type="text" name="name"

            value="<%= request.getParameter("name") == null ? "" : request.getParameter("name") %>"/></td>

  2.验证

1)id一般都使用 隐藏域 <input type="hidden" name="id" value="<%= id %>"/>

2)修改中的复杂验证,若某一字段在数据库表中不允许重复的解决方案

  ①在表单中使用隐藏域保存该字段的原始信息值:<input type="hidden" name="oldName" value="<%= oldName %>"/>

  ②同时在Servlet 中同时获取原始值和新提交的值:若一致,则通过;若不 一致,则用使用新提交的值去查询数据库表。返回有记录,则提示错误信息或者页面;范围无记录,则可以执行修改

1  if(!oldNameStr.equalsIgnoreCase(nameStr)){ 2 20                 //2.1  先比较name 和 oldName 是否相同,若相同,说明name 可用 3 21                 //2.2 若不相同,则调用CustomerDAO 的getCostomerWithName(String name) 获取 name 在数据库中是否存在 4 22                 long rel = customerDAO.getCountWithName(nameStr); 5 23                 //2.2.1 若存在,则返回值大于 0,则响应 updatecustomer.jsp 页面:通过转发的方式 6 24                 if(rel > 0){ 7 25                     // 进行回显字符串,在request 中放入一个属性 message:用户名 name 8 26                     // 回显:updatecustomer.jsp 的表单值可以回显 9 27                     // value="<%= request.getParameter("name") == null ? "" : request.getParameter("name")  %>"  进行回显10 28                     // 注意:name 显示的是 oldName,而address 和 phone 显示的是新的11 29                     request.setAttribute("message", "用户名 " + nameStr + " 已经被占用了,请重新选择!");12 30                     //2.2.2 存在,要求在updatecustomer.jsp 页面显示一条消息:用户名 name 已经被占用了,请重新选择13 31                     request.getRequestDispatcher("/updatecustomer.jsp").forward(request,response);14 32                     // 2.2.3 结束方法:return15 33                     return;16 34                 }17 35             }

 

 

3)在修改状态下,若验证没有通过,表单的回显问题。通用的原则

  不允许重复的字段要给予提示,但字段中的显示旧的字段值,允许修改,则改为新的字段的值。通过Ajax 会有更好的用户体验。

 

  3.response.sendRedirect()方法可以防止表单的重复提交

 

转载于:https://www.cnblogs.com/jasonHome/p/5537929.html

你可能感兴趣的文章
C基础知识小总结(十)
查看>>
Ignatius and the Princess IV (水题)
查看>>
ConcurrentHashMap实现原理及源码分析
查看>>
AES加解密
查看>>
洛谷 P5019 铺设道路(差分)
查看>>
CSS层叠样式
查看>>
Pycharm初始创建项目和环境搭建(解决aconda库文件引入不全等问题)
查看>>
Spring Boot启动过程(二)
查看>>
使用Python命令创建jenkins的job
查看>>
第十二周编程总结
查看>>
暑假集训D15总结
查看>>
对类型“DevExpress.Xpf.Grid.GridControl”的构造函数执行符合指定的绑定约束的调用时引发了异常。...
查看>>
dogse入门指南
查看>>
Spring 整合quartz 时 定时任务被调用两次以及quartz 的配置
查看>>
oracle测试环境表空间清理
查看>>
余额宝技术架构读后感
查看>>
1.lamp网站构建
查看>>
狼人杀
查看>>
《lua程序设计(第二版)》学习笔记(五)-- 函数基础
查看>>
【CF EDU59 E】 Vasya and Binary String (DP)
查看>>