【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】来实现书籍的管理功能,为后续学生管理和借阅管理做准备。

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 39
    评论
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ali.s

你的鼓励将是我前进的最好动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值