一. 储备知识
实现管理员修改图书的功能的设计思想:
1.1 在book_manager.jsp页面中点击修改超链接应将修改标签所在的图书数据(包括id)携带到book_edit.jsp
(1)方案1:将图书数据拼接在修改超链接后
(2)方案2:修改超链接提交请求给BookManagerServlet并且提交要修改图书的id,BookManagerServlet根据id查询要修改的图书对象然后存到域中,再转发到book_edit.jsp
- BookManagerServlet中提供根据id查询图书对象的请求方法[getBook()]
- 在BookService中提供查询图书的业务方法[Book getBook(String bookId)]
- 在book_edit.jsp页面中获取要修改的图书数据显示
- 修改book_manager.jsp页面中的修改超链接
1.2 book_edit.jsp页面中用户修改了图书数据后点击提交请求给BookManagerServlet处理(updateBook)
- 在BookManagerServlet中提供修改图书数据的请求方法[updateBook()]
- 修改book_edit.jsp表单提交的地址为BookManagerServlet
1.3 BookService中提供根据id修改图书的业务方法
- 在BookService中提供处理修改图书的业务方法[updateBook()]
二. 源码例子
BookManagerServlet.java
package com.atguigu.bookstore.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import com.atguigu.bookstore.bean.Book;
import com.atguigu.bookstore.service.BookService;
import com.atguigu.bookstore.service.impl.BookServiceImpl;
import com.atguigu.bookstore.utils.WebUtils;
/**
* Servlet implementation class BookManagerServlet
*/
public class BookManagerServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
private BookService service = new BookServiceImpl();
/**
* 处理修改图书的请求
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void updateBook(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取修改后的图书数据
Book book = WebUtils.params2Bean(new Book(), request);//book的id在数据库中一定会对应一本图书
//2.调用service处理修改业务
boolean b = service.updateBook(book);
//3.根据处理结果给用户响应
//跳转到图书显示的页面
response.sendRedirect(request.getContextPath()+"/BookManagerServlet?type=getAllBooks");
}
/**
* 查询指定图书
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void getBook(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
//1.获取请求参数
String bookId = request.getParameter("bookId");
//2.调用service处理业务
Book book = service.getBook(bookId);
//3.将book对象存到域中共享
request.setAttribute("book", book);
//4.转发到修改图书的页面
request.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(request, response);
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void getAllBooks(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//1.获取请求参数
//2.调用其他类处理业务
List<Book> list = service.getAllBooks();
//将数据存到域中共享
request.setAttribute("list", list);
//3.给用户响应[转发(使用request域进行转发)、重定向、response对象向响应体写入内容]
//将集合数据交给book_manager.jsp页面显示
//转发到book_manager.jsp
request.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(request, response);
}
}
BookService.java
package com.atguigu.bookstore.service;
import java.util.List;
import com.atguigu.bookstore.bean.Book;
import com.atguigu.bookstore.bean.Page;
/**
* 规定对图书操作的业务方法
* @author user
*
*/
public interface BookService {
/**
* 查询所有的图书集合
*/
List<Book> getAllBooks();
/**
* 删除图书的业务方法
* @return
*/
boolean deleteBook(String bookId);
/**
* 添加图书的业务方法
*/
boolean addBook(Book book);
/**
* 查询指定图书的业务方法
* @return
*/
Book getBook(String bookId);
/**
* 修改指定图书数据的方法
* book参数,携带了id和修改后的图书数据
* @return
*/
boolean updateBook(Book book);
/**
* 查询分页的业务方法
* @param pageNumber
* @param size
* @return
*/
Page<Book> getPage(String pageNumber, int size);
}
BookServiceImpl.java
package com.atguigu.bookstore.dao.impl;
import java.util.List;
import com.atguigu.bookstore.bean.Book;
import com.atguigu.bookstore.bean.Page;
import com.atguigu.bookstore.dao.BaseDao;
import com.atguigu.bookstore.dao.BookDao;
public class BookDaoImpl extends BaseDao implements BookDao{
@Override
public List<Book> getAllBooks() {
// TODO Auto-generated method stub
String sql = "select id, title, author, price, sales, stock, img_path imgPath"
+ " from book";
return getBeanList(Book.class, sql);
}
@Override
public Book getBookById(String bookId) {
// TODO Auto-generated method stub
String sql = "select id, title, author, price, sales, stock, img_path imgPath"
+ " from book where id = ?";
return getBean( Book.class, sql, bookId);
}
@Override
public int saveBook(Book book) {
// TODO Auto-generated method stub
String sql = "insert into book(title, author, price, sales, stock, "
+ "img_path ) values(?, ?, ?, ?, ?, ?)";
return update(sql, book.getTitle(), book.getAuthor(), book.getPrice(), book.getSales(),
book.getStock(), book.getImgPath());
}
@Override
public int updateBookById(Book book) {
// TODO Auto-generated method stub
String sql = "update book set title=?, author=?, price=?, sales=?, stock=?,"
+ " img_path=? where id = ?";
return update(sql, book.getTitle(), book.getAuthor(), book.getPrice(), book.getSales(),
book.getStock(), book.getImgPath(), book.getId());
}
}
book_manager.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
<%@ include file="/WEB-INF/include/base.jsp" %>
<script type="text/javascript">
/*给删除超链接绑定删除事件*/
$(function(){
$(".delA").click(function(){
//由于a标签遍历显示图书时会产生多个,所以不能使用id属性
//获取被点击的a标签所在行的第一个单元格的文本内容,即a标签的爹(td标签)的爹(tr标签)的第一个儿子(即tr中的第一个td标签)
//this为a标签的dom对象,$(this)为将dom对象转换为jquery对象
var title = $(this).parents("tr").children("td:eq(0)").text();
if(! confirm("你真的要删除《" + title + "》吗?")){
//取消删除,阻止a标签的默认行为
return false;
}
});
});
</script>
</head>
<body>
<div id="header">
<div class="logo_content">
<div class="logo_img">
<img src="static/img/baozhatanglogo.jpg" alt="" width="30px">
</div>
<span>欢迎来到一流爆炸糖书城</span>
</div>
<div class="header_content">
<a href="">设置</a> |
<a href="">退出</a>
</div>
</div>
<div id="main">
<c:choose>
<c:when test="${empty requestScope.list }">
<%-- ${empty requestScope.list } 判断查询所有的图书集合 --%>
<h3 style="color:red; text-align:center; margin-top: 150px;">没有图书数据!赶紧去添加吧!<a href="pages/manager/book_add.jsp">添加图书</a></h3>
</c:when>
<c:otherwise>
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<!-- 遍历图书集合,每本图书数据对应一行显示 -->
<c:forEach items="${list }" var="book">
<td>${book.title }</td>
<td>${book.price }</td>
<td>${book.author }</td>
<td>${book.sales }</td>
<td>${book.stock }</td>
<td><a href="BookManagerServlet?type=getBookbookId=${book.id }">修改</a></td>
<td><a class="delA" href="BookManagerServlet?type=deleteBook&bookId=${book.id }">删除</a></td>
</c:forEach>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td><a href="pages/manager/book_add.jsp">添加图书</a></td>
</tr>
</table>
</c:otherwise>
</c:choose>
</div>
<div id="bottom">
<span>
一流爆炸糖书城.Copyright ©2019
</span>
</div>
</body>
</html>
book_edit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>编辑图书</title>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/baozhatanglogo.jpg" >
<span class="wel_word">编辑图书</span>
<%@ include file="/WEB-INF/include/manager_header.jsp" %>
</div>
<div id="main">
<form action="BookManagerServlet" method="post">
<input type="hidden" name="type" value="updateBook">
<!-- 通过隐藏域将数据交给服务器的updateBook方法 -->
<input type="hidden" name="ref" value="${ref }">
<!-- 修改图书数据时需要使用图书id name属性值必须和Book类的属性一样-->
<input type="hidden" name="id" value="${requestScope.book.id }">
<input type="hidden" name="imgPath" value="${requestScope.book.imgPath }">
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<tr>
<td><input name="title" type="text" value="${requestScope.book.title }"></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>
</table>
</form>
</div>
<div id="bottom">
<span>
一流爆炸糖书城.Copyright ©2019
</span>
</div>
</body>
</html>