分页标签笔记

分页标签demo:
概要:主要记录分页的一些步骤,直接上栗子。
1丶在WEB-INF下的tld包下建立page.tld标签。
2丶建与标签对相的标签类,这里叫PageTagImpl.java
3丶建立一个PageBean对象用来与JSP打交道(包括初始化对象,可不建,不是必要的文件)
4丶JSP页面引入该分页标签。

1丶在WEB-INF下的tld包下建立page.tld标签。
这里写图片描述

2丶建与标签对相的标签类,这里叫PageTagImpl.java

public class PageTagImpl extends TagSupport {
    private static final long serialVersionUID = 1L;
    private static Logger logger = Logger.getLogger(PageTagImpl.class.getName());

    //当前页
    private Integer currentPage;
    //总页数
    private Integer totalPages;
    //是否有下一页
    private Boolean hasNext;
    //是否有上一页
    private Boolean hasPre;
    //显示的最大条目数
    private Integer maxShow = 10;

    //每一页显示的条目数
    private Integer pageSize;

    private String pageForm;

    @Override
    public int doStartTag() throws JspException {
        try {
            generationPageHTML();

        } catch (Exception e) {
            logger.error(e.getMessage(),e);
        }
        return EVAL_BODY_INCLUDE;
    }


    /**
    * @Title: generationPageHTML 
    * @Description: 生成分页的html
    * @throws IOException    参数 
    * void  返回类型 
    * @throws
     */
    private void generationPageHTML()
            throws IOException {
        StringBuffer out = new StringBuffer("<p pageForm=\""+pageForm+"\" id=\"pageControl\" class=\"page-bar\">");

        out.append("共").append(totalPages).append("页,每页显示:").append(pageSize).append("条");
        out.append("<a gopage=\"1\" href=\"###\"><em class=\"first-page\"></em></a>");

        int startPage = 1;
        int endPage = Math.min(maxShow, totalPages);
        if(totalPages>maxShow && currentPage>maxShow-1){
            int maxShowHalf = maxShow/2;
            startPage = currentPage - maxShowHalf;
            endPage = currentPage + maxShowHalf-1;
        }

        if(hasPre){
            out.append("<a gopage=\"-1\" href=\"###\"><em class=\"pre-page\"></em></a>");
        }
        String clasz = "";
        for(int index=startPage;index<=endPage;index++){
            if(index==currentPage){
                clasz = " class=\"cura\"";
            }else{
                clasz = "";
            }
            out.append("<a gopage=\""+index+"\" href=\"###\" "+clasz+">"+index+"</a>");
        }

        if(hasNext){
            out.append("<a gopage=\"-2\" href=\"###\"><em class=\"next-page\"></em></a>");
        }

        out.append("<a gopage=\""+totalPages+"\" href=\"###\"><em class=\"last-page\"></em></a>");
        out.append("<a href=\"###\"><em class=\"go-page\">GO</em></a>");
        //业务逻辑
        /**
         * <p class="page-bar">
                共20页,每页显示:10条
                <a href="###"><em class="first-page"></em></a>
                <a href="###"><em class="pre-page"></em></a>
                <a href="###">1</a>
                <a href="###" class="cura">2</a>
                <a href="###">3</a>
                <a href="###">4</a>
                <a href="###">5</a>
                <a href="###">6</a>
                <a href="###">7</a>
                <a href="###">8</a>
                <a href="###"><em class="next-page"></em></a>
                <a href="###"><em class="last-page"></em></a>
                <a href="###"><em class="go-page">GO</em></a>
            </p>
         */
        out.append("</p>");
        pageContext.getOut().write(out.toString());
    }


    public Integer getCurrentPage() {
        return currentPage;
    }


    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }


    public Integer getTotalPages() {
        return totalPages;
    }


    public void setTotalPages(Integer totalPages) {
        this.totalPages = totalPages;
    }


    public Boolean getHasNext() {
        return hasNext;
    }


    public void setHasNext(Boolean hasNext) {
        this.hasNext = hasNext;
    }




    public Boolean getHasPre() {
        return hasPre;
    }


    public void setHasPre(Boolean hasPre) {
        this.hasPre = hasPre;
    }


    public Integer getMaxShow() {
        return maxShow;
    }


    public void setMaxShow(Integer maxShow) {
        this.maxShow = maxShow;
    }


    public Integer getPageSize() {
        return pageSize;
    }


    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }


    public String getPageForm() {
        return pageForm;
    }


    public void setPageForm(String pageForm) {
        this.pageForm = pageForm;
    }



}

这个类的属性对应的是tid文件的每个属性,doStartTag()方法是为了向JSP页面输出你想要分页的格式内容,包括从数据库中的到的PageBean的属性设置。

3丶建立一个PageBean对象用来与JSP打交道(包括初始化对象,可不建,不是必要的文件)

public class PageBean {
    /**
     * 属性serialVersionUID
     */
    //每页显示条数
    public static final int PAGESIZE = 10;
    //当前页
    private int currentPage;
    //总页数
    public int totalPages;
    //每页显示条数
    private int pageSize;
    //总行数
    private int totalRows;
    //显示开始位置
    private int startNum;
    //显示结束位置
    private int endIndex;
    //下一页
    private int nextPage;
    //前一页
    private int previousPage;
    //查询记录数
    private int queryRecordSize;
    //是否有下一页
    private boolean hasNextPage;
    //是否有上一页
    private boolean hasPreviousPage;

    public PageBean() {
        this.currentPage = 1;
        this.pageSize = PAGESIZE;
        this.startNum =0;
        this.endIndex = PAGESIZE;
    }

    public void initMap(Map<String, Object> param){
        param.put("startNum", this.startNum);
        param.put("endIndex", this.endIndex);
    }

    public void initMap2(Map<String, String> param){
        param.put("startNum", this.startNum+"");
        param.put("endIndex", this.endIndex+"");
    }

    public PageBean(int totalRows) {
        this(totalRows, 1, PAGESIZE);
    }

    public PageBean(int totalRows, int currentPage) {
        this(totalRows, currentPage, PAGESIZE);
    }

    public PageBean(int totalRows, int currentPage, int pageSize) {
        this.currentPage = 1;

        this.totalPages = 0;

        this.pageSize = 0;

        this.totalRows = 0;

        this.startNum = 0;

        this.nextPage = 0;

        this.previousPage = 0;

        this.queryRecordSize = 10;

        this.hasNextPage = false;

        this.hasPreviousPage = false;

        this.pageSize = pageSize;
        this.currentPage = currentPage;
        this.totalRows = totalRows;
        this.endIndex = pageSize;
        repaginate();
    }

    public void repaginate() {
        if (this.totalRows % this.pageSize == 0) {
            this.totalPages = (this.totalRows / this.pageSize);
        } else {
            this.totalPages = (this.totalRows / this.pageSize + 1);
        }

        if (this.currentPage >= this.totalPages) {
            this.hasNextPage = false;
            this.currentPage = this.totalPages;
        } else {
            this.hasNextPage = true;
        }

        if (this.currentPage <= 1) {
            this.hasPreviousPage = false;
            this.currentPage = 1;
        } else {
            this.hasPreviousPage = true;
        }
        if(this.currentPage <= 1)
        {
            this.startNum = 0;
        }else
        {
            this.startNum = ((this.currentPage - 1) * this.pageSize + 1);
        }

        if(this.currentPage > 1 && this.currentPage != this.totalPages)
        {
            this.endIndex = this.currentPage * this.pageSize ;
        }else if(this.currentPage > 1 && this.currentPage == this.totalPages)
        {
            this.startNum = (this.currentPage - 1) * this.pageSize;
            this.endIndex = this.totalRows;
        }else
        {
            this.endIndex = this.pageSize ;
        }

        this.nextPage = (this.currentPage + 1);

        if (this.nextPage >= this.totalPages) {
            this.nextPage = this.totalPages;
        }

        this.previousPage = (this.currentPage - 1);

        if (this.previousPage <= 1) {
            this.previousPage = 1;
        }

        if (this.queryRecordSize != 0)
            return;
        this.queryRecordSize = this.pageSize;
    }

    public boolean isHasNextPage() {
        return this.hasNextPage;
    }

    public boolean isHasPreviousPage() {
        return this.hasPreviousPage;
    }

    public int getNextPage() {
        return this.nextPage;
    }

    public void setNextPage(int nextPage) {
        this.nextPage = nextPage;
    }

    public int getPreviousPage() {
        return this.previousPage;
    }

    public void setPreviousPage(int previousPage) {
        this.previousPage = previousPage;
    }

    public int getCurrentPage() {
        return this.currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
        this.startNum = pageSize*(this.currentPage-1)+1;
        this.endIndex = pageSize*(this.currentPage);
    }

    public int getPageSize() {
        return this.pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getTotalPages() {
        return this.totalPages;
    }

    public int getTotalRows() {
        return this.totalRows;
    }

    public void setTotalRows(int totalRows) {
        this.totalRows = totalRows;
    }

    public void setHasPreviousPage(boolean hasPreviousPage) {
        this.hasPreviousPage = hasPreviousPage;
    }

    public int getStartNum() {
        return this.startNum;
    }

    public void setStartNum(int startNum) {
        this.startNum = startNum;
    }

    public int getQueryRecordSize() {
        return this.queryRecordSize;
    }

    public void setQueryRecordSize(int queryRecordSize) {
        this.queryRecordSize = queryRecordSize;
    }

    public void setHasNextPage(boolean hasNextPage) {
        this.hasNextPage = hasNextPage;
    }

    public void setTotalPages(int totalPages) {
        this.totalPages = totalPages;
    }

    public int getEndIndex() {
        return endIndex;
    }

    public void setEndIndex(int endIndex) {
        this.endIndex = endIndex;
    }
}

这里的repaginate()方法是在serverImpl中调用,也就是说当你在数据库中查询出数据总数的时候就要重置PageBean里的各个属性,再将它传给Jsp。

serverImpl的调用:


public List<CollegeDto> searchPage(Map<String,String> map, PageBean pageBean) {
        pageBean.initMap2(map);
        List<CollegeDto> colleges = collegeDao.searchPage(map);
        if(!colleges.isEmpty()){
            pageBean.setTotalRows(colleges.get(0).getNums());
            pageBean.repaginate();
        }   
        return colleges;
    }

最后,在JSP页面给表单加一个标签调用即可。

JSP代码:

<form action="${ctx}/core/college.findCollegeDto.html" id="myPageForm">
                <input type="hidden" name="pageBean.currentPage" value="${pageBean.currentPage }">
            </form>
            <page:pageTag currentPage="${pageBean.currentPage }" 
                 totalPages="${pageBean.totalPages }" hasNext="${pageBean.hasNextPage }"
                 hasPre="${pageBean.hasPreviousPage }" pageSize="${pageBean.pageSize }"
                 maxShow="10" pageForm="myPageForm"></page:pageTag>

JS代码:
当点击下一页或者页码数时触发的事件,把当前页传入查询方法再一次查询。

$(function(){
            $("#pageControl").find("a").each(function(){
                $(this).click(function(){
                    var currentPage = $("input[name='pageBean.currentPage']").val();
                    var pageFormId = $("#pageControl").attr("pageForm");
                    var gopage = $(this).attr("gopage");
                    //alert(gopage);
                    if(gopage==-1){
                        currentPage = new Number(currentPage)-1;
                    }else if(gopage==-2){
                        currentPage = new Number(currentPage)+1;
                    }else{
                        currentPage = gopage;
                    }
                    $("input[name='pageBean.currentPage']").val(currentPage);

                    $("#"+pageFormId).submit();
                });
            });
        });

最后我捋一捋思路:
1丶首先点击到该页面时,进入FindXX.do方法查询出总条数,并把PageBean的属性重置,设置好各个属性,包括总页面,总条数,是否有下一页,是否有上一页等属性,并把该对象返回给调用该indXX.do方法的JSP页面,待JSP加载到<page:pageTag />标签时便会根据你tid文件关联的Class类找到PageTagImpl类,然后根据你的方法输出一段html到你写上标签的JSP页面处。

2丶再根据这段HTML设置的属性写上JS代码点击事件将该当前页传入该Action即可。

至此,只要讲JS代码和<page:pageTag />标签引入JSP页面内便可实现分页查询功能。

猜你喜欢

转载自blog.csdn.net/jiang2818756/article/details/51636057