本博客为原创:综合 尚硅谷(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  

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <%@ page import="com.jsaon.mvcapp.domain.Customer" %>
<%@ page import="java.util.List" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>mve_index</title> <!-- 加入 jquery 库 -->
<script type="text/javascript" src="scripts/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){
//1.为删除操作添加 click事件
$(".delete").click(function(){
//2.获取a标签的父节点td,再获取td的父标签tr,再找到第二个td标签,也就是name节点,最后获取那么name节点的文本值
var content = $(this).parent().parent().find("td:eq(1)").text();
//3.确认。'是'则处理删除操作,'否'则不处理
var flag = confirm("确定要删除" + content + "的用户么?");
return flag; });
}); </script>
</head>
<body> <form action="query.do" method="post">
<table>
<tr>
<td>CustomerName:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>Address:</td>
<td><input type="text" name="address"/></td>
</tr>
<tr>
<td>Phone:</td>
<td><input type="text" name="phone"/></td>
</tr>
<tr>
<td><input type="submit" value="Query"/></td>
<td><a href="newcustomer.jsp">Add New Customer</a></td>
</tr>
</table>
</form>
<br><br> <%
List<Customer> lists = (List<Customer>)request.getAttribute("list");
if(lists != null && lists.size() > 0 ){
%>
<hr>
<br><br> <table border="1" cellpadding="10" cellspacing="0">
<tr>
<th>ID</th>
<th>CustomerName</th>
<th>Address</th>
<th>Phone</th>
<th>Update\Delete</th>
</tr> <%
for(Customer customer : lists){
%>
<tr>
<td><%= customer.getId() %></td>
<td><%= customer.getName() %></td>
<td><%= customer.getAddress() %></td>
<td><%= customer.getPhone() %></td>
<td>
<a href="editeCustomer.do?id=<%=customer.getId()%>">Update</a>
<a href="deleteCustomer.do?id=<%= customer.getId() %>" class="delete">Delete</a>
</td>
</tr> <%
}
%> </table>
<%
}
%> </body>
</html>

 

   2)updatecustomer.jsp

 <%@page import="com.jsaon.mvcapp.domain.Customer"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>updatecustomer</title>
</head>
<body>
<%--可以用来回显 <%= request.getParameter("name") %> 若为空 则赋为 空串儿 ; 反之 ,赋原值 --%> <h2><font color="red"><%=request.getAttribute("message") == null ? "" : request.getAttribute("message")%></font></h2> <%
// 此步骤 避免了 nullPointerException 异常 ,即 从sevlet中未获取到 customer
String id = null;
String oldName = null;
String name = null;
String address = null;
String phone = null;
Customer customer = (Customer)request.getAttribute("customer");
if(customer != null){
//当从sevlet中的 updateCustomer 方法返回的customer 不为空,就用customer填充字段
id = customer.getId() + "";
oldName = customer.getName();
name = customer.getName();
address = customer.getAddress();
phone = customer.getPhone();
} else{
//customer 为空,则 id,oldName 为
id = request.getParameter("id");
oldName = request.getParameter("oldName");
name = request.getParameter("oldName");
// address,phone 为请求参数, 通过转发 获取
address = request.getParameter("address");
phone = request.getParameter("phone"); }
%> <form action="updateCustomer.do" method="post">
<input type="hidden" name="id" value="<%= id %>"/>
<input type="hidden" name="oldName" value="<%= oldName %>"/>
<table>
<tr>
<td>CustomerName:</td>
<td><input type="text" name="name"
value="<%= name %>"/></td>
</tr>
<tr>
<td>Address:</td>
<td><input type="text" name="address"
value="<%= address %>"/></td>
</tr>
<tr>
<td>Phone:</td>
<td><input type="text" name="phone"
value="<%= phone %>"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="submit"/></td>
</tr>
</table>
</form> </body>
</html>

 

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

    注意: updateCustomer 中的验证

 private void updateCustomer(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("update");
request.setCharacterEncoding("UTF-8"); //1.获取请求信息:id,name,address,phone,oldName //1.1 隐藏域的 值
String idStr = request.getParameter("id");
String oldNameStr = request.getParameter("oldName"); //1.2 提交的值
String nameStr = request.getParameter("name");
String addressStr = request.getParameter("address");
String phoneStr = request.getParameter("phone"); //2.验证name 是否可用
//通过equalsIgnoreCase() 方式 避免了 大小写的问题。equals 方法区分大小写, 而数据库SQL 不区分大小写
if(!oldNameStr.equalsIgnoreCase(nameStr)){
//2.1 先比较name 和 oldName 是否相同,若相同,说明name 可用
//2.2 若不相同,则调用CustomerDAO 的getCostomerWithName(String name) 获取 name 在数据库中是否存在
long rel = customerDAO.getCountWithName(nameStr);
//2.2.1 若存在,则返回值大于 0,则响应 updatecustomer.jsp 页面:通过转发的方式
if(rel > 0){
// 进行回显字符串,在request 中放入一个属性 message:用户名 name
// 回显:updatecustomer.jsp 的表单值可以回显
// value="<%= request.getParameter("name") == null ? "" : request.getParameter("name") %>" 进行回显
// 注意:name 显示的是 oldName,而address 和 phone 显示的是新的
request.setAttribute("message", "用户名 " + nameStr + " 已经被占用了,请重新选择!");
//2.2.2 存在,要求在updatecustomer.jsp 页面显示一条消息:用户名 name 已经被占用了,请重新选择
request.getRequestDispatcher("/updatecustomer.jsp").forward(request,response);
// 2.2.3 结束方法:return
return;
}
} //3.通过验证后,则将表单封装为一个Customer 对象 customer
Customer customer = new Customer(nameStr, addressStr, phoneStr);
customer.setId(Integer.parseInt(idStr)); //4.调用CustomerDAO 的save(Customer customer) 执行更新操作
customerDAO.update(customer); //5.重定向到 query.do
response.sendRedirect("query.do"); } private void editeCustomer(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("edit");
String forwardPath = "/error.jsp";
//1. 获取请求参数id
String idStr = request.getParameter("id");
int id = Integer.parseInt(idStr);
try {
//2. 调用CustomerDAO 的get(id) 方法,获取 和id 对应的Customer 对象
Customer customer = customerDAO.get(id);
if(customer != null){
forwardPath ="/updatecustomer.jsp";
//3. 将 customer 放入 request 中
request.setAttribute("customer", customer);
}
} catch (Exception e) {}
//4. 响应updatecustomer.jsp 页面: 转发的形式
request.getRequestDispatcher(forwardPath).forward(request, response); }

   4)error.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>error page</title>
</head>
<body>
<h1> 页面出错了</h1>
</body>
</html>

  5)CustomerDAO 中的 update() 的声明

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

  

  6)CustomerDAOJdbcImpl 中 update 的实现

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

总结:

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

  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:用户名 name
26 // 回显: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 结束方法:return
33 return;
34 }
35 }

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

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

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

[原创]java WEB学习笔记26:MVC案例完整实践(part 7)---修改的设计和实现的更多相关文章

  1. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. [原创]java WEB学习笔记20:MVC案例完整实践(part 1)---MVC架构分析

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

  5. [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结

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

  6. [原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计

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

  7. [原创]java WEB学习笔记25:MVC案例完整实践(part 6)---新增操作的设计与实现

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

  8. [原创]java WEB学习笔记24:MVC案例完整实践(part 5)---删除操作的设计与实现

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

  9. [原创]java WEB学习笔记23:MVC案例完整实践(part 4)---模糊查询的设计与实现

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

随机推荐

  1. TC2安装方法

    电驴下载TC2英文原版安装文件,3 Disk,安装方法记录如下: cmd.exe chcp 437 挂载安装文件夹1到A盘 subst a: d:\c\Disk1 另开一个cmd,转到A盘,输入ins ...

  2. stage3D基础一-----Stage3D如何工作(转)

    在如何使用Stage3D系列中的第一个教程中,你将会学习到有关在Flash Player 11中新引入的ActionScript API,该API允许在Flash中利用硬件加速进行3D渲染.在学习这个 ...

  3. dotnet 各个版本的下载链接----Download .NET SDKs for Visual Studio

    https://dotnet.microsoft.com/download/visual-studio-sdks Not sure what to download? See recommended ...

  4. Vue+原生App混合开发手记#1

    项目的大致需求就是做一个App,里面集成各种功能供用户使用,其中涉及到很多Vue的使用方法,单独总结太麻烦,所以通过这几篇笔记来梳理一下.原型图如下: 路由配置 主界面会用到一些原生App方法,比如验 ...

  5. llinux获取系统时间

    linux中获取当前时间.统计程序运行时间,可以使用gettimeofday()得到毫秒级的时间统计,利用rdtsc指令获取纳秒级时间统计. gettimeofday() 它是一个linux C库函数 ...

  6. NYOJ 492 King (状态压缩)

    做题感悟:做完这题发现状态压缩有很多须要优化的地方. 解题思路:状态压缩 開始自己用的一般的思路,就和炮兵阵地,郑厂长等题类似的方法做的,開始超时,然后把数组开到了最小的极限就险过.然后看了别人的代码 ...

  7. 【v2.x OGE教程 11】 动画编辑器帮助文档

    ] 动画编辑器帮助文档 版本号 日期 作者 说明 1.0 2014-9-3 橙子游戏 文档创建       一.简单介绍 动画编辑器用于游戏动画的可视化编辑,支持序列帧动画和关键帧动画.通过解析生成的 ...

  8. Cocos2d-x中使用第三方so库

    项目中假设使用到第三方的SDK,大多数是以.so动态共享库的文件打包给我们使用.怎样使用他们,见以下分析. 1.获得库文件 假如我们得到的库文件是libxxx.so(注:关于.so文件的命名方式,可百 ...

  9. 【BZOJ3672】[Noi2014]购票 树分治+斜率优化

    [BZOJ3672][Noi2014]购票 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.       ...

  10. 微信小程序 入门

    目录结构: app.json  .小程序的全局配置 pages:  当前小程序所有页面路径. window:小程序所有页面的顶部背景颜色,文字颜色定义在这里. tabBar:  设置底部 tab ne ...