SpringBoot2整合Datatables1.10.19实战(前端分页)

什么是Datatables?

Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。目前最新版本为1.10.19。

  • 分页,即时搜索和排序(支持前端或后端分页)
  • 几乎支持任何数据源:DOM, javascript, Ajax 和 服务器处理
  • 支持不同主题 DataTables, jQuery UI, Bootstrap, Foundation
  • 各式各样的扩展: Editor, TableTools, FixedColumns ……
  • 丰富多样的option和强大的API
  • 支持国际化
  • 超过2900+个单元测试
  • 免费开源 ( MIT license )

官方网站

Datatables官网
Datatables中文网

个人点评

Datatables是本人非常喜欢超级喜欢的一个表格控件,比BoostrapTable好用一些。从2013年接触至今,一直在用,喜爱有加,风格自适应性很强大,经理几代UI洗礼依据坚挺,网上会有多种配置,选择一份即可。对于少量数据,建议前端自动分页,效果更完美。对于大量数据,建议后台手工分页,加载更快。

CDN引用

静态文件方面,尽量不用放自己app服务器上,用cdn更快更轻

<script src="//cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
<link href="//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" rel="stylesheet">
<script src="//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>

核心HTML代码

只要定义一个table,且指定id就行

 <table id="dataTable" class="display">
                <thead>
                <tr>
                    <!--<th><input type="checkbox" id="checkAll"></th>-->
                    <th>ID</th>
                    <th>题目</th>
                    <th>答案列表</th>
                    <th>可选答案</th>
                    <th>正确答案</th>
                    <th>答案解析</th>
                </tr>
                </thead>
</table><br>

核心JS代码

作为一个js/jq插件,初始化当然是由js来控制,当然也是配置的核心地方。这里仅用与前端自动分页配置,后台分页的,稍后的文章会介绍。

<script type="text/javascript">
    var oTable;

    $(document).ready(function(){
        oTable = $('#dataTable').DataTable( {
            //定义请求,如果用freemarker,则base_url可这样定义
            //var base_url = '${request.contextPath}';其他的自己根据实际情况改
            "ajax": base_url+"/qa/question/page",
            //定义字段
            "columns": [
                { "data": "questionId" },
                { "data": "questionDesc" },
                { "data": "selectJson" },
                { "data": "selectList" },
                { "data": "correctAnswer" },
                { "data": "explainStr" }
            ],
            //定义语言,不写也可以,就会变英文。
            "oLanguage": { //国际化配置
                "sProcessing" : "正在获取数据,可能网速不够快,请稍候...",
                "sLengthMenu" : "显示 _MENU_ 条/页",
                "sZeroRecords" : "没有您要搜索的内容",
                "sInfo" : "从 _START_ 到  _END_ 条记录 总记录数为 _TOTAL_ 条",
                "sInfoEmpty" : "记录数为0",
                "sInfoFiltered" : "(全部记录数 _MAX_ 条)",
                "sInfoPostFix" : "",
                "sSortClasses": false,
                "sSearch" : "搜索",
                "sUrl" : "",
                "oPaginate": {
                    "sPrevious" : "上一页",
                    "sNext" : "下一页"
                }
            }
        } );
    });
</script>

JPA后台核心代码

前端分页中,后端核心返回部分,只要包含data即可,其他全部交给前端分页。

@RestController
@RequestMapping("/qa")
public class QaController {
		@GetMapping("/question/page")
	    public Object questionPage(String classId, String seriaId, String seriaInnerId, String questionId, String sSearch, Integer pageNumber, Integer pageSize) {
	        //默认从第一页开始查
	        if (pageNumber == null || pageSize == null || pageNumber == 0 || pageSize == 0) {
	            pageNumber = 1;
	            pageSize = 999;
	        }
	        List<Question> list = questionRepository.findAllList(classId, seriaId, seriaInnerId, questionId, sSearch, (pageNumber - 1) * pageSize, pageSize);
	        //如果你不需要参数,直接用findAll即可,否则就自己写个分页,更好用。
	        //List<Question> list = questionRepository.findAll();
	        Map<String,Object> returnMap=new HashMap<>();
	        returnMap.put("data",list);
	        return returnMap;
	    }
 }

JPA方面,自己写一个手工分页。或者,直接使用JPA的xxxx.findAll()即可

public interface QuestionRepository extends JpaRepository<Question,Integer> {
    @Query(value ="select * from question t "
            + " where (t.question_desc like CONCAT('%',?5,'%') or ?5 is null ) "
            + " and (t.class_id=?1 or ?1 is null) "
            + " and (t.seria_id=?2 or ?2 is null) "
            + " and (t.seria_inner_id=?3 or ?3 is null) "
            + " and (t.question_id=?4 or ?4 is null) "
            + " order by t.class_id asc  limit ?6,?7 ",nativeQuery = true)
    List<Question> findAllList(String classId, String seriaId, String seriaInnerId, String  questionId, String sSearch, int pageNumber, int pageSize);

实战效果

这里只是页面的一部分,当然,你可以加上很多搜索框,例如选定日期,等等。前端分页内置的搜索框也是超级给力,数据量少的情况下,效果特好。(数据量少指少于1w条记录,一般几百到几千都没问题,大于1w的,果斷走后端分页)
在这里插入图片描述
浏览器请求
在这里插入图片描述
postman模拟浏览器请求,前端分页需求的参数教简单,后台只需要返回{"data":[{"xxx":"xxx"},{"xxx":"xxx"}]}
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值