• 【JAVA项目实战】【图书管理系统】书籍管理功能【Servlet】+【JSP】+【MySql】+【Ajax】


    🚀个人主页:欢迎访问Ali.s的首页

    ⏰ 最近更新:2022年9月20日

    Java框架学习系列:【Spring】【SpringMVC】【Mybatis】

    🔥 Java项目实战系列:【飞机大战】【图书管理系统】

    🍭 Java算法21天系列:【查找】【排序】【递归】

    ⛳ Java基础学习系列:【继承】【封装】【多态】

    🏆 通信仿真学习系列:【硬件】【通信】【MATLAB】

    🍄 个人简介:通信工程本硕🌈、Java程序员🚴。目前只会CURD😂

    💌 点赞 👍 收藏 💗留言 💬 都是我最大的动力💯

    在这里插入图片描述


    前言

    这里是【JAVASE】项目实战的第六节课,前面完成了登录和注销功能,在未登录的状态下,无法访问数据信息。今天做的是书籍管理功能,使用【Servlet】【JSP】【MySql】【Ajax】来实现书籍的管理功能。


    一、需求分析

    在前面用户功能实现后,可以清楚的看到用户直接进入了后台的主界面,,通过登录模块来达到数据安全。进入系统后首先看到的是用户管理,接着就是书籍管理,书籍管理其实跟用户管理大同小异,主要也是增删改查的操作,有一点不同的是,书籍管理需要与后面的学生管理做绑定。

    二、功能实现

    dao层和service层中创建接口。这里与用户模块类似,首先完成前端页面的信息,然后进行后端的校验逻辑的判断,到层处理sql语句,需要准备Book实体类,便于关系的映射和值的获取与传递。

    1.Book实体的创建

    结合数据库字段信息,完成书籍实体类的创建,也可以使用相关工具创建,但是使用工具创建容易导致字段类型不匹配,刚开始做项目,建议手动写实体类,对每个字段的类型有一个基本的了解,还要注意自己手动添加下toString()方法。

    import java.util.Date;
    import java.io.Serializable;
    
    /**
     * (TBook)实体类
     *
     * @author Ali.S
     * @since 2022-08-11 21:41:49
     */
    public class Book implements Serializable {
        private static final long serialVersionUID = 429249063538036947L;
        /**
        * 书籍id
        */
        private Integer id;
        /**
        * 书籍名称
        */
        private String bookName;
        /**
        * 作者
        */
        private String author;
        /**
        * 出版社
        */
        private String publish;
        /**
        * 书籍编码
        */
        private String isbn;
        /**
        * 书籍介绍
        */
        private String introduction;
        /**
        * 书籍语言
        */
        private String language;
        /**
        * 书籍售价
        */
        private Double price;
        /**
        * 发布日期
        */
        private Date pubdate;
        /**
        * 书架号
        */
        private String pressmark;
        /**
        * 书籍状态  0 空闲 1借阅 2下架 3 其他
        */
        private Integer state;
        /**
        * 删除状态  0 删除 1未删除
        */
        private Integer isDeleted;
    
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getBookName() {
            return bookName;
        }
    
        public void setBookName(String bookName) {
            this.bookName = bookName;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public String getPublish() {
            return publish;
        }
    
        public void setPublish(String publish) {
            this.publish = publish;
        }
    
        public String getIsbn() {
            return isbn;
        }
    
        public void setIsbn(String isbn) {
            this.isbn = isbn;
        }
    
        public String getIntroduction() {
            return introduction;
        }
    
        public void setIntroduction(String introduction) {
            this.introduction = introduction;
        }
    
        public String getLanguage() {
            return language;
        }
    
        public void setLanguage(String language) {
            this.language = language;
        }
    
        public Double getPrice() {
            return price;
        }
    
        public void setPrice(Double price) {
            this.price = price;
        }
    
        public Date getPubdate() {
            return pubdate;
        }
    
        public void setPubdate(Date pubdate) {
            this.pubdate = pubdate;
        }
    
        public String getPressmark() {
            return pressmark;
        }
    
        public void setPressmark(String pressmark) {
            this.pressmark = pressmark;
        }
    
        public Integer getState() {
            return state;
        }
    
        public void setState(Integer state) {
            this.state = state;
        }
    
        public Integer getIsDeleted() {
            return isDeleted;
        }
    
        public void setIsDeleted(Integer isDeleted) {
            this.isDeleted = isDeleted;
        }
    
        @Override
        public String toString() {
            return "Book{" +
                    "id=" + id +
                    ", bookName='" + bookName + '\'' +
                    ", author='" + author + '\'' +
                    ", publish='" + publish + '\'' +
                    ", isbn='" + isbn + '\'' +
                    ", introduction='" + introduction + '\'' +
                    ", language='" + language + '\'' +
                    ", price=" + price +
                    ", pubdate=" + pubdate +
                    ", pressmark='" + pressmark + '\'' +
                    ", state=" + state +
                    ", isDeleted=" + isDeleted +
                    '}';
        }
    }
    

    2.数据持久层接口

    创建数据持久层的接口与实现,并完成增删改查的相关方法,为业务逻辑层做准备。

    public interface BookDao{
        public List<Book> list(Book book);
        public Integer saveBook(Book book);
        public Integer updateBook(Book book);
        public Integer deleteBook(Integer id);
        public Book queryBookById(Integer id);
        List<Book> queryBookState(int code);
    }
    

    在完成接口的时候,在实现接口的类中完成相关的方法,注意添加和更新可以在同一个方法中,在具体的方法中通过Ajax是否拿到当前的数据的id作为判断标准,进而将两个功能进行单独的处理,这里是单独完成的,代码显得有些冗余,但是逻辑思路更加清晰。

    public class BookDaoImpl implements BookDao {
        String sql;
        QueryRunner queryRunner;
    
        //查询图书
        @Override
        public List<Book> list(Book book) {
            queryRunner = DBUtils.getQueryRunner();
            sql = "select * from t_book where is_deleted=?";
            try {
                return queryRunner.query(sql, new ResultSetHandler<List<Book>>() {
                    @Override
                    public List<Book> handle(ResultSet resultSet) throws SQLException {
                        List<Book> list = new ArrayList<>();
                        while (resultSet.next()) {
                            Book b = new Book();
                            b.setId(resultSet.getInt("id"));
                            b.setBookName(resultSet.getString("book_name"));
                            b.setAuthor(resultSet.getString("author"));
                            b.setPublish(resultSet.getString("publish"));
                            b.setIsbn(resultSet.getString("isbn"));
                            String introduction = resultSet.getString("introduction");
                            if (introduction != null && !"".equals(introduction) && introduction.length() > 20) {
                                introduction = resultSet.getString("introduction").substring(0, 20);
                                b.setIntroduction(introduction + "...");
                            } else {
                                b.setIntroduction(introduction);
                            }
                            b.setLanguage(resultSet.getString("language"));
                            b.setPrice(resultSet.getDouble("price"));
                            b.setPubdate(resultSet.getDate("pubdate"));
                            b.setPressmark(resultSet.getString("pressmark"));
                            b.setIsDeleted(resultSet.getInt("is_deleted"));
                            b.setState(resultSet.getInt("state"));
                            list.add(b);
                        }
                        return list;
                    }
                }, DelFlag.No.code);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        //新增图书
        @Override
        public Integer saveBook(Book book) {
            queryRunner = DBUtils.getQueryRunner();
            sql = "insert into t_book (book_name,author,publish,isbn,introduction,language,price,pubdate,pressmark,state,is_deleted) values (?,?,?,?,?,?,?,?,?,?,?)";
            try {
                return submitInfo(book);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return -1;
        }
    
    
        //更新图书
        @Override
        public Integer updateBook(Book book) {
            queryRunner = DBUtils.getQueryRunner();
            if (book.getIsDeleted() == null || "".equals(book.getIsDeleted())) {
                book.setIsDeleted(DelFlag.No.code);
            }
            if (book.getState() == null || "".equals(book.getState())) {
                book.setState(0);
            }
            sql = "update t_book set book_name=?,author=?,publish=?,isbn=?,introduction=?,language=?,price=?,pubdate=?,pressmark=?,state=?,is_deleted=? where id=?";
            try {
                return updateInfo(book);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return -1;
        }
    
        //删除图书
        @Override
        public Integer deleteBook(Integer id) {
            queryRunner = DBUtils.getQueryRunner();
            sql = "update t_book set is_deleted=? where id=?";
            try {
                return queryRunner.update(sql, DelFlag.YES.code, id);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return -1;
        }
    
        //查询单条信息
        @Override
        public Book queryBookById(Integer id) {
            queryRunner = DBUtils.getQueryRunner();
            sql = "select * from t_book where is_deleted=? and id=?";
            try {
                return queryRunner.query(sql, new ResultSetHandler<Book>() {
                    @Override
                    public Book handle(ResultSet resultSet) throws SQLException {
                        if (resultSet.next()) {
                            Book b = new Book();
                            b.setId(resultSet.getInt("id"));
                            b.setBookName(resultSet.getString("book_name"));
                            b.setAuthor(resultSet.getString("author"));
                            b.setPublish(resultSet.getString("publish"));
                            b.setIsbn(resultSet.getString("isbn"));
                            b.setIntroduction(resultSet.getString("introduction"));
                            b.setLanguage(resultSet.getString("language"));
                            b.setPrice(resultSet.getDouble("price"));
                            b.setPubdate(resultSet.getDate("pubdate"));
                            b.setPressmark(resultSet.getString("pressmark"));
                            b.setIsDeleted(resultSet.getInt("is_deleted"));
                            b.setState(resultSet.getInt("state"));
                            return b;
                        }
                        return null;
                    }
                }, DelFlag.No.code,id);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return null;
    
        }
    //查询是否上架
        @Override
        public List<Book> queryBookState(int code) {
            queryRunner = DBUtils.getQueryRunner();
            sql = "select * from t_book where is_deleted=? and state=?";
            try {
                return queryRunner.query(sql, new ResultSetHandler<List<Book>>() {
                    @Override
                    public List<Book> handle(ResultSet resultSet) throws SQLException {
                        List<Book> list = new ArrayList<>();
                        while (resultSet.next()) {
                            Book b = new Book();
                            b.setId(resultSet.getInt("id"));
                            b.setBookName(resultSet.getString("book_name"));
                            b.setAuthor(resultSet.getString("author"));
                            b.setPublish(resultSet.getString("publish"));
                            b.setIsbn(resultSet.getString("isbn"));
                            String introduction = resultSet.getString("introduction");
                            if (introduction != null && !"".equals(introduction) && introduction.length() > 20) {
                                introduction = resultSet.getString("introduction").substring(0, 20);
                                b.setIntroduction(introduction + "...");
                            } else {
                                b.setIntroduction(introduction);
                            }
                            b.setLanguage(resultSet.getString("language"));
                            b.setPrice(resultSet.getDouble("price"));
                            b.setPubdate(resultSet.getDate("pubdate"));
                            b.setPressmark(resultSet.getString("pressmark"));
                            b.setIsDeleted(resultSet.getInt("is_deleted"));
                            b.setState(resultSet.getInt("state"));
                            list.add(b);
                        }
                        return list;
                    }
                }, DelFlag.No.code,code);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    3.业务逻辑层实现

    与数据持久层类似的操作,创建相应的接口并实现,调用数据持久层的方法获取数据信息。

    public interface BookService {
        public List<Book> list(Book book);
        public Integer saveBook(Book book);
        public Integer updateBook(Book book);
        public Integer deleteBook(Integer id);
        public Book queryBookById(Integer id);
        List<Book> queryBooksState(int code);
    }
    
    

    4.Controller控制层

    Servlet层中创建 BookServlet 通过处理查询所有书籍的方法。同时将处理POST请求字符编码问题单独放在了过滤器中。

      public class BookServlet extends HttpServlet {
        private BookService bookService=new BookServiceImpl();
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
            //获取提交的数据
            String type=req.getParameter(Constant.SERVLET_TYPE_SQLTYPE);
                if (type != null && !"".equals(type)) {
                    //对请求进行判断,针对不同的请求进行不同的处理
                    if (Constant.SERVLET_TYPE_QUERY.equals(type)) {
                        //进行查询操作
                        queryBook(req, resp);
                    }else if (Constant.SERVLET_TYPE_SAVE.equals(type)){
                        //新增提交操作
                        saveOrUpdateBook(req, resp);
                    }else if (Constant.SERVLET_TYPE_QUERYBYID.equals(type)){
                        //获取单条信息,便于修改
                        queryBookById(req, resp);
                    } else if (Constant.SERVLET_TYPE_UPDATE.equals(type)){
                        //进行更新操作
                        saveOrUpdateBook(req,resp);
                    }else if (Constant.SERVLET_TYPE_DELETE.equals(type)){
                        deleteBook(req, resp);
                    }else{
                        queryBook(req, resp);
                    }
                }
        }
        //删除
        private void deleteBook(HttpServletRequest req, HttpServletResponse resp) throws IOException {
            String id= req.getParameter("id");
            bookService.deleteBook(Integer.parseInt(id));
            resp.sendRedirect("/bookServlet?sqltype=query");
        }
    
        //更新
        private void queryBookById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String id= req.getParameter("id");
            Book book=bookService.queryBookById(Integer.parseInt(id));
            req.setAttribute("book",book);
            req.getRequestDispatcher("/book/bookUpdate.jsp").forward(req, resp);
        }
    
        //添加
        private void saveOrUpdateBook(HttpServletRequest req, HttpServletResponse resp) {
            //进行添加
            try {
                //使用反射机制,快速提取表单中的信息到book对象中
                Book book = RequestParameterUntil.getRequestParameterForReflect(req, Book.class);
                int count=-1;
                if (book.getId()!=null && book.getId()>0){
                    //表示更新
                    count= bookService.updateBook(book);
                } else{
                    //表示添加
                    count = bookService.saveBook(book);
                }
                if (count>0){
                    //添加成功,进行重定向
                    resp.sendRedirect("/bookServlet?sqltype=query");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    

    三、功能测试

    启动服务器,让项目在服务器中运行,进入登录页面,输入账号密码后进行书籍的查询功能的测试:
    在这里插入图片描述
    与数据库对比后可以发现所有的书都可以被查询到,并且可以在前端页面进行渲染。下面进行新增图书的功能测试,在点击添加按钮后,跳转到表单页面,输入需要新增的图书信息:
    在这里插入图片描述
    确认信息无误后,进行表单提交,页面进行重定向,自动完成所有图书的查询,看到新的图书添加成功。
    在这里插入图片描述
    接着对刚才新增的书,进行修改操作,看是否能完成修改功能,将图书的名称和价格都修改一下:
    在这里插入图片描述

    最后对图书的删除功能进行测试,这里是非物理删除,在点击图书删除按钮时,改变图书的状态码,使其前端无法完成显示,但数据信息还是依旧保留在数据库中:
    在这里插入图片描述
    在这里插入图片描述

    总结

    以上就是今天要讲的内容,使用【Servlet】【JSP】【MySql】【Ajax】来实现书籍的管理功能,为后续学生管理和借阅管理做准备。

  • 相关阅读:
    使用CEF(六)— 解读CEF的cmake工程配置
    网络中其他重要技术与协议(DNS系统,ICMP协议,NAT技术与代理服务器)
    基于servlet+jsp+mysql实现的工资管理系统【源码+数据库】
    源码学习系列——green-gis-server
    Facebook的预填问题默认可以设定哪些类型。
    C# 第五章『面向对象』◆第4节:析构函数destructor
    stdafx.obj will contain the pre-compiled type information
    初识ES6
    机器学习实战-AdaBoost
    大神教你~Nginx网络服务
  • 原文地址:https://blog.csdn.net/dxcn01/article/details/126950832