⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagertag.java

📁 一个好的分页
💻 JAVA
字号:
package net.xdevelop.taglib.page;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.net.URLEncoder;
import java.io.IOException;
import net.xdevelop.util.*;


/**
 * 分页框架标记
 * 从表单中获得全部参数,予以保存并自动生成对应的<input type=hidden>表单
 * 通过计算当前的页号,操作,以及控制每页记录数,提供起始记录号,和每页显示记录数,
 * 供框架内的程序控制显示起始的记录位置和数量,若中途转出后返回,直接调用该页面即可
 * 恢复原来转出时的情况.若页号超出范围,将自动调成最接近的合理值.
 * 使用举例:
 * <pre>
 *  <code>
 *    int count=getCount();//获得记录总数
 *    condition=request.getParameter("condition");
 *    <page:pager total=<%=count%> defaultPageSize='20'>
 *      <%
 *        showRecord(condition,index,pageSize);
 *      %>
 *      <page:navigator type='BUTTON'/>
 *    </page:pager>
 *  </code>
 * <pre>
 */
public class PagerTag extends BodyTagSupport {
    private StringBuffer output;        //保存输出
    private int pageNo;                 //当前页面
    private int pageSize;               //每页记录数
    private int index = 1;              //起始记录数,缺省为0
    private int pages;                  //总页数
    private String queryString;         //保存分页信息和所需传递的其它变量值
    private String prevPage;            //前一页的URL和queryString
    private String nextPage;            //下一页的URL和queryString
    private String currentPage;         //当前页的URL和queryString
    private String firstPage;           //第一页的URL和queryString
    private String lastPage;            //最后页的URL和queryString
    private boolean resume = false;     //是否是恢复操作
    private int total = 0;              //记录总数,即需要分页显示的记录总数,初始化默认为0
    private int defaultPageSize = 20;   //缺省每页记录数,可在导航条中改变每页记录数的值

    public void setTotal(int newTotal) {
        total = newTotal;
    }

    public void setDefaultPageSize(int newDefaultPageSize) {
        defaultPageSize = newDefaultPageSize;
    }

    /**
     * 调用handler进行分页处理
     */
    public int doStartTag() throws JspTagException {
        output = new StringBuffer();
        resume = false;
        handler();
        return EVAL_BODY_BUFFERED;
    }

    /**
     * 获得标记内的记录列表内容
     */
    public int doAfterBody() throws JspTagException {
        BodyContent bodyContent = getBodyContent();
        if (bodyContent != null) {
            output.append(bodyContent.getString());
            try {
                bodyContent.clear();
            }
            catch (IOException ex) {
                throw new JspTagException("Fatal IO Error");
            }
        }
        return SKIP_BODY;
    }

    /**
     * 输出标记内的内容
     */
    public int doEndTag() throws JspTagException {
        BodyContent bodyContent = getBodyContent();
        try {
            if (bodyContent != null) {
                //输出结束标记
                output.append("</form>\n");
                //输出全部内容
                bodyContent.getEnclosingWriter().write(output.toString());
            }
        }
        catch (IOException ex) {
            throw new JspTagException("Fatal IO Error");
        }

        return EVAL_PAGE;
    }

    /**
     * 设置标记内变量(每页记录数,当前页号,起始记录号,表单的查询字符串)
     */
    public void setVariable() {
        pageContext.setAttribute("pageSize", new Integer(pageSize));
        pageContext.setAttribute("pageNo", new Integer(pageNo));
        pageContext.setAttribute("total", new Integer(total));
        pageContext.setAttribute("pages", new Integer(pages));
        pageContext.setAttribute("index", new Integer(index));
    }

    /**
     * 获取分页信息和其它表单中的变量值并输出表单
     */
    private void handler() {
        HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
        StringBuffer paramBuf = new StringBuffer();
        HttpSession session = (HttpSession) pageContext.getSession();
        String choice = "";
        HashMap params = new HashMap();

        //获得当前页的URI
        String requestURI = request.getRequestURI();

        //获取操作
        choice = ParamUtil.getParameter(request, "choice");

        //判断是否转出后返回需恢复原分页及参数信息(判断依据:GET方式访问且没有提供额外参数)
        if (choice.equals("") && request.getMethod().equals("GET") && request.getQueryString() == null) {
            //是否页面相同
            String pageURI = (String) session.getAttribute("pageURI");
            if (request.getRequestURI().equalsIgnoreCase(pageURI))
                resume = true;
            else
                resume = false;
        }

        if (resume) { //处理中途转出后返回的情况
            //从session中取参数
            Object obj = session.getAttribute("pagerParameters");
            if (obj != null) {
                params = (HashMap) obj;

                //获取每页记录数,若没指定,使用默认值
                pageSize = ((Integer) params.get("pageSize")).intValue();

                //获取页号
                pageNo = ((Integer) params.get("pageNo")).intValue();
            }
            else {
                //提供默认值(一般出在用GET方法查询且不需参数情况的处理,因为条件等同于转出后恢复)
                pageSize = defaultPageSize;
                pageNo = 1;
            }

            //设定操作
            choice = "current"; //操作改设为取当前页
        }
        else {
            //获取每页记录数,若没指定,使用默认值
            pageSize = ParamUtil.getIntParameter(request, "pageSize", defaultPageSize);

            //获取页号
            pageNo = ParamUtil.getIntParameter(request, "pageNo", 1);
        }

        //每页记录数越界处理
        if (pageSize <= 0)
            pageSize = 1;

        //计算总页数
        pages = (total % pageSize == 0) ? total / pageSize : total / pageSize + 1;

        //根据操作,重新确定当前页号
        if (choice.equals("next"))
            pageNo++;
        if (choice.equals("prev"))
            pageNo--;
        if (choice.equals("first"))
            pageNo = 1;
        if (choice.equals("last"))
            pageNo = pages;

        //页号越界处理
        if (pageNo > pages)
            pageNo = pages;
        if (pageNo <= 0)
            pageNo = 1;

        //起始记录号
        index = (pageNo - 1) * pageSize + 1;

        //输出表单的头
        output.append("<form action='' method='post' name='pager'>\n");

        Enumeration enum;
        String name;
        String value;
        if (resume) { //处理中途转出后返回的情况
            //恢复session中的参数
            Collection co = params.entrySet();
            if (co != null) {
                Iterator it = params.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry e = (Map.Entry) it.next();
                    name = (String) e.getKey();
                    if (name.equals("pageNo") || name.equals("pageSize") || name.equals("choice")) { //略过
                        continue;
                    }
                    value = (String) e.getValue();
                    paramBuf.append("<input type='hidden' name='" + name + "' value='" + value +
                                    "'>\n");
                }
            }
        }
        else {
            //获取所有提交的参数,并设置表单"<input type='hidden' name='' value=''>"
            enum = request.getParameterNames();

            while (enum.hasMoreElements()) {
                name = (String) enum.nextElement();
                value = ParamUtil.getParameter(request, name);
                //保存查询参数和值
                params.put(name, value);

                if (name.equals("pageNo") || name.equals("pageSize") || name.equals("choice")) {
                    continue;
                }
                paramBuf.append("<input type='hidden' name='" + name + "' value='" + value +
                                 "'>\n");
            }

            //保存分页参数和值
            params.put("pageNo", new Integer(pageNo));
            params.put("pageSize", new Integer(pageSize));

            //保存到session
            session.setAttribute("pagerParameters", params);

            //保存当前的URI
            session.setAttribute("pageURI", request.getRequestURI());
        } ////////end of if(resume)

        //输出分页参数表单
        paramBuf.append("<input type='hidden' name='pageNo' value='" + pageNo + "'>\n");
        paramBuf.append("<input type='hidden' name='pageSize' value='" + pageSize + "'>\n");
        paramBuf.append("<input type='hidden' name='choice' value='" + choice + "'>\n");

        output.append(paramBuf.toString());
        setVariable();
        if (resume) {
            //转出恢复情况下需重新提交表单
            String resend = "<script language='javascript'>"
                            + "document.pager.submit();"
                            + "</script>\n";
            output.append(resend);
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -