bootstrap table使用(下)——服务端分页

本文接上一篇客户端分页,如果想看客户端分页,请点这里。 接下来继续服务端分页,首先还是先来几个地址:bootstrap table中文文档bootstrap table使用介绍JqueryAPIbootstrap官网
首先,还是先贴出test.jsp和test.js文件:

test.jsp文件代码

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<c:set var="baseurl" value="${pageContext.request.contextPath}/"/>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="${baseurl }/bootstrap/css/bootstrap.min.css"/>
<link rel="stylesheet" href="${baseurl }/bootstrap/css/bootstrap-table.css"/>
<script src="${baseurl }/jquery/jquery.min.js"></script>
<script src="${baseurl }/bootstrap/js/bootstrap-table.js"></script>
<script src="${baseurl }/bootstrap/js/bootstrap-table-zh-CN.js"></script>
<script src="${baseurl }/scripts/test.js"></script>
<title>test</title>
</head>
<body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-12">

                <div>

                    <div class="center-block" style="width: 240px;">
                        <input type="text" id="searchText" class="form-control pull-left glyphicon glyphicon-search" 
                                    style="width: 200px;" placeholder="角色名/是否可用">
                        <button id="searchBtn" class="btn btn-default glyphicon glyphicon-search"></button>
                    </div>

                    <div id="toolbar" class="btn-group">
                        <button type="button" class="btn btn-default glyphicon glyphicon-pencil" id="btn-add">新增</button>
                        <button type="button" class="btn btn-default glyphicon glyphicon-edit" id="btn-edit">编辑</button>
                        <button type="button" class="btn btn-default glyphicon glyphicon-remove" id="btn-del">删除</button>
                    </div>
                </div>

                <table id="test-table"></table>

            </div>
        </div>
    </div>
</body>
</html>
test.js文件代码

$(function() {

    /*load页面之后,加载数据*/
    initTable();

    /*点击删除*/
    $("#btn-del").click(function() {
        //逻辑
    });


    /*点击新增*/
    $("#btn-add").click(function() {
        //逻辑
    });

    /*
     * 点击编辑,弹出层  
     */
    $("#btn-edit").click(function() {
        //逻辑
    });


});



/* 改变可用状态available*/
function changeStatus(event) {
    //逻辑
}

/* 初始化表格 */
function initTable(){
    var rows = new Array();

    $('#role-table').bootstrapTable({
        method : 'POST',  //服务器数据的请求方式 'get' or 'post'
        contentType : "application/x-www-form-urlencoded",  //服务端分页,必须改成这个
        url : '/test/test/getList',  //服务器数据的加载地址
        dataType : 'json',  //服务器返回的数据类型
        cache : false, //设置禁用 AJAX 数据缓存
        pagination : true,   //设置为 true 会在表格底部显示分页条
        paginationLoop : false,  //设置分页条禁用循环的功能。
        sidePagination : "server",  //分页方式:client客户端分页,server服务端分页(*)
        searchOnEnterKey : true,  //启用搜索框时,设置true则当按下enter键触发搜索方法,否则自动触发
        striped : true,  //设置隔行变色效果
        clickToSelect : true,  //在点击行时,自动选择rediobox 和 checkbox
        queryParams : queryParams,  //请求服务器时附加的参数
        queryParamsType : '',   //设置为 'limit' 则会发送符合 RESTFul 格式的参数.
        minimumCountColumns : 2,  //当列数小于此值时,将隐藏内容列下拉框。
        paginationPreText : '上一页',
        paginationNextText : '下一页',
        pageNumber : 1,  //初始化加载第一页,默认第一页
        pageSize : 15,  //每页的记录行数(*)
        pageList : [5,10,15],  //可供选择的每页的行数(*)
        toolbar : '#toolbar',  //指定工具按钮组的容器
        toolbarAlign : 'right',  //指定 toolbar 水平方向的位置。'left' or 'right'
        uniqueId : "id",  //每一行的唯一标识,一般为主键列
        responseHandler : responseHandler,  //加载服务器数据之前的处理程序,可以用来格式化数据。  参数:res为从服务器请求到的数据。
        /*
         * 监听事件:行全选/多选/取消多选时需要改变样式——选中多行时不可编辑,只可删除
         */
        onCheckAll: function (rows) {  
            $("#btn-edit").attr("disabled","disabled");
        },
        onUncheckAll: function (rows) {  
            $("#btn-edit").removeAttr("disabled");
        },
        onCheck: function (row) {  
            rows.push(row);
            if (rows.length > 1) {
                $("#btn-edit").attr("disabled","disabled");
            } else {
                $("#btn-edit").removeAttr("disabled");
            }
        },
        onUncheck: function (row) {  
            removeByValue(rows,row);
            if (rows.length > 1) {
                $("#btn-edit").attr("disabled","disabled");
            } else {
                $("#btn-edit").removeAttr("disabled");
            }
        },
        columns: [
        {
            selectItemName :'btSelectItem',
            checkbox:true,
            align : 'center',
            valign : 'middle'
        },{
            field : 'id',
            title : '序号',
            visible:false,
            align : 'center',
            valign : 'middle'
        },{
            field : 'roleName',
            title : '角色名',
            align : 'center',
            valign : 'middle'
        },{
            field : 'available',
            title : '是否可用',
            align : 'center',
            valign : 'middle',
            formatter:function(value,row,index){
                if (value == '0') {
                    return '是';
                } else if (value == '1') {
                    return '否';
                }
            }
        },{
            field : 'createTime',
            title : '创建时间',
            align : 'center',
            valign : 'middle'
        },{
            field : 'updateTime',
            title : '修改时间',
            align : 'center',
            valign : 'middle'
        },{
            field : 'available',
            title : '操作',
            align : 'center',
            valign : 'middle',
            formatter:function(value,row,index){
                if (value == '0') {
                    return '<button type="button" class="btn btn-link btn-sm" onclick="changeStatus(this);">禁用</button>';
                } else if (value == '1') {
                    return '<button type="button" class="btn btn-link btn-sm" onclick="changeStatus(this);">激活</button>';
                }
            }
        }]
    });
}
function refresh() {

    $("#test-table").bootstrapTable('refreshOptions',{url:'/test/test/getList'});

}
function queryParams(params) {
    //searchText 即搜索框输入的搜索条件
    var searchText = $("#searchText").val();
    if (searchText == '是') {
        searchText = '0';
    } else if (searchText == '否') {
        searchText = '1';
    }
    var param = {
      pageSize : this.pageSize, // 页面大小
      pageNumber : this.pageNumber, // 页码
      searchText : searchText
    }
    return param;
}
function responseHandler(res) { 
    if (res) {
        return {
            "rows" : res.result,
            "total" : res.total
        };
    } else {
        return {
            "rows" : [],
            "total" : 0
        };
    }
}
function removeByValue(arr, val) {
  for(var i=0; i<arr.length; i++) {
    if(arr[i] == val) {
      arr.splice(i, 1);
      break;
    }
  }
}

既然是服务端分页,那么后台自然就需要写分页功能的代码了。这个例子查询角色列表,所以先建一个角色实体类

package com.hanjc.test.entity;

import java.io.Serializable;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;
/**
 * 角色实体类
 * @author hanjc
 */
public class Role implements Serializable{
    private static final long serialVersionUID = 4806557312064805277L;
    private int    id;                //主键,自增数字
    private String roleName;          //角色名称
    private String available;         //是否可用:0可用;1不可用
    private Date   createTime;        //创建时间
    private Date   updateTime;        //更新时间
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
    public String getAvailable() {
        return available;
    }
    public void setAvailable(String available) {
        this.available = available;
    }
    public Date getCreateTime() {
        return createTime;
    }
    /*
    * 格式化日期字符串
    */
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")  
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getUpdateTime() {
        return updateTime;
    }
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")  
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

}

然后定义一个分页类,保存分页相关的参数

package com.hanjc.test.vo;

import java.util.List;

public class Pagination {

    private int pageSize;          //页面大小,即查询时偏移量
    private int pageNumber;         //页码

    private int first;             //第一条

    private String searchText;        //搜索参数

    private int total;              //查询总条数

    private List<?> result;        //查询结果

    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getPageNumber() {
        return pageNumber;
    }
    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }
    public int getFirst() {
        return first;
    }
    public void setFirst(int first) {
        this.first = first;
    }
    public String getSearchText() {
        return searchText;
    }
    public void setSearchText(String searchText) {
        this.searchText = searchText;
    }
    public int getTotal() {
        return total;
    }
    public void setTotal(int total) {
        this.total = total;
    }
    public List<?> getResult() {
        return result;
    }
    public void setResult(List<?> result) {
        this.result = result;
    }

}

接下来就是业务代码了,首先controller层:

package com.hanjc.test.controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.hanjc.test.service.RoleService;
import com.hanjc.test.vo.Pagination;
/**
 * Controller层
 * @author hanjc
 */
@Controller
@RequestMapping("/test")
public class RoleController {
    @Resource
    private RoleService roleService;

    /**
     * @param request
     */
    @RequestMapping("/getList")  
    @ResponseBody
    public Pagination getList(HttpServletRequest request) {
        return roleService.getList(request);
    }
}

service层

package com.hanjc.test.service;

import javax.servlet.http.HttpServletRequest;

import com.hexinyy.jzkfgl.vo.Pagination;

public interface RoleService {
    Pagination getList(HttpServletRequest request);
}
package com.hanjc.test.service.impl;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Service;

import com.hanjc.test.common.pagination.PageUtil;
import com.hanjc.test.dao.RoleDAO;
import com.hanjc.test.entity.Role;
import com.hanjc.test.service.RoleService;
import com.hanjc.test.vo.Pagination;
/**
 * Service层
 * @author hanjc
 */
@Service
public class RoleServiceImpl implements RoleService {
    @Resource
    private RoleDAO roleDAO;

    @Override
    public Pagination getList(HttpServletRequest request) {
        //PageUtil是抽取出来的设置分页查询参数的类
        Pagination pageParam = PageUtil.getPageParam(request);//获取分页查询 数据参数
        Pagination countParam = PageUtil.getCountParam(request);//获取分页查询 总条数参数
        //查询list和总条数
        List<Role> list = roleDAO.getList(pageParam);
        int total = roleDAO.getPageCount(countParam);
        //设置分页
        Pagination pagination = new Pagination();
        pagination.setTotal(total);
        pagination.setResult(list);

        return pagination;
    }
}

dao层接口:

package com.hanjc.test.dao;

import java.util.List;

import com.hanjc.test.entity.Role;
import com.hanjc.test.vo.Pagination;

public interface RoleDAO {
    List<Role> getList(Pagination pagination);
    int getPageCount(Pagination pagination);
}

mysql数据表和mapper.xml文件就不贴了,无非一些sql语句,下面是PageUtil类:

package com.hanjc.test.common.pagination;

import javax.servlet.http.HttpServletRequest;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.hanjc.test.common.exception.BusinessException;
import com.hanjc.test.common.exception.EMsgCfg;
import com.hanjc.test.vo.Pagination;

/**
 * 分页工具类
 * @author hanjc
 */
public class PageUtil {

    private static Logger logger = LogManager.getLogger(PageUtil.class.getName());

    /*
     * 查询数据设置参数,包括pSize ,pNumber 和查询条件searchText
     * mysql 分页查询  limit (pSize*(pNumber-1)+1),pSize;
    */
    public static Pagination getPageParam(HttpServletRequest request) {

        String pSize = request.getParameter("pageSize");
        String pNumber = request.getParameter("pageNumber");
        String searchText = request.getParameter("searchText");

        Pagination pagination = null;
        try {

            if (pSize == null || pSize.equals("") || pNumber == null || pNumber.equals("")) {
                //自定义异常:分页参数错误
                throw new BusinessException(EMsgCfg.PAGE_PARAM_ERROR);
            }
            int pageSize = Integer.parseInt(pSize);
            int pageNumber = Integer.parseInt(pNumber);
            int first = pageSize*(pageNumber - 1);

            pagination = new Pagination();

            pagination.setFirst(first);
            pagination.setPageSize(pageSize);

            if (searchText != null && !searchText.equals("")) {
                pagination.setSearchText(searchText);
            }

        } catch (ClassCastException e) {
            logger.error("类型转换错误!",e);
        } catch (Exception e) {
            logger.error(e);
        }
        return pagination;
    }

    /*
    * 设置查询总条数参数,searchText 
    */
    public static Pagination getCountParam(HttpServletRequest request) {

        String searchText = request.getParameter("searchText");
        Pagination pagination = new Pagination();

        if (searchText != null && !searchText.equals("")) { 
            pagination.setSearchText(searchText);
        } 
        return pagination;
    }

}

到这里分页的功能就算完了,希望对大家有参考价值。
马上就放假了,归心似箭呀哈哈,祝所有码农们新年快乐,回家不用修电脑!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值