EasyUI+JavaWeb奖助学金管理系统[9]-分页显示项目列表

秒速五厘米 2022-12-25 03:58 217阅读 0赞

点此查看全部文字教程、视频教程、源代码

本文目录

    1. 本章任务
    1. 构建测试数据
    1. 前端页面开发
    • 3.1 新建页面
    • 3.2 新建数据表格
    1. 返回值封装
    1. Servlet返回分页数据
    1. 封装数据库方法
    1. 测试

1. 本章任务

已经可以使用学校管理员登录,我们来实现学校管理员的第一个主要功能:管理奖助学金项目。

奖助学金项目是系统的基础档案,需要学校管理员将项目信息建好后,学生才能申请相关项目。

本章首先来实现下分页显示奖学金项目的功能。

2. 构建测试数据

在数据库项目表构建一些测试数据:

  1. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (1, 'award', '奖学金1', '');
  2. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (2, 'award', '奖学金2', '');
  3. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (3, 'award', '奖学金3', '');
  4. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (4, 'award', '奖学金4', '');
  5. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (5, 'award', '奖学金5', '');
  6. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (6, 'award', '奖学金6', '');
  7. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (7, 'award', '奖学金7', '');
  8. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (8, 'award', '奖学金8', '');
  9. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (9, 'award', '奖学金9', '');
  10. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (10, 'award', '奖学金10', '');
  11. INSERT INTO `scholar-system`.`project`(`id`, `type`, `name`, `about`) VALUES (11, 'help', '助学金11', '');

3. 前端页面开发

3.1 新建页面

新建projectManage.html前端页面,并引入easyui相关的css和js文件。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <link rel="stylesheet" type="text/css" href="easyui/themes/default/easyui.css">
  7. <link rel="stylesheet" type="text/css" href="easyui/themes/icon.css">
  8. <link rel="stylesheet" type="text/css" href="css/main.css">
  9. <script type="text/javascript" src="easyui/jquery.min.js"></script>
  10. <script type="text/javascript" src="easyui/jquery.easyui.min.js"></script>
  11. </head>
  12. <body>
  13. </body>
  14. </html>

3.2 新建数据表格

我们需要通过表格展示项目信息,所以新建数据表格如下:

  1. <table id="mainTable" title="项目列表" class="easyui-datagrid"
  2. url="CoreServlet?method=getProjectPage" pagination="true"
  3. singleSelect="true">
  4. <thead>
  5. <tr>
  6. <th data-options="field:'id'">序号</th>
  7. <th data-options="field:'type'">类型</th>
  8. <th data-options="field:'name'">名称</th>
  9. <th data-options="field:'about'">简介</th>
  10. </tr>
  11. </thead>
  12. </table>

这段代码很关键,我们来仔细解释下。

  1. class="easyui-datagrid",说明当前的表格是easyui的datagrid组件,也就是数据表格。
  2. url="CoreServlet?method=getProjectPage",说明了数据表格请求的数据地址,注意当页面初始化,或者请求页码变化时,数据表格会主动再次请求url指向的地址,并将返回数据加载到表格中。
  3. pagination="true"表示启用分页,启用分页后,每次请求url都会携带当前页码信息,默认会携带page=1 rows=10给后端的Servlet,表示请求第一页,每页展示10行。
  4. singleSelect="true"表示启用单选,每次只能选中1行数据。
  5. <th field="id">序号</th>,这个很有意思,注意有一个field="id",也就是Servlet返回值中键为id的属性对应该列。

根据上面的描述,数据表格会自动请求url,而且还携带分页信息,最强大的是还会将返回数据根据列–属性对应关系显示到数据表格中。

这些动作都是datagrid自动完成的,不需要我们手写ajax方法请求url,然后根据返回值生成table的行。所以easyui是比较完整的封装,用起来比较方便。

4. 返回值封装

在之前的案例中,都是返回Result对象,code表示成功标识,data表示数据域。

但是EasyUI要求返回数据中必须包含total和rows,total表示数据总的条数,rows是数据的集合。EasyUI的数据表格会自动的去分析total和rows的值,然后计算出有多少页,将rows的值显示到数据表格中。

所以我们改造下Result对象,在分页的情况下,可以返回total和rows。注意rows由于可能是各种对象的集合,所以我们直接用T泛型来表示即可。

  1. /**
  2. * 统一返回结果类
  3. */
  4. public class Result<T> {
  5. /**
  6. * 0成功 9999失败
  7. */
  8. private int code;
  9. /**
  10. * 提示信息
  11. */
  12. private String msg;
  13. /**
  14. * 返回数据
  15. */
  16. private T data;
  17. /**
  18. * 分页总数
  19. */
  20. private int total;
  21. /**
  22. * 分页数据
  23. */
  24. private T rows;
  25. // 省略get set
  26. }

5. Servlet返回分页数据

这部分比较简单了,首先在Servlet中获取前端请求的页码page和每页展示行数rows。

  1. public Result handleRequest(HttpServletRequest request) throws Exception {
  2. Result result = new Result();
  3. String method = request.getParameter("method");
  4. // 请求页码、每页显示行数、总数
  5. int page = 1, rows = 10, total = 0;
  6. if (method.contains("Page") == true) {
  7. // 当前为分页请求
  8. // 获取
  9. String inputPage = request.getParameter("page");
  10. String inputRows = request.getParameter("rows");
  11. page = (inputPage == null) ? 1 : Integer.parseInt(inputPage);
  12. rows = (inputRows == null) ? 10 : Integer.parseInt(inputRows);
  13. }
  14. // ......省略部分不相关代码
  15. // 获取项目分页
  16. else if (method.equals("getProjectPage")) {
  17. ProjectDao projectDao = new ProjectDao();
  18. total = projectDao.getCount();
  19. result.setTotal(total);
  20. result.setRows(projectDao.getPage(page, rows));
  21. }
  22. return result;
  23. }

此处解释下:

  1. if (method.contains("Page") == true) {,分页请求时url中都含有Page字样,便于我们后端判断是否分页请求。
  2. total = projectDao.getCount();,封装一个方法返回项目的总数量。
  3. projectDao.getPage(page, rows),封装一个方法,根据页码和每页显示个数返回对应的数据库记录。

6. 封装数据库方法

就是获取条数和指定页记录的方法。

  1. /**
  2. * 获取数量
  3. */
  4. public int getCount() throws Exception {
  5. Connection conn = ConnectionUtils.getConnection();
  6. String sql = "select count(id) from project ";
  7. QueryRunner runner = new QueryRunner();
  8. Number number = (Number) runner.query(conn, sql, new ScalarHandler());
  9. int value = number.intValue();
  10. ConnectionUtils.releaseConnection(conn);
  11. return value;
  12. }
  13. /**
  14. * 分页查询
  15. */
  16. public List<Project> getPage(int page, int rows) throws Exception {
  17. Connection conn = ConnectionUtils.getConnection();
  18. String sql = "select * from project limit ?,?";
  19. QueryRunner runner = new QueryRunner();
  20. Object[] params = {
  21. (page - 1) * rows, rows };
  22. List<Project> projects = runner.query(conn, sql, new BeanListHandler<Project>(Project.class), params);
  23. ConnectionUtils.releaseConnection(conn);
  24. return projects;
  25. }

7. 测试

样式有点丑,我们添加下fitColumns属性让列适应宽度,然后设置下列的宽度比例:

  1. <table id="mainTable" title="项目列表" class="easyui-datagrid" url="CoreServlet?method=getProjectPage" pagination="true"
  2. singleSelect="true" fitColumns="true">
  3. <thead>
  4. <tr>
  5. <th data-options="field:'id',width:50">序号</th>
  6. <th data-options="field:'type',width:50">类型</th>
  7. <th data-options="field:'name',width:50">名称</th>
  8. <th data-options="field:'about',width:100">简介</th>
  9. </tr>
  10. </thead>
  11. </table>

最终效果如下,大功告成:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,217人围观)

还没有评论,来说两句吧...

相关阅读