• SSM分页查询功能


    SSM分页查询功能

    看一下web.xml里配置是什么版本(这里为4.0)

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    </web-app>
    
    

    在pom.xml文件中添加pageHelper依赖(这里也要引入4.0左右的版本)

            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>4.1.6</version>
            </dependency>
    

    在spring-mapper.xml文件中配置pagehelper (在sqlSessionFactory的bean下面配置)

        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 注入数据库连接池 -->
            <property name="dataSource" ref="dataSource"/>
            <!-- 配置MyBabies全局配置文件:mybatis-config.xml -->
            <property name="configLocation" value="classpath:mybatis-config.xml"/>
    
            <!--  配置插件  -->
            <property name="plugins">
                <array>
                    <bean class="com.github.pagehelper.PageHelper">
                        <!-- 配置PageHelper插件 -->
                        <property name="properties">
                            <props>
                                <!-- 配置数据库方言,告诉PageHelper当前使用的数据库 -->
                                <prop key="dialect">mysql</prop>
                                <!-- 配置页码的合理化修正,在1~总页数之间修正页码 -->
                                <prop key="reasonable">true</prop>
                            </props>
                        </property>
                    </bean>
                </array>
            </property>
        </bean>
    

    引入pagination.css

    @charset "utf-8";      
    .pagination a {
        text-decoration: none;
    	border: 1px solid #AAE;
    	color: #15B;
    }
    
    .pagination a, .pagination span {
        display: inline-block;
        padding: 0.1em 0.4em;
        margin-right: 5px;
    	margin-bottom: 5px;
    }
    
    .pagination .current {
        background: #26B;
        color: #fff;
    	border: 1px solid #AAE;
    }
    
    .pagination .current.prev, .pagination .current.next{
    	color:#999;
    	border-color:#999;
    	background:#fff;
    }
    
    
    

    引入jquery.pagination.js文件

    /**
     * This jQuery plugin displays pagination links inside the selected elements.
     *
     * @author Gabriel Birke (birke *at* d-scribe *dot* de)
     * @version 1.2
     * @param {int} maxentries Number of entries to paginate
     * @param {Object} opts Several options (see README for documentation)
     * @return {Object} jQuery Object
     */
    jQuery.fn.pagination = function(maxentries, opts){
    	opts = jQuery.extend({
    		items_per_page:10,
    		num_display_entries:10,
    		current_page:0,
    		num_edge_entries:0,
    		link_to:"#",
    		prev_text:"Prev",
    		next_text:"Next",
    		ellipse_text:"...",
    		prev_show_always:true,
    		next_show_always:true,
    		callback:function(){return false;}
    	},opts||{});
    	
    	return this.each(function() {
    		/**
    		 * 计算最大分页显示数目
    		 */
    		function numPages() {
    			return Math.ceil(maxentries/opts.items_per_page);
    		}	
    		/**
    		 * 极端分页的起始和结束点,这取决于current_page 和 num_display_entries.
    		 * @返回 {数组(Array)}
    		 */
    		function getInterval()  {
    			var ne_half = Math.ceil(opts.num_display_entries/2);
    			var np = numPages();
    			var upper_limit = np-opts.num_display_entries;
    			var start = current_page>ne_half?Math.max(Math.min(current_page-ne_half, upper_limit), 0):0;
    			var end = current_page>ne_half?Math.min(current_page+ne_half, np):Math.min(opts.num_display_entries, np);
    			return [start,end];
    		}
    		
    		/**
    		 * 分页链接事件处理函数
    		 * @参数 {int} page_id 为新页码
    		 */
    		function pageSelected(page_id, evt){
    			current_page = page_id;
    			drawLinks();
    			var continuePropagation = opts.callback(page_id, panel);
    			if (!continuePropagation) {
    				if (evt.stopPropagation) {
    					evt.stopPropagation();
    				}
    				else {
    					evt.cancelBubble = true;
    				}
    			}
    			return continuePropagation;
    		}
    		
    		/**
    		 * 此函数将分页链接插入到容器元素中
    		 */
    		function drawLinks() {
    			panel.empty();
    			var interval = getInterval();
    			var np = numPages();
    			// 这个辅助函数返回一个处理函数调用有着正确page_id的pageSelected。
    			var getClickHandler = function(page_id) {
    				return function(evt){ return pageSelected(page_id,evt); }
    			}
    			//辅助函数用来产生一个单链接(如果不是当前页则产生span标签)
    			var appendItem = function(page_id, appendopts){
    				page_id = page_id<0?0:(page_id<np?page_id:np-1); // 规范page id值
    				appendopts = jQuery.extend({text:page_id+1, classes:""}, appendopts||{});
    				if(page_id == current_page){
    					var lnk = jQuery("<span class='current'>"+(appendopts.text)+"</span>");
    				}else{
    					var lnk = jQuery("<a>"+(appendopts.text)+"</a>")
    						.bind("click", getClickHandler(page_id))
    						.attr('href', opts.link_to.replace(/__id__/,page_id));		
    				}
    				if(appendopts.classes){lnk.addClass(appendopts.classes);}
    				panel.append(lnk);
    			}
    			// 产生"Previous"-链接
    			if(opts.prev_text && (current_page > 0 || opts.prev_show_always)){
    				appendItem(current_page-1,{text:opts.prev_text, classes:"prev"});
    			}
    			// 产生起始点
    			if (interval[0] > 0 && opts.num_edge_entries > 0)
    			{
    				var end = Math.min(opts.num_edge_entries, interval[0]);
    				for(var i=0; i<end; i++) {
    					appendItem(i);
    				}
    				if(opts.num_edge_entries < interval[0] && opts.ellipse_text)
    				{
    					jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
    				}
    			}
    			// 产生内部的些链接
    			for(var i=interval[0]; i<interval[1]; i++) {
    				appendItem(i);
    			}
    			// 产生结束点
    			if (interval[1] < np && opts.num_edge_entries > 0)
    			{
    				if(np-opts.num_edge_entries > interval[1]&& opts.ellipse_text)
    				{
    					jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
    				}
    				var begin = Math.max(np-opts.num_edge_entries, interval[1]);
    				for(var i=begin; i<np; i++) {
    					appendItem(i);
    				}
    				
    			}
    			// 产生 "Next"-链接
    			if(opts.next_text && (current_page < np-1 || opts.next_show_always)){
    				appendItem(current_page+1,{text:opts.next_text, classes:"next"});
    			}
    		}
    		
    		//从选项中提取current_page
    		var current_page = opts.current_page;
    		//创建一个显示条数和每页显示条数值
    		maxentries = (!maxentries || maxentries < 0)?1:maxentries;
    		opts.items_per_page = (!opts.items_per_page || opts.items_per_page < 0)?1:opts.items_per_page;
    		//存储DOM元素,以方便从所有的内部结构中获取
    		var panel = jQuery(this);
    		// 获得附加功能的元素
    		this.selectPage = function(page_id){ pageSelected(page_id);}
    		this.prevPage = function(){ 
    			if (current_page > 0) {
    				pageSelected(current_page - 1);
    				return true;
    			}
    			else {
    				return false;
    			}
    		}
    		this.nextPage = function(){ 
    			if(current_page < numPages()-1) {
    				pageSelected(current_page+1);
    				return true;
    			}
    			else {
    				return false;
    			}
    		}
    		// 所有初始化完成,绘制链接
    		drawLinks();
            // 回调函数
            // opts.callback(current_page, this);
    	});
    }
    
    
    
    

    mapper层:AdminMapper

    package com.lyc.mapper;
    public interface AdminMapper {
        List<Admin> selectAdminByKeyword(String keyword);
    }
    

    mapper层:AdminMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.lyc.mapper.AdminMapper">
        <resultMap id="BaseResultMap" type="com.lyc.pojo.Admin">
            <id column="id" jdbcType="INTEGER" property="id"/>
            <result column="login_acct" jdbcType="VARCHAR" property="login_acct"/>
            <result column="user_pswd" jdbcType="CHAR" property="user_pswd"/>
            <result column="user_name" jdbcType="VARCHAR" property="user_name"/>
            <result column="email" jdbcType="VARCHAR" property="email"/>
            <result column="create_time" jdbcType="CHAR" property="create_time"/>
        </resultMap>
        <select id="selectAdminByKeyword" resultMap="BaseResultMap">
            select id, login_acct, user_pswd, user_name, email, create_time
            from t_admin
            where login_acct like concat("%",#{keyword},"%")
               or user_pswd like concat("%",#{keyword},"%")
               or email like concat("%",#{keyword},"%")
        </select>
    </mapper>
    

    service层:AdminService

    package com.lyc.service;
    public interface AdminService {
        PageInfo<Admin> getPageInfo(String keyword, Integer pageNum, Integer pageSize);
    }
    
    

    service层:AdminServiceImpl

    package com.lyc.service;
    @Service("adminService")
    public
    class AdminServiceImpl implements AdminService{
        @Autowired
        private AdminMapper adminMapper;
    
        public void setAdminMapper(AdminMapper adminMapper) {
            this.adminMapper = adminMapper;
        }
        @Override
        public PageInfo<Admin> getPageInfo(String keyword, Integer pageNum, Integer pageSize) {
    
            //1.调用PageHelper的静态方法开启分页
            // 这里充分体现了pagehelper的“非侵入式”设计:原本要做的查询不必有任何修改
            PageHelper.startPage(pageNum, pageSize);
    
            //2.执行查询
            List<Admin> list = adminMapper.selectAdminByKeyword(keyword);
    
            //3.封装到PageInfo对象中
            return new PageInfo<>(list);
        }
    }
    
    

    controller层:AdminController

    package com.lyc.controller;
    @Controller
    public class AdminController {
        @Autowired
        private AdminService adminService;
        /**
         * 分页查询或模糊查询
         * @param keyword 关键字
         * @param pageNum 当前页
         * @param pageSize 总页数
         * @param map 为jsp层传递信息
         * @return
         */
        @RequestMapping("/admin/get/page.html")
        public String getPageInfo(
                // 使用@RequestParam注解的defaultValue属性,指定默认值,在请求中没有携带对应参数时使用默认值
                // keyword默认值使用空字符串,和SQL语句配合实现里昂中法情况适配
                @RequestParam(value = "keyword",defaultValue = "") String keyword,
                // pageNum默认值使用1
                @RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum,
                // pageSize默认值使用1
                @RequestParam(value = "pageSize",defaultValue = "5") Integer pageSize,
                ModelMap map
        ){
            // 调用Service方法获取PageHelper对象
            PageInfo<Admin> pageInfo = adminService.getPageInfo(keyword, pageNum, pageSize);
            // 将PageInfo对象存入模型
            map.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);
            return "admin-page";
        }
    }
    
    

    jsp层:admin-page.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html lang="zh-CN">
    <%@include file="include-head.jsp" %>
    <link rel="stylesheet" href="../css/pagination.css"/>
    <script type="text/javascript" src="../jquery/jquery.pagination.js"></script>
    <script type="text/javascript">
        $(function () {
            // 调用后面声明的函数对页码导航条
            initPagination();
        });
    
        function initPagination() {
            // 获取总记录数
            let totalRecord = ${requestScope.pageInfo.total};
            // 声明一个JSON对象存储Pagination要设置的属性
            let properties = {
                num_edge_entries: 3, // 边缘页数
                num_display_entries: 5, // 主体页数
                callback: pageSelectCallback,// 指定用户点击“翻页”的按钮时跳转页面的回调函数
                items_per_page:${requestScope.pageInfo.pageSize}, // 每页显示?项
                current_page: ${requestScope.pageInfo.pageNum - 1}, // 当前页(Pagination内部使用pageIndex来管理页码,pageIndex从0开始,pageNum从1开始,所以要-1)
                prev_text: "上一页", // 上一页按钮上显示的文本
                next_text: "下一页"  // 下一页按钮上显示的文本
            }
            // 生成页码导航条
            $("#Pagination").pagination(totalRecord, properties);
        }
    
        // 回调函数的含义:声明出来以后不是自己调用,而是交给系统或框架调用
        // 用户点击“上一页、下一页、1、2、3…”这样的页码时调用这个函数实现页面跳转
        // pageIndex是Pagination传给我们的那个“从0开始”的页码
        function pageSelectCallback(pageIndex, jQuery) {
            // 根据pageIndex计算得到pageNum
            let pageNum = pageIndex + 1;
            //跳转页面
            window.location.href = "admin/get/page.html?pageNum=" + pageNum + "&keyword=${param.keyword}";
            //由于每一个页码按钮都是超链接,所以在这个函数最后取消超链接的默认行为
            return false;
        }
    </script>
    
    <body>
    <%@include file="include-nav.jsp" %>
    <div class="container-fluid">
        <div class="row">
            <%@include file="include-sidebar.jsp" %>
            <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title"><i class="glyphicon glyphicon-th"></i> 数据列表</h3>
                    </div>
                    <div class="panel-body">
                        <form action="admin/get/page.html" method="post" class="form-inline" role="form"
                              style="float:left;">
                            <div class="form-group has-feedback">
                                <div class="input-group">
                                    <div class="input-group-addon">查询条件</div>
                                    <input name="keyword" class="form-control has-success" type="text"
                                           placeholder="请输入查询条件">
                                </div>
                            </div>
                            <button type="submit" class="btn btn-warning"><i class="glyphicon glyphicon-search"></i> 查询
                            </button>
                        </form>
                        <button type="button" class="btn btn-danger" style="float:right;margin-left:10px;"><i
                                class=" glyphicon glyphicon-remove"></i> 删除
                        </button>
                        <button type="button" class="btn btn-primary" style="float:right;"
                                onclick="window.location.href='/admin/to/addAcct/page.html'"><i
                                class="glyphicon glyphicon-plus"></i> 新增
                        </button>
                        <br>
                        <hr style="clear:both;">
                        <div class="table-responsive">
                            <table class="table  table-bordered">
                                <thead>
                                <tr>
                                    <th width="30">#</th>
                                    <th width="30"><input type="checkbox"></th>
                                    <th>账号</th>
                                    <th>名称</th>
                                    <th>邮箱地址</th>
                                    <th>注册时间</th>
                                    <th width="100">操作</th>
                                </tr>
                                </thead>
                                <tbody>
                                <c:if test="${empty requestScope.pageInfo.list}">
                                    <tr>
                                        <td colspan="6" align="center">抱歉!没有查询到你要的数据</td>
                                    </tr>
                                </c:if>
                                <c:if test="${!empty requestScope.pageInfo.list}">
                                    <c:forEach items="${requestScope.pageInfo.list}" var="admin" varStatus="myStatus">
                                        <tr>
                                            <td>${myStatus.count}</td>
                                            <td><input type="checkbox"></td>
                                            <td>${admin.login_acct}</td>
                                            <td>${admin.user_name}</td>
                                            <td>${admin.email}</td>
                                            <td>${admin.create_time}</td>
                                            <td>
                                                <button type="button" class="btn btn-success btn-xs"><i
                                                        class=" glyphicon glyphicon-check"></i></button>
                                                <button type="button" class="btn btn-primary btn-xs"><i
                                                        class=" glyphicon glyphicon-pencil"></i></button>
                                                <a href="admin/remove/${admin.id}/${requestScope.pageInfo.pageNum}/${param.keyword}.html" class="btn btn-danger btn-xs">
                                                    <i class=" glyphicon glyphicon-remove"></i></a>
                                            </td>
                                        </tr>
                                    </c:forEach>
                                </c:if>
                                </tbody>
                                <tfoot>
                                <tr>
                                    <td colspan="6" align="center">
                                        <div id="Pagination" class="pagination"><!-- 这里显示分页 --></div>
                                    </td>
                                </tr>
                                </tfoot>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </div>
    </body>
    </html>
    

    效果展示:

  • 相关阅读:
    作为另一个函数的值(读书摘)
    算法-二分查找与二叉排序树
    算法-图
    算法-二叉树
    算法-分治
    算法-回溯
    算法-动态规划
    算法-贪心
    算法-堆
    算法-栈,队列
  • 原文地址:https://www.cnblogs.com/liuyunche/p/14789275.html
Copyright © 2020-2023  润新知