• 3、项目第四阶段——商品模块


    书城项目第五阶段-图书模块

    1、MVC 概念

    MVC 全称:Model 模型、 View 视图、 Controller 控制器。

    MVC 最早出现在 JavaEE 三层中的 Web 层,它可以有效的指导 Web 层的代码如何有效分离,单独工作。

    View 视图:只负责数据和界面的显示,不接受任何与显示数据无关的代码,便于程序员和美工的分工合作—— JSP/HTML。

    Controller 控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面,是一个“调度者”的角色——Servlet。 转到某个页面。或者是重定向到某个页面。

    Model 模型:将与业务逻辑相关的数据封装为具体的 JavaBean 类,其中不掺杂任何与数据处理相关的代码—— JavaBean/domain/entity/pojo。

    MVC 是一种思想 MVC 的理念是将软件代码拆分成为组件,单独开发,组合使用(目的还是为了降低耦合度)。
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k9hOrzfy-1668346966031)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505205517911.png)]

    2、图书模块

    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)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    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');
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    1.2、编写图书模块的 JavaBean

    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 String getImgPath() {
            //要求图书封面路径不为空
            if(imgPath!=null &&!"".equals(imgPath)) {
                this.imgPath = imgPath;
            }
            return imgPath;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.3、编写图书模块的 Dao 和测试 Dao

    Dao 接口

    import java.util.List;
    
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    BookDaoImpl 实现类:

    import my.book.dao.BookDao;
    import my.book.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 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

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

    BookService 接口

    import my.book.pojo.Book;
    import java.util.List;
    
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    BookServiceImpl 实现类

    import my.book.dao.BookDao;
    import my.book.dao.impl.BookDaoImpl;
    import my.book.pojo.Book;
    import my.book.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.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();
        }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    BookService 的测试

    public class BookServiceTest {
        private BookService bookService=new BookServiceImpl();
    
        @Test
        public void addBook() {
            bookService.addBook(new Book(null,"我为什么这么帅!", "191125", new BigDecimal(9999),1100000,0,null
            ));
    
        }
    
        @Test
        public void deleteBookById() {
            bookService.deleteBookById(23);
        }
    
        @Test
        public void updateBook() {
            bookService.updateBook(new Book(21,"大家都可以这么帅!", "国哥", new BigDecimal(9999),1100000,0,null
            ));
        }
    
        @Test
        public void queryBookById() {
            System.out.println( bookService.queryBookById(21) );
        }
    
        @Test
        public void queryBooks() {
            for (Book queryBook : bookService.queryBooks()) {
                System.out.println(queryBook);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

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

    1.5.1、图书列表功能的实现

    1、图解列表功能流程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R3N0E4nl-1668346966033)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506171513281.png)]

    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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    manager_menu.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gqe9to5U-1668346966034)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506171955647.png)]

    1.5.2、前后台的简单介绍

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CJGM8TdL-1668346966035)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506172044870.png)]

    1.5.3、添加图书功能的实现

    1、添加图书流程细节:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eebi5yIv-1668346966035)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506172118645.png)]

    2、问题说明:表单重复提交:

    //   /manager/bookServlet?action=list
    //会出现bug,用户刷新就会在一次添加
    // req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);
    //用重对象
    resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    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.add保存图书
        bookService.addBook(book);
        //3、跳到图书列表页面
        //   /manager/bookServlet?action=list
        //会出现bug,用户刷新就会在一次添加
        // req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);
        //用重对象
        resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4、修改 book_edit.jsp

    • 1
    • 2
    • 3
    1.5.4、删除图书功能的实现

    1、图解删除流程:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z48ED2JI-1668346966036)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506172652862.png)]

    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() + "/manager/bookServlet?action=list");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    //将字符串转换成int型
    public static int parseInt(String strInt,int defaultValue) {
        try {
            return Integer.parseInt(strInt);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return defaultValue;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4、修改删除的连接地址:

    book_manager:

    <td><a href="book_edit.jsp">修改</a></td>
    <td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}">删除</a></td>
    
    • 1
    • 2

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

    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1.5.5、修改图书功能的实现

    1、图解修改图书细节

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k7S6Pcr0-1668346966036)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506173228826.png)]

    2、更新【修改】的请求地址

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R3JJ2wd6-1668346966037)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506173303841.png)]

    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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4、在 book_edit.jsp 页面中显示修改的数据

    名称 价格 作者 销量 库存 操作
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5、在 BookServlet 程序中添加 update 方法

     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");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    6、解决 book_edit.jsp 页面,即要实现添加,又要实现修改操作
    在这里插入图片描述

  • 相关阅读:
    使用 IDEA 快速远程调试 Docker 中运行的 Java 应用程序 (附解决思考过程)
    gd32部分映射1/2,完全映射,备用功能选择等
    专业人士使用的 11 种渗透测试工具
    .NET周报 【2月第4期 2023-02-25】
    git如何修改注释
    FPGA工程师面试——基础概念问题整理
    ETL之apache hop系列4-hop开发数据增量同步功能
    PP-yoloE论文的理解
    IDEA配置Tomcat,先报500错误,刷新后报404.
    数据结构-单链表操作
  • 原文地址:https://blog.csdn.net/weixin_53330986/article/details/127838087