学习笔记四

学习笔记四:
书城项目3:

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、编写图书模块的数据库表

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 , '数据结构与算法' , '严敏君' , 78.5 , 6 , 13 , '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 , '木虚肉盖饭' , '小胖' , 16, 1000 , 50 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , 'C++编程思想' , '刚哥' , 45.5 , 14 , 95 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , '蛋炒饭' , '周星星' , 9.9, 12 , 53 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , '赌神' , '龙伍' , 66.5, 125 , 535 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , 'Java 编程思想' , '阳哥' , 99.5 , 47 , 36 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , 'JavaScript 从入门到精通' , '婷姐' , 9.9 , 85 , 95 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , 'cocos2d-x 游戏编程入门' , '国哥' , 49, 52 , 62 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , 'C 语言程序设计' , '谭浩强' , 28 , 52 , 74 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , 'Lua 语言程序设计' , '雷丰阳' , 51.5 , 48 , 82 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , '西游记' , '罗贯中' , 12, 19 , 9999 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , '水浒传' , '华仔' , 33.05 , 22 , 88 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , '操作系统原理' , '刘优' , 133.05 , 122 , 188 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , '数据结构 java 版' , '封大神' , 173.15 , 21 , 81 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , 'UNIX 高级环境编程' , '乐天' , 99.15 , 210 , 810 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , 'javaScript 高级编程' , '国哥' , 69.15 , 210 , 810 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , '大话设计模式' , '国哥' , 89.15 , 20 , 10 , 'static/img/default.jpg');
insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
values(null , '人月神话' , '刚哥' , 88.15 , 20 , 80 , 'static/img/default.jpg');

查看表内容:

select id,name,author,price,sales,stock,img_path from t_book;

1.2、编写图书模块的 JavaBean:

package com.zy.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/跑.jpg";
	
	public Book(Integer id, String name, String author, BigDecimal price, Integer sales, Integer stock,
			String imgPath) {
		super();
		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 Book() {
		super();
	}

	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:

Dao 接口:

package com.zy.dao;

import java.util.List;

import com.zy.pojo.Book;

public interface BookDao {

    public int addBook(Book book);

    public int deleteBookById(Integer id);

    public int updateBook(Book book);

    public Book queryBookById(Integer id);

    public List<Book> queryBooks();

}

BookDaoImpl 实现类:

package com.zy.dao;

import java.util.List;

import com.zy.pojo.Book;

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 deleteBookById(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);
    }
}

BookDao 的测试:

package com.zy.test;

import static org.junit.Assert.*;

import java.math.BigDecimal;

import org.junit.Test;

import com.zy.dao.BookDao;
import com.zy.dao.BookDaoImpl;
import com.zy.pojo.Book;

public class BookDaoTest {

	private BookDao bookDao = new BookDaoImpl();
	@Test
	public void testAddBook() {
		bookDao.addBook(new Book(null,"坚强捡屎","宇哥",new BigDecimal(188),250,9999,null));
	}

	@Test
	public void testDeleteBookById() {
		bookDao.deleteBookById(22);
	}

	@Test
	public void testUpdateBook() {
		bookDao.updateBook(new Book(23,"涛涛回首一掏!", "宇哥", new BigDecimal(188),250,10000,null));
	}

	@Test
	public void testQueryBookById() {
		System.out.println(bookDao.queryBookById(21));
	}

	@Test
	public void testQueryBooks() {
		for(Book queryBook : bookDao.queryBooks()) {
			System.out.println(queryBook);
		}
	}

}

1.4、编写图书模块的 Service 和测试 Service:

BookService 接口:

package com.zy.service;

import java.util.List;

import com.zy.pojo.Book;

public interface BookService {

    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 实现类:

package com.zy.service;

import java.util.List;

import com.zy.dao.BookDao;
import com.zy.dao.BookDaoImpl;
import com.zy.pojo.Book;

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.deleteBookById(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();
    }
}

BookService 的测试:

package com.zy.test;

import static org.junit.Assert.*;

import java.math.BigDecimal;

import org.junit.Test;

import com.zy.pojo.Book;
import com.zy.service.BookService;
import com.zy.service.BookServiceImpl;

public class BookServiceTest {
    
	private BookService bookService = new BookServiceImpl();
	@Test
	public void testAddBook() {
		bookService.addBook(new Book(null,"葵花宝典!", "坚强", new BigDecimal(1000000),100000000, 0, null));
	}

	@Test
	public void testDeleteBookById() {
		bookService.deleteBookById(19);
	}

    @Test
	public void testUpdateBook() {
		bookService.updateBook(new Book(21,"宇哥为什么这这么帅!", "sb", new BigDecimal(999999),10, 111110, null));
	}

	@Test
	public void testQueryBookById() {
		System.out.println(bookService.queryBookById(24));
	}

	@Test
	public void testQueryBooks() {
		for (Book queryBook : bookService.queryBooks()) {
			System.out.println(queryBook);
			}
	}

}

1.5、编写图书模块的 Web 层,和页面联调测试:

1.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/book_manager.jsp").forward(req, resp);
	}

3、修改【图书管理】请求地址:

<a href="bookServlet?action=list">图书管理</a>

4、修改 pages/book_manager.jsp 页面的数据遍历输出:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>宇哥的图书管理</title>
    <%
      String basePath = request.getScheme()
             + "://"
             + request.getServerName()
             + ":"
             + request.getServerPort()
             + request.getContextPath()
             + "/";
    %>
    <!--写 base 标签,永远固定相对路径跳转的结果-->
    <base href="<%=basePath%>">
    <script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
    <script type="text/javascript">
    $(function () {
    	// 给删除的 a 标签绑定单击事件,用于删除的确认提示操作
		$("a.deleteClass").click(function () {
			// 在事件的 function 函数中,有一个 this 对象。这个 this 对象,是当前正在响应事件的 dom 对象。
			/**
			* confirm 是确认提示框函数
			* 参数是它的提示内容
			* 它有两个按钮,一个确认,一个是取消。
			* 返回 true 表示点击了,确认,返回 false 表示点击取消。
			*/
			return confirm("你确定要删除《" + $(this).parent().parent().find("td:first").text() + "》?");
			// return false// 阻止元素的默认行为===不提交请求
		});
	});
    </script>
<style>
    #main {
        height: 460px;
        width: 1200px;
        border: 1px black solid;
        overflow: auto;
    }
    div {       
        margin: auto;
        margin-bottom: 10px;
        margin-top: 10px;
    }
    a:-webkit-any-link {
        color: blue;
        cursor: pointer;
        text-decoration: underline;
        font-size: 20px;
    }
    #header div a {
        text-decoration: none;
        font-size: 20px;
        color: blue;
    } 
    * {
        margin: 0;
        font-family: "Microsoft Yahei";
        color: #666;
    }
    
    #main table {
        margin: auto;
        margin-top: 80px;
        border-collapse: collapse;
    }
    #bottom {
        height: 30px;
        width: 1200px;
        text-align: center;
    }
    .wel_word {
        font-size: 60px;
        float: left;
    }
    .logo_img {
        float: left;
    }
    #main table td {
        width: 120px;
        text-align: center;
        border-bottom: 1px #e3e3e3 solid;
        padding: 10px;
    }
    #header {
        height: 82px;
        width: 1200px;
    }
    #header div {
    float: right;
    margin-top: 55px;
    }
</style>
</head>
<body>
	
	<div id="header">
            <img class="logo_img" alt="" src="宇哥的书城.JPG" width="257px" height="80px">
			<span class="wel_word">图书管理系统</span>
			<div>
				<a href="bookServlet?action=list">图书管理</a>
				<a href="pages/order_manager.jsp">订单管理</a>
				<a href="pages/index.jsp">返回商城</a>
			</div>
	</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="bookServlet?action=getBook&id=${book.id}">修改</a></td>
					<td><a class="deleteClass" href="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/book_edit.jsp">添加图书</a></td>
			</tr>	
		</table>
	</div>
	
	<div id="bottom">
		<span>
			宇哥的书城.煞笔煞笔是傻逼&copy;2020
		</span>
	</div>
	
</body>
</html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<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>

1.5.2、前后台的简单介绍:
在这里插入图片描述
1.5.3、添加图书功能的实现:

1.5.3.1、添加图书流程细节:
在这里插入图片描述
1.5.3.2、问题说明:表单重复提交:

当用户提交完请求,浏览器会记录下最后一次请求的全部信息。当用户按下功能键 F5,就会发起浏览器记录的最后一次请求。

1.5.3.3、BookServlet 程序中添加 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、跳到图书列表页面
        //    /manager/bookServlet?action=list
        // req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req, resp);
		resp.sendRedirect(req.getContextPath() + "/bookServlet?action=list");

	}

1.5.3.4、修改 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>
    <%
      String basePath = request.getScheme()
             + "://"
             + request.getServerName()
             + ":"
             + request.getServerPort()
             + request.getContextPath()
             + "/";
    %>
    <!--写 base 标签,永远固定相对路径跳转的结果-->
    <base href="<%=basePath%>">
    <script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
<style type="text/css">
	h1 {
		text-align: center;
		margin-top: 200px;
	}
	
	h1 a {
		color:red;
	}
	
	input {
		text-align: center;
    }

    #main {
        height: 460px;
        width: 1200px;
        border: 1px black solid;
        overflow: auto;
    }

    div {       
        margin: auto;
        margin-bottom: 10px;
        margin-top: 10px;
    }

    #header div a {
        text-decoration: none;
        font-size: 20px;
        color: blue;
    }

    * {
        margin: 0;
        font-family: "Microsoft Yahei";
        color: #666;
    }

    #bottom {
        height: 30px;
        width: 1200px;
        text-align: center;
    }

    .wel_word {
        font-size: 60px;
        float: left;
    }

    .logo_img {
        float: left;
    }

    #header {
        height: 82px;
        width: 1200px;
    }

    #header div {
        float: right;
        margin-top: 55px;
    }

    #main table td {
        width: 120px;
        text-align: center;
        border-bottom: 1px #e3e3e3 solid;
        padding: 10px;
    }

    #main table {
        margin: auto;
        margin-top: 80px;
        border-collapse: collapse;
    }
</style>
</head>
<body>
		<div id="header">
			<img class="logo_img" alt="" src="宇哥的书城.JPG" width="257px" height="80px">
			<span class="wel_word">编辑图书</span>
			<div>
				<a href="bookServlet?action=list">图书管理</a>
				<a href="pages/order_manager.jsp">订单管理</a>
				<a href="pages/index.jsp">返回商城</a>
			</div>
		</div>
		
		<div id="main">
			<form action="<%=basePath%>bookServlet" method="get">
			    <input type="hidden" name="action" value="${empty param.id?"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>
		
		<div id="bottom">
			<span>
				宇哥的书城.煞笔煞笔是傻逼&copy;2020
			</span>
		</div>
</body>
</html>
<form action="<%=basePath%>bookServlet" method="get">
<input type="hidden" name="action" value="add" />

1.5.4、删除图书功能的实现:

1.5.4.1、图解删除流程:
在这里插入图片描述
1.5.4.2、BookServlet 程序中的 delete 方法:

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() + "/bookServlet?action=list");
	}

1.5.4.3、给 WebUtils 工具类添加转换 int 类型的工具方法:

   /**
     * 将字符串转换成为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.5.4.4、修改删除的连接地址:

<td><a class="deleteClass" href="bookServlet?action=delete&id=${book.id}">删除</a></td>

1.5.4.5、给删除添加确认提示操作:

$(function () {
    	// 给删除的 a 标签绑定单击事件,用于删除的确认提示操作
		$("a.deleteClass").click(function () {
			// 在事件的 function 函数中,有一个 this 对象。这个 this 对象,是当前正在响应事件的 dom 对象。
			/**
			* confirm 是确认提示框函数
			* 参数是它的提示内容
			* 它有两个按钮,一个确认,一个是取消。
			* 返回 true 表示点击了,确认,返回 false 表示点击取消。
			*/
			return confirm("你确定要删除《" + $(this).parent().parent().find("td:first").text() + "》?");
			// return false// 阻止元素的默认行为===不提交请求
		});
	});

1.5.5、修改图书功能的实现:

1.5.5.1:图解修改图书细节:
在这里插入图片描述
1.5.5.2、更新【修改】的请求地址:

<td><a href="bookServlet?action=getBook&id=${book.id}">修改</a></td>

1.5.5.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/book_edit.jsp").forward(req, resp);
	}

1.5.5.4、在 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>
    <%
      String basePath = request.getScheme()
             + "://"
             + request.getServerName()
             + ":"
             + request.getServerPort()
             + request.getContextPath()
             + "/";
    %>
    <!--写 base 标签,永远固定相对路径跳转的结果-->
    <base href="<%=basePath%>">
    <script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
<style type="text/css">
	h1 {
		text-align: center;
		margin-top: 200px;
	}
	
	h1 a {
		color:red;
	}
	
	input {
		text-align: center;
    }

    #main {
        height: 460px;
        width: 1200px;
        border: 1px black solid;
        overflow: auto;
    }

    div {       
        margin: auto;
        margin-bottom: 10px;
        margin-top: 10px;
    }

    #header div a {
        text-decoration: none;
        font-size: 20px;
        color: blue;
    }

    * {
        margin: 0;
        font-family: "Microsoft Yahei";
        color: #666;
    }

    #bottom {
        height: 30px;
        width: 1200px;
        text-align: center;
    }

    .wel_word {
        font-size: 60px;
        float: left;
    }

    .logo_img {
        float: left;
    }

    #header {
        height: 82px;
        width: 1200px;
    }

    #header div {
        float: right;
        margin-top: 55px;
    }

    #main table td {
        width: 120px;
        text-align: center;
        border-bottom: 1px #e3e3e3 solid;
        padding: 10px;
    }

    #main table {
        margin: auto;
        margin-top: 80px;
        border-collapse: collapse;
    }
</style>
</head>
<body>
		<div id="header">
			<img class="logo_img" alt="" src="宇哥的书城.JPG" width="257px" height="80px">
			<span class="wel_word">编辑图书</span>
			<div>
				<a href="bookServlet?action=list">图书管理</a>
				<a href="pages/order_manager.jsp">订单管理</a>
				<a href="pages/index.jsp">返回商城</a>
			</div>
		</div>
		
		<div id="main">
			<form action="<%=basePath%>bookServlet" method="get">
			    <input type="hidden" name="action" value="${empty param.id?"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>
		
		<div id="bottom">
			<span>
				宇哥的书城.煞笔煞笔是傻逼&copy;2020
			</span>
		</div>
</body>
</html>
<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>

1.5.5.5、在 BookServlet 程序中添加 update 方法:

protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1、获取请求的参数==封装成为Book对象
		Book book = WebUtils.copyParamToBean(req.getParameterMap(), new Book());
		System.out.println(book);
        // 2、调用BookService.updateBook( book );修改图书
		bookService.updateBook(book);
        // 3、重定向回图书列表管理页面
        // 地址:/工程名/manager/bookServlet?action=list
		resp.sendRedirect(req.getContextPath() + "/bookServlet?action=list");
	}

1.5.5.6、解决 book_edit.jsp 页面,即要实现添加,又要实现修改操作:

<input type="hidden" name="action" value="${empty param.id?"add":"update"}" />
<input type="hidden" name="id" value="${requestScope.book.id}" />

BookServlet:

package com.zy.web;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zy.pojo.Book;
import com.zy.service.BookService;
import com.zy.service.BookServiceImpl;
import com.zy.utils.WebUtils;

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.addBook()保存图书
		bookService.addBook(book);
        // 3、跳到图书列表页面
        //    /manager/bookServlet?action=list
        // req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req, resp);
		resp.sendRedirect(req.getContextPath() + "/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() + "/bookServlet?action=list");
	}

	protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1、获取请求的参数==封装成为Book对象
		Book book = WebUtils.copyParamToBean(req.getParameterMap(), new Book());
		System.out.println(book);
        // 2、调用BookService.updateBook( book );修改图书
		bookService.updateBook(book);
        // 3、重定向回图书列表管理页面
        // 地址:/工程名/manager/bookServlet?action=list
		resp.sendRedirect(req.getContextPath() + "/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/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/book_manager.jsp").forward(req, resp);
	}

}

1.6、效果:

1、进入后台:
在这里插入图片描述
2、删除图书:
在这里插入图片描述
3、添加图书:
在这里插入图片描述
4、列表图书:
在这里插入图片描述
5、修改图书:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值