前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第六章:基础功能实现【基于Servlet+JSP的图书管理系统】

第六章:基础功能实现【基于Servlet+JSP的图书管理系统】

作者头像
用户4919348
发布2023-08-26 16:24:22
1510
发布2023-08-26 16:24:22
举报
文章被收录于专栏:波波烤鸭波波烤鸭

基础功能

在这里插入图片描述
在这里插入图片描述

1.院系管理

  维护院系的基础数据。包括CRUD(增删改查)的操作。首先定义对应的Bean.

代码语言:javascript
复制
@Data
public class Depart {

    private Integer id;
    private String name;
    private String notes;
    private Date createTime;
}

然后创建对应的Dao接口,在接口中什么CRUD的基础方法。

代码语言:javascript
复制
public interface IDepartDao {
    /**
     * 分页查询的方法
     * @param pageUtils 分页数据
     * @return
     */
    public List<Depart> listPage(PageUtils pageUtils);

    int count(PageUtils pageUtils);

    public int save(Depart entity);

    public Depart findById(int id);

    public int updateById(Depart entity);

    int deleteById(int id);
}

然后创建对应的Dao的实现类,并实现接口中定义的相关方法

代码语言:javascript
复制
public class DepartDaoImpl implements IDepartDao {

    @Override
    public List<Depart> listPage(PageUtils pageUtils) {
        QueryRunner queryRunner = MyDbUtils.getQueryRunner();

        String sql = "select * from t_depart limit ?,?";
        if(StringUtils.isNotEmpty(pageUtils.getKey())){
            sql = "select * from t_depart where name like '%"+pageUtils.getKey()+"%' or notes like '%"+pageUtils.getKey()+"%' limit ?,? ";
        }
        // 计算 分页开始的位置
        int startNo = pageUtils.getStart();
        try {
            List<Depart> list = queryRunner.query(sql, new ResultSetHandler<List<Depart>>() {
                @Override
                public List<Depart> handle(ResultSet resultSet) throws SQLException {
                    // 存储返回结果的容器
                    List<Depart> list = new ArrayList<>();
                    while(resultSet.next()){
                        // 每次循环一次 user 存储一条数据
                        Depart entity = new Depart();
                        entity.setId(resultSet.getInt("id"));
                        entity.setName(resultSet.getString("name"));
                        entity.setNotes(resultSet.getString("notes"));
                        entity.setCreateTime(resultSet.getDate("create_time"));
                        list.add(entity); // 把查询的记录封装到了集合容器中
                    }
                    return list; // 返回查询的结果
                }
            },startNo,pageUtils.getPageSize());
            return list;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    @Override
    public int count(PageUtils pageUtils) {
        QueryRunner queryRunner = MyDbUtils.getQueryRunner();
        String sql = "select count(1) from t_depart ";
        if(StringUtils.isNotEmpty(pageUtils.getKey())){
            sql = "select count(1) from t_depart where name like '%"+pageUtils.getKey()+"%' or notes like '%"+pageUtils.getKey()+"%' ";
        }
        try {
            return queryRunner.query(sql, new ResultSetHandler<Integer>() {
                @Override
                public Integer handle(ResultSet resultSet) throws SQLException {
                    resultSet.next();
                    return resultSet.getInt(1);
                }
            });
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return 0;
    }

    @Override
    public int save(Depart entity) {
        QueryRunner queryRunner = MyDbUtils.getQueryRunner();
        String sql = "insert into t_depart(name,notes)values(?,?) ";
        try {
            return queryRunner.update(sql,entity.getName(),entity.getNotes());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return 0;
    }

    @Override
    public Depart findById(int id) {
        QueryRunner queryRunner = MyDbUtils.getQueryRunner();
        String sql = "select * from t_depart where id = ?";
        try {
            return queryRunner.query(sql, new ResultSetHandler<Depart>() {
                @Override
                public Depart handle(ResultSet resultSet) throws SQLException {
                    // 存储返回结果的容器
                    if(resultSet.next()){
                        // 每次循环一次 user 存储一条数据
                        Depart entity = new Depart();
                        entity.setId(resultSet.getInt("id"));
                        entity.setName(resultSet.getString("name"));
                        entity.setNotes(resultSet.getString("notes"));
                        entity.setCreateTime(resultSet.getDate("create_time"));
                        return entity;
                    }
                    return null; // 返回查询的结果
                }
            },id);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    @Override
    public int updateById(Depart entity) {
        QueryRunner queryRunner = MyDbUtils.getQueryRunner();
        String sql = "update t_depart set name = ? , notes = ? where id = ?";
        try {
            return queryRunner.update(sql,entity.getName(),entity.getNotes(),entity.getId());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return 0;
    }

    @Override
    public int deleteById(int id) {
        QueryRunner queryRunner = MyDbUtils.getQueryRunner();
        String sql = "delete from t_depart where id = ?";
        try {
            return queryRunner.update(sql,id);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return 0;
    }
}

  然后就可以Service层的处理了。

代码语言:javascript
复制
public interface IDepartService {
    public void listPage(PageUtils pageUtils);

    int count(PageUtils pageUtils);

    public int save(Depart entity);

    public Depart findById(int id);

    public int updateById(Depart entity);

    int deleteById(int id);
}

在Service的接口实现类中要注意分页数据查询的处理。其他都是直接调用Dao中的方法处理

代码语言:javascript
复制
public class DepartServiceImpl implements IDepartService {

    private IDepartDao dao = new DepartDaoImpl();

    @Override
    public void listPage(PageUtils pageUtils) {
        // 查询分页的数据
        List<Depart> list = dao.listPage(pageUtils);
        // 查询 满足查询条件的记录数
        int count = dao.count(pageUtils);
        // 封装分页的数据
        pageUtils.setList(list);
        pageUtils.setTotalCount(count);
    }

    @Override
    public int count(PageUtils pageUtils) {
        return dao.count(pageUtils);
    }

    @Override
    public int save(Depart entity) {
        return dao.save(entity);
    }

    @Override
    public Depart findById(int id) {
        return dao.findById(id);
    }

    @Override
    public int updateById(Depart entity) {
        return dao.updateById(entity);
    }

    @Override
    public int deleteById(int id) {
        return dao.deleteById(id);
    }
}

然后就是DepartServlet中针对CRUD操作需要涉及的接口方法的实现

代码语言:javascript
复制
@WebServlet(name = "departServlet",urlPatterns = {"/book/departServlet"})
public class DepartServlet extends BaseServlet {

    private IDepartService service = new DepartServiceImpl();

    @Override
    public void list(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        super.list(req, resp);
        service.listPage(pageUtils);
        req.setAttribute(Constant.LIST_PAGE_UTILS,pageUtils);
        // 页面跳转
        req.getRequestDispatcher("/book/depart/list.jsp").forward(req,resp);
    }

    @Override
    public void saveOrUpdatePage(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        String id = req.getParameter("id");
        if(StringUtils.isNotEmpty(id)){
            // 说明是更新操作
            Depart entity = service.findById(Integer.parseInt(id));
            req.setAttribute("entity",entity);
        }
        req.getRequestDispatcher("/book/depart/addOrUpdate.jsp").forward(req,resp);
    }

    @Override
    public void saveOrUpdate(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        // 接收表单提交的数据
        String id = req.getParameter("id");
        String name = req.getParameter("name");
        String notes = req.getParameter("notes");
        Depart depart = new Depart();
        depart.setName(name);
        depart.setNotes(notes);
        if(StringUtils.isNotEmpty(id)){
            // 更新
            depart.setId(Integer.parseInt(id));
            service.updateById(depart);
        }else{
            // 保存数据
            service.save(depart);
        }
        // 更新或者添加后需要重新查询相关的数据
        resp.sendRedirect("/book/departServlet?action=list");
    }

    @Override
    public void remove(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        String id = req.getParameter("id");
        service.deleteById(Integer.parseInt(id));
        PrintWriter writer = resp.getWriter();
        writer.write("ok");
        writer.flush();
    }

    @Override
    public void findById(HttpServletRequest req, HttpServletResponse resp) throws Exception {

    }
}

对应页面的处理操作,效果如下:

在这里插入图片描述
在这里插入图片描述

更新和添加效果

在这里插入图片描述
在这里插入图片描述

2.班级管理

  班级管理的功能和上面的院系功能很类似。只是多了一个所属的院系关系,笔记我们就重点突出这块。

在这里插入图片描述
在这里插入图片描述

在页面处理中需要多一个下拉菜单。分配院系功能

在这里插入图片描述
在这里插入图片描述

具体的实现效果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.学生管理

  学生管理是一个非常基础的CRUD操作,需要完成基础的bean,dao,service,servlet以及前端jsp页面,效果如下:

在这里插入图片描述
在这里插入图片描述

添加和更新的效果

在这里插入图片描述
在这里插入图片描述

基本的代码就不贴了。列举需要注意的地方

  1. ajax异步获取班级信息,乱码的问题,需要在响应数据之前设置resp.setContentType("application/json;charset=utf-8");
  2. 在更新数据回写班级信息的时候。我们需要在页面加载完成的相关事件中添加对应的逻辑
  3. 在添加数据的时候需要同步添加账号,密码默认为123
  4. 在更新数据的还是需要同步的更新账号数据
  5. 在删除学生信息的同时需要删除账号信息
  6. 注意看日志报错信息,学会排查问题。

4.图书类型

  图书类型是我们图书信息中的一个非常重要的信息。所以我们需要单独的维护,功能非常简单就是一个普通的CRUD操作。

在这里插入图片描述
在这里插入图片描述

5.图书管理

  图书管理功能是整个系统的核心功能。当然这块也是一个基本的CRUD操作。只是这块的字段比较多。在实现的时候需要注意点即可。

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础功能
    • 1.院系管理
      • 2.班级管理
        • 3.学生管理
          • 4.图书类型
            • 5.图书管理
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档