2、接第一部分
2.5.2、 添加图书
分析:
代码实现
- 在book_manager.jsp 页面 修改 添加图书的a标签的跳转界面,修改为
<td><a href="pages/manager/book_edit.jsp">添加图书</a></td>
- 动态获取添加的图书信息
<c:forEach items="${requestScope.books}" var="books">
<tr>
<td>${books.name}</td>
<td>${books.price}</td>
<td>${books.author}</td>
<td>${books.sales}</td>
<td>${books.stock}</td>
<td><a href="manager/bookServlet?action=getBook&id=${books.id}">修改</a></td>
<td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${books.id}">删除</a></td>
</tr>
</c:forEach>
- 在book_edit.jsp 界面 修改提交后的跳转界面为manager/bookServlet 并添加 请求方法为 get
<form action="manager/bookServlet" method="get">
- 写一个输入框的隐藏域
<input type="hidden" name="action" value="add" />
其中,通过action 来判断 要调用的方法,现在是要添加图书,所以给value 赋值 add
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求的参数 == 封装成为Book对象
Book book = WebUtils.copyParamToBean(req.getParameterMap(), new Book());
//2.调用BookService.addBook()保存图书
bookService.addBook(book);
//3.跳到图书列表页面
// req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);
//重定向
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
}
tip: 请求转发是一次请求,重定向是两次请求,使用请求转发的话,用户按F5 页面的缓存还会再执行一次,添加的数据就有两条,所以得用重定向。
重定向后还要刷新页面,所以要在后面加上?action=list
这里使用了WebUtils.copyParamToBean 工具类,具体代码如下:
public class WebUtils {
/**
* 把Map中的值注入到对应的JavaBean属性中
* @param value
* @param bean
*/
public static <T> T copyParamToBean(Map value, T bean){
try {
System.out.println("注入之前:" + bean);
/*
* 把所有的请求参数都注入到 user对象中
*/
BeanUtils.populate(bean,value);
System.out.println("注入之后:" + bean);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return bean;
}
}
2.5.3、删除图书
分析
代码实现:
- 在book_manager.jsp 页面 修改 删除 a标签的跳转界面为 manager/bookServlet 并在后面传入 BookServlet页面要使用的方法 delete,delete是通过id来删除所以把 id属性也传入
<td><a href="manager/bookServlet?action=delete&id=${books.id}">删除</a></td>
- 在 BookServlet 页面 实现 delete 方法
(1)获取请求的参数 id,图书编号
(2)调用bookService.deleteBookById();删除图书
(3)重定向回图书列表管理的页面
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求的参数id,图书编号
/* String id = req.getParameter("id");
int i = 0;
try {
i = Integer.parseInt(id);
} catch (NumberFormatException e) {
e.printStackTrace();
}*/
int id = WebUtils.parseInt(req.getParameter("id"), 0);
//2.调用bookService.deleteBookById();删除图书
bookService.deleteBookById(id);
//重定向回图书列表管理的页面
// /manager/bookServlet?action=list
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
}
WebUtils.parseInt 工具类
/**
* 将字符串转换成为int类型数据
* @param strInt
* @param defaultValue
* @return */
public static int parseInt(String strInt,int defaultValue){
try {
return Integer.parseInt(strInt);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
- 这时删除时,出现新问题:点击删除没有提示框,解决:
(1)在book_manager 页面,给 删除 a标签添加一个 deleteClass类,制作点击事件
<td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${books.id}">删除</a></td>
(2)在book_manager 页面头部写一个 js方法,通过deleteClass类 绑定 删除 a标签 负责弹出提示框
<script type="text/javascript">
$(function () {
$("a.deleteClass").click(function () {
return confirm("确定要"+ $(this).parent().parent().find("td:first").text() +"删除吗");
});
});
</script>
tip : $(function () { } 是初始化,confirm() 的值 是 布尔类型 ,this 就是当前操作的对象 就是 删除 a标签
2.5.4、修改图书
分析:
实现:
- 在BookServlet页面中写一个 getBook 方法,获取要修改的图书信息
protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
- 修改book_manager.jsp 的 删除a标签跳转界面为:
<td><a href="manager/bookServlet?action=getBook&id=${books.id}">修改</a></td>
并将 要调用的方法和图书的id属性也传过去
- 实现getBook业务
(1)获取图书编号
(2)调用BookService.queryBookByid(id),得到要修改的图书信息
(3)把图书保存到Request 域中
(4)请求转发到/pages/manager/book_edit.jsp 页面
将修改图书信息并将修改完的 信息 带回表单中 去显示
protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求的参数图书编号
int id = WebUtils.parseInt(req.getParameter("id"), 0);
//2.调用bookService.queryBookById 查询图书
Book book = bookService.queryBookById(id);
//3.将图书信息保存到 request 域中
req.setAttribute("book",book);
//4.请求转发给 pages/manager/book_edit.jsp 页面
req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
}
WebUtils.parseInt 工具类
/**
* 将字符串转换成为int类型数据
* @param strInt
* @param defaultValue
* @return */
public static int parseInt(String strInt,int defaultValue){
try {
return Integer.parseInt(strInt);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
- 将book_edit中图书的内容用EL表达式动态获取
<tr>
<td><input name="name" type="text" value="${requestScope.book.name}"/></td>
<td><input name="price" type="text" value="${requestScope.book.price}"/></td>
<td><input name="author" type="text" value="${requestScope.book.author}"/></td>
<td><input name="sales" type="text" value="${requestScope.book.sales}"/></td>
<td><input name="stock" type="text" value="${requestScope.book.stock}"/></td>
<td><input type="submit" value="提交"/></td>
</tr>
- 在BookServlet 页面 写一个 update(HttpServletRequest req, HttpServletResponse resp) 用来保存修改图书的操作
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求的参数==封装成为Book对象
Book book = WebUtils.copyParamToBean(req.getParameterMap(), new Book());
//2.调用 BookService.updateBook(book);修改图书
bookService.updateBook(book);
//3.重定向回图书列表管理页面
resp.sendRedirect(req.getContextPath() +"/manager/bookServlet?action=list");
}
这里刷新页面:在bookServlet后面加上?action=list,用list方法来刷新页面
- 一个表单调用BookServlet中两个方法,要判断一下不同方法在何时被调用
<input type="hidden" name="action" value="${empty param.id ?"add":"update"}" />
- 在这里发现问题, bookService.updateBook(book);方法是根据 id 属性查找要修改的图书信息,但是现在并没有 id属性,所以在 book_edit 表单中 把 id 传入 request 域中
<input type="hidden" name="id" value="${requestScope.book.id}" />