博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Web分页设计实现,基于pager-taglib+Filter
阅读量:6977 次
发布时间:2019-06-27

本文共 7805 字,大约阅读时间需要 26 分钟。

  hot3.png

    在web开发中,分页是必不可少的一部分,而且很多页面都会用到,所以将其公有化是一件很重要的事情

    先看看示例效果:

    
    DEMO 1:
    
     152131_uL5E_1539122.png

    DEMO 2:

    152534_eLag_1539122.png

    DEMO 3

    153149_yf3T_1539122.png

代码示例:

使用了jstl标签<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

导入js

DEMO 1代码
    a_name:
    b_name:
    
    
                    
名字              
数值                          
                    
${data.name }              
${data.value }                                  
    
    
    
    

这里使用了jsp标签jsp:include,动态包含pager.jsp页,即分页部分抽取到了pager.jsp页面,只要为pager.jsp提供两个必须参数即可,修改分页样式时也只需修改pager.jsp里的每个a标签的样式即可

url;请求数据URL

items:总共记录数

params(可选):分页组件额外的参数,当无form标签时很有用

    
    
    
    

pager.jsp的代码,可根据自行需要进行相应修改

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg" %>  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%=request.getParameter("url")%>'>
<%=request.getParameter("items")%>'><%String[] params = request.getParameterValues("params");if(params != null){    Map
 map = new HashMap
();    for(String param:params){        String[] strs= param.split(":");        map.put(strs[0], strs[1]);    }    pageContext.setAttribute("params", map);}%>
      
        
            
            
            
                            
共有${items }条记录         
当前第${currentPageNumber }页/共${pages }页        
首页
        
前一页
        
            
            
                
${pageNumber }                        
                
${pageNumber }            
            
        
        
            
后一页        
        
            
尾页        
        
        
        
        
跳转              

pager-taglib.js的代码:

// pager-taglib.jar/** * 更改分页的请求方式,使之支持POST提交方式,当有FORM标签时为FORM标签的提交方式,否则为GET提交方式 * 使用时,只需在原来的每个标签上添加单击事件即可 * 一般:onclick="return setOffset(this,${pageNumber })?pageSubmit(this):true;" * 跳转:onclick="return tj(this)?pageSubmit(this):false;" */function getParentDOM(obj){    var parent = obj.parentNode;    if(parent.nodeName.toLowerCase()=="body"){        return document;    }    var className = parent.getAttribute("class");    if(className.indexOf("pager-taglib")==-1){        return getParentDOM(parent);    }    return parent;}/** * 一、跳转 * 二、设置submit提交时的pageOffset的值 */function tj(obj){    var parent = getParentDOM(obj);    var inputs = parent.getElementsByTagName('input');    var len = inputs.length;    var offsetInput = inputs[len-2];    var pageUrl = obj.getAttribute("href");    var pageInput = inputs[len-1];    var pagesize = pageInput.getAttribute("pagesize");    var pageCount = pageInput.getAttribute("pageCount");    var oldOffsetValue = pageInput.getAttribute("pageOffset");    var oldPageValue = pageInput.getAttribute("number");    var newPageValue = pageInput.value;    if(parseInt(newPageValue)<=0||parseInt(newPageValue)>pageCount){        alert('索引超出范围!');        pageInput.value = oldPageValue;        pageInput.focus();        return false;    }    var newoffsetValue = (newPageValue-1)*pagesize;    var newPageUrl = pageUrl.replace("pager.offset="+oldOffsetValue,"pager.offset="+newoffsetValue);    obj.setAttribute("href",newPageUrl)    offsetInput.value=newoffsetValue;    return true;}/** * 提交页面 * @param obj 当前事件对象 * @returns */function pageSubmit(obj){    var formDom = obj.parentNode;    if(formDom.nodeName.toLowerCase()=='form'){        formDom.submit();    } else {        if(formDom.nodeName.toLowerCase()=='body'){            return true;        }        return pageSubmit(formDom);    }    return false;}/** * 设置submit提交时的pageOffset的值 */function setOffset(obj,pageNumber){    var parent = getParentDOM(obj);    var inputs = parent.getElementsByTagName('input');    var len = inputs.length;    var pageInput = inputs[len-1];    var offsetInput = inputs[len-2];        var pagesize = pageInput.getAttribute("pagesize");;    var newoffsetValue = (pageNumber-1)*pagesize;    offsetInput.value=newoffsetValue;    return true;}

以上就是前台的设计了,下面给出后端代码:

过滤器代码:

package pager;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;public class PagerFilter implements Filter {    public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest) req;                int offset = this.getOffset(request);        int pagesize = this.getPagesize(request);        SystemContext.setOffset(offset);        SystemContext.setPageSize(pagesize);                request.setAttribute("offset", offset);        request.setAttribute("pagesize", pagesize);                try {            chain.doFilter(request, resp);        } finally {            SystemContext.removeOffset();            SystemContext.removePageSize();        }    }    protected int getOffset(HttpServletRequest request) {        int offset = SystemContext.getOffset();        String strOffset = request.getParameter("pager.offset");                try {            if (strOffset != null && !"".equals(strOffset)) {                offset = Integer.parseInt(strOffset);            }        } catch (NumberFormatException e) {e.printStackTrace();}                return offset;    }        protected int getPagesize(HttpServletRequest request) {        int pagesize = SystemContext.getPageSize();        String strPagesize = request.getParameter("pagesize");                try {            if (strPagesize != null && !"".equals(strPagesize)) {                pagesize = Integer.parseInt(strPagesize);            }        } catch (NumberFormatException e) {e.printStackTrace();}                return pagesize;    }        public void destroy() {}    public void init(FilterConfig arg0) throws ServletException {}}

其中的SystemContext是为了方便的DAO层的获取,具体代码:

package pager;public class SystemContext {        private static ThreadLocal
 _offset = new ThreadLocal
();    private static ThreadLocal
 _pagesize = new ThreadLocal
();        public static final int DEFAULT_PAGE_SIZE= 3;        public static void setOffset(Integer offset) {        _offset.set(offset);    }        public static void removeOffset() {        _offset.remove();    }        public static Integer getOffset() {        Integer offset  =  _offset.get();        if (offset  == null || offset < 0) {            return 0;        }        return offset;    }        public static void setPageSize(Integer pagesize) {        _pagesize.set(pagesize);    }        public static void removePageSize() {        _pagesize.remove();    }        public static Integer getPageSize() {        Integer pagesize  =  _pagesize.get();        if (pagesize  == null || pagesize < 0) {            return DEFAULT_PAGE_SIZE;        }        return pagesize;    }}

随便提供PageModel的代码,这个基本上都差不多

package pager;import java.util.List;public class PageModel
 {        private List
 list;        private int totalCount;    // 总记录数    private int listSize;    // 当前分页数据条数    private int pageCount;    // 页数    public PageModel() {        super();    }        public PageModel(List
 list, int totalCount) {        super();        this.setList(list);        this.totalCount = totalCount;    }    public List
 getList() {        return list;    }    public void setList(List
 list) {        this.list = list;        this.listSize = list.size();    }    public int getTotalCount() {        return totalCount;    }    public void setTotalCount(int totalCount) {        this.totalCount = totalCount;    }    public int getListSize() {        return listSize;    }    public int getPageCount() {        if(totalCount > 0){            int pageSize = SystemContext.getPageSize();            pageCount = (totalCount-1)/(pageSize)+1;        }        return pageCount;    }}

转载于:https://my.oschina.net/houke/blog/323198

你可能感兴趣的文章
novaclient的api调用流程与开发
查看>>
mvc导出数据到pdf
查看>>
iOS开源JSON解析库MJExtension
查看>>
第一本的java 的小总结
查看>>
集成支付宝钱包支付iOS SDK的方法与经验
查看>>
spring-data-mongodb必须了解的操作
查看>>
Android中的JSON详细总结
查看>>
[转载]分享WCF聊天程序--WCFChat
查看>>
程序员说话技巧大放送,受教了
查看>>
Linux指令--文件和目录属性
查看>>
PHP smarty缓存
查看>>
[数位dp] spoj 10738 Ra-One Numbers
查看>>
HDU 2206 IP的计算(字符串处理)
查看>>
您会让自己的小孩将来从事软件研发吗?
查看>>
【Maven】maven的安装配置和ecplise结合
查看>>
CHIL-SQL-MIN() 函数
查看>>
驾考试题的json代码
查看>>
黑马基础阶段测试题:通过字符输入流读取info.txt中的所有内容,每次读取一行,将每一行的第一个文字截取出来并打印在控制台上。...
查看>>
优秀博客
查看>>
iOS 开发 OC编程 数组冒泡排序.图书管理
查看>>