编写图书模块的 Web 层,和页面联调测试
5.1、图书列表功能的实现
1、图解列表功能流程
2、BookServlet 程序中添加 list 方法
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 通过BookService查询全部图书
List<Book> books = bookService.queryBooks();
//2 把全部图书保存到Request域中
req.setAttribute("books",books);
//3、请求转发到/pages/manager/book_manager.jsp页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
配置web文件:
3、修改【图书管理】请求地址
注意:在BaseServlet程序中要添加上doGet方法,不然没办法直接访问BookServlet程序
public class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
4、修改 pages/manager/book_manager.jsp 页面的数据遍历输出
记得要使用JSTL前要导包:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<c:forEach items="${requestScope.books}" var="book">
<tr>
<td>${book.bookName}</td>
<td>${book.price}</td>
<td>${book.author}</td>
<td>${book.sales}</td>
<td>${book.stock}</td>
<td><a href="book_edit.jsp">修改</a></td>
<td><a href="#">删除</a></td>
</tr>
</c:forEach>
<tr>添加图书功能的实现
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td><a href="/pages/manager/book_edit.jsp">添加图书</a></td>
</tr>
</table>
5.2、前后台的简单介绍
为什么配置文件url-pattern要加/manager
5.3、添加图书功能的实现
1、添加图书流程细节
2、问题说明:表单重复提交
当用户提交完请求,浏览器会记录下最后一次请求的全部信息。当用户按下功能键 F5,就会发起浏览器记录的最后一次 请求。
请求转发是一次请求,地址映射到http://localhost:8080/工程名/下的web,重定向是两次请求,且地址映射到http://localhost:8080/
3、BookServlet 程序中添加 add 方法
protected void addBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数==封装成为Book对象
Book book = WebUtils.copyParamToBean(req.getParameterMap(),new Book());
// 2、调用BookService.addBook()保存图书
bookService.addBook(book);
// 3、跳到图书列表页面
// 当用户提交完请求,浏览器会记录下最后一次请求的全部信息。当用户按下功能键 F5,就会发起浏览器记录的最后一次 请求。
// 请求转发是一次请求,地址映射到http://localhost:8080/工程名/下的web,重定向是两次请求,且地址映射到http://localhost:8080/
// /manager/bookServlet?action=list
// req.getRequestDispatcher("manager/bookServlet?action=list").forward(req,resp);
// getContextPath():取得工程名路径
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
}
4、修改 book_edit.jsp 页面
<div id="main">
<form action="manager/bookServlet" method="get">
<input type="hidden" name="action" value="addBook">
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<tr>
<td><input name="bookName" type="text" value="安徒生童话"/></td>
<td><input name="price" type="text" value="29.9"/></td>
<td><input name="author" type="text" value="安徒生"/></td>
<td><input name="sales" type="text" value="1000"/></td>
<td><input name="stock" type="text" value="50"/></td>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
5.4、删除图书功能的实现
1、图解删除流程:
2、BookServlet 程序中的 delete方法:
protected void deleteBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数id,图书编程
int id = WebUtils.parseInt(req.getParameter("id"), 0);
// 2、调用bookService.deleteBookById();删除图书
bookService.deleteBookById(id);
// /book/manager/bookServlet?action=list
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
}
3、给 WebUtils 工具类添加转换 int 类型的工具方法
/**
* 将字符串变为整型
* @param str 要转换的字符串
* @param defaultValue 转换不成功给其默认值
* @return 转换后的数据
*/
public static int parseInt(String str,int defaultValue){
try {
return Integer.parseInt(str);
} catch (NumberFormatException e) {
e.printStackTrace();
}
return defaultValue;
}
4、修改删除的连接地址:
${book.stock} 修改 删除 ### 5、给删除添加确认提示操作:<script type="text/javascript">
$(function () {
// 给删除的a标签绑定单击事件,用于删除的确认提示操作
$(".deleteClass").click(function () {
// 在事件的function函数中,一个this对象。这个this对象,是当前正在响应事件的dom对象。
/**
* confirm是确认提示框函数
* 参数是它的提示内容
* 它两个钮,一个确认,一个是取消。
* 返回true表示点击了,确认,返回false表示点击取消。
*/
return confirm("你确认删除" + $(this).parent().parent().find("td:first").text() + "吗?");
});
});
</script>
5.5、修改图书功能的实现
1:图解修改图书细节
2、更新【修改】的请求地址
<td>${book.stock}</td>
<td><a href="manager/bookServlet?action=getBook&id=${book.id}">修改</a></td>
3、BookServlet 程序中添加 getBook 方法:
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);
}
4、解决 book_edit.jsp 页面,即要实现添加,又要实现修改操作。
方法一:
book_manager.jsp页面:
book_edit.jsp页面:
方法二:
book_edit.jsp页面:
<form action="manager/bookServlet" method="get">
<%-- <input type="hidden" name="action" value="${param.method}">--%>
<input type="hidden" name="action" value="${empty param.id ? "addBook" : "updateBook"}">
<input type="hidden" name="id" value="${requestScope.book.id}">
方法三:
book_edit.jsp页面:
<input type="hidden" name="action" value="${empty requestScope.book? "addBook" : "updateBook"}">
5、在 BookServlet 程序中添加 update 方法:
protected void updateBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数id,图书编程
Book book = WebUtils.copyParamToBean(req.getParameterMap(), new Book());
// 2、调用bookService.deleteBookById();删除图书
bookService.updateBook(book);
// /MyBookStore/manager/bookServlet?action=list
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
}