书城项目第五阶段-图书模块
- 书城项目
- 页面样式
- 后台管理
- 图书管理
- 添加图书
- 修改图书
- 第五阶段
- 1、MVC概念
- 书城第五阶段
- 1、图书模块
- 1.1、编写图书模块的数据库表
- 1.2、编写图书模块的JavaBean
- Book pojo包下
- 1.3、编写图书模块的Dao和测试Dao
- BookDao dao包下
- BookDaoImpl dao/impl包下
- BookDaoTest test包下
- 1.4、编写图书模块的Service和测试Service
- BookService service包下
- BookServiceImpl service/impl下
- BookServiceTest test包下
- 1.5、编写图书模块的Web层,和页面联调测试
- 1.5.1、图书列表功能的实现
- 1、图解列表流程
- 2 BookServlet web包下
- 在web.xml下配置
- 3 修改book_manager.jsp
- 4 修改manager_menu.jsp
- 增加语句 BaseServlet
- 1.5.2、前后台的简单介绍
- 1.5.3、添加图书功能的实现
- 修改 book_edit.jsp
- 增加语句 BookServlet
- 1.5.4、删除图书功能的实现
- 修改 book_manager.jsp
- 增加语句 WebUtils
- 增加语句 BookServlet
- 1.5.5、修改图书信息
- 第一步 回显修改的信息
- 修改 book_manager.jsp
- 修改 book_edit.jsp
- 增加语句 BookServlet
- 第二步 提交给服务器保存修改
- 修改 book_manager.jsp
- 修改 book_edit.jsp
- 增加语句 BookServlet
书城项目
页面样式
后台管理
图书管理
添加图书
修改图书
第五阶段
1、MVC概念
MVC全称:Model模型、View视图、Controller 控制器。
MVC最早出现在JavaEE三层中的Web层,它可以有效的指导Web层的代码如何有效分离,单独工作。
View视图:只负责数据和界面的显示,不接受任何与显示数据无关的代码,便于程序员和美工的分工合作一一JSP/HTML。
Controller控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面,是一个“调度者”的角色-一Servlet。
转到某个页面。或者是重定向到某个页面。
Model模型:将与业务逻辑相关的数据封装为具体的JavaBean类,其中不掺杂任何与数据处理相关的代码一一JavaBean/domain/entity/pojo。
MVC是一种思想
MVC的理念是将软件代码拆分成为组件,单独开发,组合使用(目的还是为了降低耦合度) 。
MVC的作用还是为了降低耦合。让代码合理分层。方便后期升级和维护。
书城第五阶段
1、图书模块
1.1、编写图书模块的数据库表
create table t_book(
id int primary key auto_increment,
name varchar(100),
price decimal(11,2),
author varchar(100),
sales int,
stock int,
img_path varchar(200),
);
insert into t_book(id ,name,author,price,sales,stock,img_path)values(null,'java从入门到放弃','国哥',80,9999 ,9,'static/img/default.jpg');
insert into t_book(id ,name,author,price,sales,stock,img_path)values(null,'怎样拐跑别人的媳妇','龙伍', 68,99999,52 ,'static/img/default.jpg');
insert into t_book(id ,name,author,price,sales,stock,img_path)values(null,'C++编程思想','刚哥' , 68,99989,52,'static/img/default.jpg');
1.2、编写图书模块的JavaBean
Book pojo包下
package com.atguigu.pojo;
import java.math.BigDecimal;
public class Book {
private Integer id;
private String name;
private String author;
private BigDecimal price;
private Integer sales;
private Integer stock;
private String imgPath="static/img/default.jpg";
public Book() {
}
public Book(Integer id, String name, String author, BigDecimal price, Integer sales, Integer stock, String imgPath) {
this.id = id;
this.name = name;
this.author = author;
this.price = price;
this.sales = sales;
this.stock = stock;
//要求给定的图书封面图片路径不能为空
if (imgPath!=null&& !"".equals(imgPath)){
this.imgPath = imgPath;
}
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getSales() {
return sales;
}
public void setSales(Integer sales) {
this.sales = sales;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public String getImgPath() {
return imgPath;
}
public void setImgPath(String imgPath) {
//要求给定的图书封面图片路径不能为空
if (imgPath!=null&& !"".equals(imgPath)){
this.imgPath = imgPath;
}
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", sales=" + sales +
", stock=" + stock +
", imgPath='" + imgPath + '\'' +
'}';
}
}
1.3、编写图书模块的Dao和测试Dao
BookDao dao包下
package com.atguigu.dao;
import com.atguigu.pojo.Book;
import java.util.List;
public interface BookDao {
//Ctrl+Shift+T
public int addBook(Book book);
public int deleteBook(Integer id );
public int updateBook(Book book);
public Book queryBookById(Integer id);
public List<Book> queryBooks();
}
BookDaoImpl dao/impl包下
package com.atguigu.dao.impl;
import com.atguigu.dao.BookDao;
import com.atguigu.pojo.Book;
import java.util.List;
public class BookDaoImpl extends BaseDao implements BookDao {
@Override
public int addBook(Book book) {
String sql="insert into t_book(name,author,price,sales,stock,img_path) values(?,?,?,?,?,?)";
return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath());
}
@Override
public int deleteBook(Integer id) {
String sql="delete from t_book where id=?";
return update(sql,id);
}
@Override
public int updateBook(Book book) {
String sql ="update t_book set name=?,author=?,price=?,sales=?,stock=?,img_path=? where id=?";
return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath(),book.getId());
}
@Override
public Book queryBookById(Integer id) {
String sql="select id,name,author,price,sales,stock,img_path imgPath from t_book where id=?";
return queryForOne(Book.class,sql,id);
}
@Override
public List<Book> queryBooks() {
String sql="select id,name,author,price,sales,stock,img_path imgPath from t_book";
return queryForList(Book.class,sql);
}
}
BookDaoTest test包下
package com.atguigu.test;
import com.atguigu.dao.BookDao;
import com.atguigu.dao.impl.BookDaoImpl;
import com.atguigu.pojo.Book;
import org.junit.Test;
import java.math.BigDecimal;
public class BookDaoTest {
private BookDao bookDao=new BookDaoImpl();
@Test
public void addBook() {
bookDao.addBook(new Book(null,"我为什么这么帅!","191125",new BigDecimal(9999),1100000,0,null));
}
//最后测试
@Test
public void deleteBook() {
bookDao.deleteBook(4);
}
@Test
public void updateBook() {
bookDao.updateBook(new Book(4,"我们都很帅!","191125",new BigDecimal(9999),1100000,0,null));
}
@Test
public void queryBookById() {
System.out.println(bookDao.queryBookById(4));
}
@Test
public void queryBooks() {
for (Book queryBook: bookDao.queryBooks()) {
System.out.println(queryBook);
}
}
}
1.4、编写图书模块的Service和测试Service
BookService service包下
package com.atguigu.service;
import com.atguigu.pojo.Book;
import java.util.List;
public interface BookService {
//Ctrl+Shift+T
public void addBook(Book book);
public void deleteBookById(Integer id);
public void updateBook(Book book);
public Book queryBookById(Integer id);
public List<Book> queryBooks();
}
BookServiceImpl service/impl下
package com.atguigu.service.impl;
import com.atguigu.dao.BookDao;
import com.atguigu.dao.impl.BookDaoImpl;
import com.atguigu.pojo.Book;
import com.atguigu.service.BookService;
import java.util.List;
public class BookServiceImpl implements BookService {
private BookDao bookDao=new BookDaoImpl();
@Override
public void addBook(Book book) {
bookDao.addBook(book);
}
@Override
public void deleteBookById(Integer id) {
bookDao.deleteBook(id);
}
@Override
public void updateBook(Book book) {
bookDao.updateBook(book);
}
@Override
public Book queryBookById(Integer id) {
return bookDao.queryBookById(id);
}
@Override
public List<Book> queryBooks() {
return bookDao.queryBooks();
}
}
BookServiceTest test包下
package com.atguigu.test;
import com.atguigu.pojo.Book;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import org.junit.Test;
import java.math.BigDecimal;
import static org.junit.Assert.*;
public class BookServiceTest {
private BookService bookService=new BookServiceImpl();
@Test
public void addBook() {
bookService.addBook(new Book(null,"天下我有!","1125",new BigDecimal(999),10000,0,null));
}
//最后测试
@Test
public void deleteBookById() {
bookService.deleteBookById(5);
}
@Test
public void updateBook() {
bookService.updateBook(new Book(5,"天下都有!","1125",new BigDecimal(999),10,9999,null));
}
@Test
public void queryBookById() {
System.out.println(bookService.queryBookById(5));
}
@Test
public void queryBooks() {
for (Book queryBook:bookService.queryBooks()) {
System.out.println(queryBook);
}
}
}
1.5、编写图书模块的Web层,和页面联调测试
1.5.1、图书列表功能的实现
1、图解列表流程
注意访问顺序 首页–》后台管理–》图书管理,不能直接访问图书管理,无数据
2 BookServlet web包下
package com.atguigu.web;
import com.atguigu.pojo.Book;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class BookServlet extends BaseServlet {
private BookService bookService=new BookServiceImpl();
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
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.xml下配置
<servlet>
<servlet-name>BookServlet</servlet-name>
<servlet-class>com.atguigu.web.BookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BookServlet</servlet-name>
<url-pattern>/manager/bookServlet</url-pattern><!-- /manager方便管理 -->
</servlet-mapping>
3 修改book_manager.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.: lenovo
Date: 2021/8/21
Time: 下午 02:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
<%--静态包含 base标签,css样式,jquery文件 --%>
<%@ include file="/pages/common/head.jsp"%>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="../../static/img/logo.gif"> <span class="wel_word">图书管理系统</span>
<%-- 静态包含manager 管理模块的菜单 --%>
<%@ include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<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.name}</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>
</div>
<%--静态包含页脚内容--%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
4 修改manager_menu.jsp
<%--
Created by IntelliJ IDEA.: lenovo
Date: 2021/8/21
Time: 下午 05:38
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div>
<a href="manager/bookServlet?action=list">图书管理</a>
<a href="order_manager.jsp">订单管理</a>
<a href="../../index.jsp">返回商城</a>
</div>
增加语句 BaseServlet
package com.atguigu.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action=req.getParameter("action");
// System.out.println(action);
//action的value和调用的方法名是统一的
// if ("login".equals(action)){
System.out.println("处理登录的需求");
// login(req,resp);
// }else if ("regist".equals(action)){
System.out.println("处理注册的需求");
// regist(req,resp);
// }
//反射
try {
//获取action业务鉴别字符串,获取相应的业务方法 反射对象
Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
//调用目标业务方法
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.5.2、前后台的简单介绍
1.5.3、添加图书功能的实现
修改 book_edit.jsp
<%--
Created by IntelliJ IDEA.: lenovo
Date: 2021/8/21
Time: 下午 02:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>编辑图书</title>
<%--静态包含 base标签,css样式,jquery文件 --%>
<%@ include file="/pages/common/head.jsp"%>
<style type="text/css">
h1 {
text-align: center;
margin-top: 200px;
}
h1 a{
color:red;
}
input {
text-align: center;
}
</style>
<body>
<div id="header">
<img class="logo_ing" alt="" arc="../../static/1mg/logo.gif">
<span class="wel_word">编辑图书</span>
<%-- 静态包含manager 管理模块的菜单 --%>
<%@ include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<form action="manager/bookServlet" method="get">
<input type="hidden" name="action" value="add"/>
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<tr>
<td><input name="name" type="text" value="时间简史"/></td>
<td><input name="price" type="text" value="30.00"/></td>
<td><input name="author" type="text" value="霍金"/></td>
<td><input name="sales" type="text" value="200"/></td>
<td><input name="stock" type="text" value="300"/></td>
<td><input type= "submit" value="提交"/></td>
</tr>
</table>
</form>
</div>
<%--静态包含页脚内容--%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
增加语句 BookServlet
package com.atguigu.web;
import com.atguigu.pojo.Book;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class BookServlet extends BaseServlet {
private BookService bookService=new BookServiceImpl();
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数==封装成为Book对象
Book book= WebUtils.copyParamToBean(req.getParameterMap(),new Book());
// 2、调用BookService.addBook0保存图书
bookService.addBook(book);
// 3、跳到图书列表页面
// /manager/bookServlet?action=list
// req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);//请求转发有bug
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");//重定向
}
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
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);
}
}
1.5.4、删除图书功能的实现
修改 book_manager.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2021/8/21
Time: 下午 02:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
<%--静态包含 base标签,css样式,jquery文件 --%>
<%@ include file="/pages/common/head.jsp"%>
<script type="text/javascript">//给删除的a标签绑定单击事件,用于删除的确认提示操作
$(function (){
$("a.deleteClass").click(function (){
// 在事件的fuction函数中,有一个this对象。这个this对象,是当前正在响应事件的dom对象。
/**
* confirm是确认提示框函数
* 参数是它的提示内容
* 他有两个按钮,一个确认,一个是取消。
* 返回true表示点击了,确认,返回false表示点击取消。
*/
return confirm("你确定要删除【"+$(this).parent().parent().find("td:first").text()+"】?");
// return false;//阻止元素的默认行为===不提交请求
});
});</script>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="../../static/img/logo.gif"> <span class="wel_word">图书管理系统</span>
<%-- 静态包含manager 管理模块的菜单 --%>
<%@ include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<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.name}</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 class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}">删除</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>
</div>
<%--静态包含页脚内容--%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
增加语句 WebUtils
package com.atguigu.utils;
import org.apache.commons.beanutils.BeanUtils;
import java.util.Map;
public class WebUtils {
/**
* 把Map中的值注入到对应的JavaBean属性中
* @param value
* @param bean
*
* HttpServletRequest
* Dao层
* Service层
* web层 耦合度高
*
*/
// public static void copyParamToBean(HttpServletRequest req,Object bean ){
public static <T> T copyParamToBean(Map value, T bean ){
try {
System.out.println("注入之前:"+bean);
/**
* 把所有请求的参数都注入到user对象中
*/
BeanUtils.populate(bean,value);//出现NoClassDefFoundError错误导入commons-collections3.x.jar,4.x不行
System.out.println("注入之后:"+bean);
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
/**
* 将字符串转换成为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;
}
}
增加语句 BookServlet
package com.atguigu.web;
import com.atguigu.pojo.Book;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class BookServlet extends BaseServlet {
private BookService bookService=new BookServiceImpl();
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数==封装成为Book对象
Book book= WebUtils.copyParamToBean(req.getParameterMap(),new Book());
// 2、调用BookService.addBook0保存图书
bookService.addBook(book);
// 3、跳到图书列表页面
// /manager/bookServlet?action=list
// req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);//请求转发有bug
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");//重定向
}
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数id,图书编程
int id=WebUtils.parseInt(req.getParameter("id"),0);
// 2、调用bookService.deleteBookById();删除图书
bookService.deleteBookById(id);
// 3、重定向回图书列表管理页西
// /book/manager/bookServlet?action=list
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
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);
}
}
1.5.5、修改图书信息
第一步 回显修改的信息
修改 book_manager.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2021/8/21
Time: 下午 02:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
<%--静态包含 base标签,css样式,jquery文件 --%>
<%@ include file="/pages/common/head.jsp"%>
<script type="text/javascript">//给删除的a标签绑定单击事件,用于删除的确认提示操作
$(function (){
$("a.deleteClass").click(function (){
// 在事件的fuction函数中,有一个this对象。这个this对象,是当前正在响应事件的dom对象。
/**
* confirm是确认提示框函数
* 参数是它的提示内容
* 他有两个按钮,一个确认,一个是取消。
* 返回true表示点击了,确认,返回false表示点击取消。
*/
return confirm("你确定要删除【"+$(this).parent().parent().find("td:first").text()+"】?");
// return false;//阻止元素的默认行为===不提交请求
});
});</script>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="../../static/img/logo.gif"> <span class="wel_word">图书管理系统</span>
<%-- 静态包含manager 管理模块的菜单 --%>
<%@ include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<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.name}</td>
<td>${book.price}</td>
<td>${book.author}</td>
<td>${book.sales}</td>
<td>${book.stock}</td>
<td><a href="manager/bookServlet?action=getBook&id=${book.id}">修改</a> </td>
<td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}">删除</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>
</div>
<%--静态包含页脚内容--%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
修改 book_edit.jsp
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2021/8/21
Time: 下午 02:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>编辑图书</title>
<%--静态包含 base标签,css样式,jquery文件 --%>
<%@ include file="/pages/common/head.jsp"%>
<style type="text/css">h1 {
text-align: center;
margin-top: 200px;
}
h1 a{
color:red;
}
input {
text-align: center;
}</style>
<body>
<div id="header">
<img class="logo_ing" alt="" arc="../../static/1mg/logo.gif">
<span class="wel_word">编辑图书</span>
<%-- 静态包含manager 管理模块的菜单 --%>
<%@ include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<form action="manager/bookServlet" method="get">
<input type="hidden" name="action" value="add"/>
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<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>
</table>
</form>
</div>
<%--静态包含页脚内容--%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
增加语句 BookServlet
package com.atguigu.web;
import com.atguigu.pojo.Book;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class BookServlet extends BaseServlet {
private BookService bookService=new BookServiceImpl();
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数==封装成为Book对象
Book book= WebUtils.copyParamToBean(req.getParameterMap(),new Book());
// 2、调用BookService.addBook0保存图书
bookService.addBook(book);
// 3、跳到图书列表页面
// /manager/bookServlet?action=list
// req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);//请求转发有bug
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");//重定向
}
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数id,图书编程
int id=WebUtils.parseInt(req.getParameter("id"),0);
// 2、调用bookService.deleteBookById();删除图书
bookService.deleteBookById(id);
// 3、重定向回图书列表管理页西
// /book/manager/bookServlet?action=list
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
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);
}
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);
}
}
第二步 提交给服务器保存修改
修改 book_manager.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2021/8/21
Time: 下午 02:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
<%--静态包含 base标签,css样式,jquery文件 --%>
<%@ include file="/pages/common/head.jsp"%>
<script type="text/javascript">//给删除的a标签绑定单击事件,用于删除的确认提示操作
$(function (){
$("a.deleteClass").click(function (){
// 在事件的fuction函数中,有一个this对象。这个this对象,是当前正在响应事件的dom对象。
/**
* confirm是确认提示框函数
* 参数是它的提示内容
* 他有两个按钮,一个确认,一个是取消。
* 返回true表示点击了,确认,返回false表示点击取消。
*/
return confirm("你确定要删除【"+$(this).parent().parent().find("td:first").text()+"】?");
// return false;//阻止元素的默认行为===不提交请求
});
});</script>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="../../static/img/logo.gif"> <span class="wel_word">图书管理系统</span>
<%-- 静态包含manager 管理模块的菜单 --%>
<%@ include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<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.name}</td>
<td>${book.price}</td>
<td>${book.author}</td>
<td>${book.sales}</td>
<td>${book.stock}</td>
<td><a href="manager/bookServlet?action=getBook&id=${book.id}">修改</a> </td>
<%-- <td><a href="manager/bookServlet?action=getBook&id=${book.id}&method=update">修改</a> </td> <!---方案一 ---> --%>
<td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}">删除</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>
<%-- <td><a href="pages/manager/book_edit.jsp?method=add">添加图书</a> </td> <!---方案一 ---> --%>
</tr>
</table>
</div>
<%--静态包含页脚内容--%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
修改 book_edit.jsp
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2021/8/21
Time: 下午 02:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>编辑图书</title>
<%--静态包含 base标签,css样式,jquery文件 --%>
<%@ include file="/pages/common/head.jsp"%>
<style type="text/css">h1 {
text-align: center;
margin-top: 200px;
}
h1 a{
color:red;
}
input {
text-align: center;
}</style>
<body>
<%-- 是否添加操作:${empty param.id?"add":"update"} <!---方案二 ---> --%>
<%-- 是否添加操作:${empty requestScope.book?"add":"update"} <!---方案三 ---> --%>
<div id="header">
<img class="logo_ing" alt="" arc="../../static/1mg/logo.gif">
<span class="wel_word">编辑图书</span>
<%-- 静态包含manager 管理模块的菜单 --%>
<%@ include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<form action="manager/bookServlet" method="get">
<%-- <input type="hidden" name="action" value="add"/> --%>
<%-- <input type="hidden" name="action" value="${param.method}"/> <!---方案一 ---> --%>
<%-- <input type="hidden" name="action" value="${empty param.id?"add":"update"}"/> <!---方案二 ---> --%>
<input type="hidden" name="action" value="${empty requestScope.book?"add":"update"}"/><!---方案三 --->
<input type="hidden" name="id" value="${requestScope.book.id}"/>
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<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>
</table>
</form>
</div>
<%--静态包含页脚内容--%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
增加语句 BookServlet
package com.atguigu.web;
import com.atguigu.pojo.Book;
import com.atguigu.service.BookService;
import com.atguigu.service.impl.BookServiceImpl;
import com.atguigu.utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class BookServlet extends BaseServlet {
private BookService bookService=new BookServiceImpl();
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数==封装成为Book对象
Book book= WebUtils.copyParamToBean(req.getParameterMap(),new Book());
// 2、调用BookService.addBook0保存图书
bookService.addBook(book);
// 3、跳到图书列表页面
// /manager/bookServlet?action=list
// req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);//请求转发有bug
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");//重定向
}
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数id,图书编程
int id=WebUtils.parseInt(req.getParameter("id"),0);
// 2、调用bookService.deleteBookById();删除图书
bookService.deleteBookById(id);
// 3、重定向回图书列表管理页西
// /book/manager/bookServlet?action=list
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}
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、重定向回图书列表管理页面
// 地址:/工程名/manager/bookServlet?action=list
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}
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);
}
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);
}
}