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

📄 pageinfo.java

📁 适合各种数据库的分页程序
💻 JAVA
字号:
package com.ztes.commons.dbo.pagination;

import java.text.DecimalFormat;
import java.text.MessageFormat;

/**
 * 存储分页信息,如当前页码、每页显示的记录数、总页数、总记录数等。
 * 为了完整的获取其它信息,可能需要设置总记录数和当前页码。
 * 
 * @author tiannet(曾次清)
 */
public class PageInfo {
	
	/** 每页显示记录数的参数名称({@value}) */
	public static final String PNAME_PAGESIZE = "pageSize";
	
	/** 当前页码的参数名称({@value}) */
	public static final String PNAME_CURRENT_PAGENO = "currentPageNo";
	

	/** 每页显示的记录数 */
	private int pageSize = PageConfig.DEFAULT_PAGESIZE;
	
	/** 总记录数 */
	private int totalCount = -1;
	
	/** 分页配置信息,有默认值。 */
	private PageConfig pageConfig = null;
	
	/** 分页参数 */
	private PageParameter pageParameter;
	
	/**
	 * 得到总页数
	 * @return 总页数
	 */
	public int getTotalPageCount() {
		//如果为设置总记录数,则返回负数
		if( !hasTotalCount() ) {
			return -1;
		}
		return (totalCount + pageSize - 1) / pageSize;
	}
	
	/**
	 * 判断是否能有效的计算总页数
	 * @return 如果能记录总页数返回true,否则返回false。
	 */
	public boolean hasTotalPageCount() {
		return getTotalPageCount() >= 1;
	}
	
	/**
	 * 是否有下一页。
	 * @return 如果有下一页返回true,否则返回false。
	 */
    public boolean hasNextPage() {
        return getCurrentPageNo() < this.getTotalPageCount() - 1;
    }
    
    /**
     * 是否有上一页
     * @return 如果有上一页返回true,否则返回false。
     */
    public boolean hasPreviousPage() {
        return getCurrentPageNo() > 1;
    }
    
    /**
     * 是否为第一页
     * @return 如果为第一页返回true,否则返回false。
     */
    public boolean isFirstPage() {
    	return getCurrentPageNo() == 1;
    }
    
    /**
     * 是否为最后一页
     * @return 如果为最后一页返回true,否则返回false。
     */
    public boolean isLastPage() {
    	return getCurrentPageNo() >= this.getTotalPageCount();
    }
    
    /**
     * 设置是否查询所有记录。
     * @param b 如果查询所有记录则设为true,否则设为false。
     */
    public void setQueryAllElements(boolean b) {
    	if( b ) {
    		pageSize = -1;
    	} else {
    		pageSize = getPageConfig().getPageSize();
    	}
    }
    
    /**
     * 是否查询所有数据,如果欲查询所有数据,请将每页显示记录数(pageSize)设为负数。
     * @return 如果查询所有数据返回true,否则返回false。
     */
    public boolean isQueryAllElements() {
    	return pageSize < 0;
    }
    
    /**
     * 得到当前页的记录数。
     * @return 当前页的记录数。
     */
    public int getCurrentPageSize() {
    	if(  !hasTotalCount() || getCurrentPageNo() < getTotalPageCount() ) {
    		return getPageSize();
    	}
    	return this.getTotalCount()
			- (this.getTotalPageCount() - 1) * this.getPageSize();
    }
    
    /**
     * 得到当前页第一条数据的编号,从0开始记。
     * @return 当前页第一条数据的编号,从0开始记。
     */
    public int getCurrentPageFirstElementNo() {
    	//如果当前是显示所有记录。则序号从0开始。
    	//System.out.println("CurrentPageNo=" + getCurrentPageNo());
		if ( isQueryAllElements() ) {
			//System.out.println("isQueryAllElements");
			return 0;
		}
		if( getCurrentPageNo() <= 1 ) {
			return 0;
		}
		
		return (getCurrentPageNo() - 1) * this.getPageSize();
    }
    
    /**
     * 得到当前页最后一条数据的编号。
     * @return 当前页最后一条数据的编号。
     */
    public int getCurrentPageLastElementNo() {
		return getCurrentPageFirstElementNo() + getCurrentPageSize() - 1;
		
    }
	
	
	/**
	 * 返回每页显示的记录数。
	 * @return 每页显示的记录数。
	 */
	public int getPageSize() {
		return pageSize;
	}
	
	
	/**
	 * 判断有无设置总记录数。
	 * @return 如果设置了总记录数,则返回true,否则返回false。
	 */
	public boolean hasTotalCount() {
		return totalCount >= 0;
	}
	
	/**
	 * 返回总记录数。
	 * @return 总记录数。
	 */
	public int getTotalCount() {
		return totalCount;
	}
	/**
	 * 设置总记录数
	 * @param totalCount 总记录数.
	 */
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

	
	/**
	 * 得到当前页可用于显示的页码。
	 * @param add 与当前页码的最大差值。
	 * @return 如果当前页为4,而add设为3,在页数足够的情况下,返回的数组元素应为:
	 * 1,2,3,4,5,6,7。
	 */
	public int[] getCurrentNos(int add) {
		
		add = Math.abs(add);
		int intStart = (getCurrentPageNo() - add) <= 0 ? 1
				: (getCurrentPageNo() - add);
		int intEnd = (getCurrentPageNo() + add) >= this.getTotalPageCount() ? this.getTotalPageCount()
				: (getCurrentPageNo() + add);
		
		int[] nos = new int[intEnd - intStart + 1];

		for (int i = intStart; i <= intEnd; i++) {
			nos[i - intStart] = i;
		}
		
		return nos;
		
	}//~ getCurrentNos
	
	/**
	 * 得到显示翻页链接、分页信息的html代码。
	 * @return 显示翻页链接、分页信息的html代码。
	 */
	public String toHtml() {
		
		StringBuffer sbLink = new StringBuffer();
		//执行点击事件的脚本须一并输出
		sbLink.append(this.getExecPageUrlScript());
		//如果有统计记录总数,则显示
		if( hasTotalCount() ) { 
			sbLink.append("共" + this.getTotalCount() + "条记录&nbsp;");
		}
		//如果是0条记录,则不执行下面的判断
		if( totalCount == 0 ) {
			return sbLink.toString();
		}
		if( this.isQueryAllElements() ) {
			//显示所有记录
			sbLink.append("当前显示" + this.getSizeSelectHtml()
					+ "记录&nbsp;");
		} else {
			//----------不显示所有记录
			//显示当前显示的记录范围
			if( getCurrentPageSize() == 1 ) {
				sbLink.append("当前显示第" + (this.getCurrentPageFirstElementNo() + 1) 
						+ "条&nbsp;");
				
			} else {
				sbLink.append("当前显示" + (this.getCurrentPageFirstElementNo() + 1) 
						+ "-" +  (this.getCurrentPageLastElementNo()+1) + "条&nbsp;");
			}
			
			if ( !getPageConfig().isHidePageSizeSelect()) {
				sbLink.append("每页显示" + this.getSizeSelectHtml() + "条&nbsp;");
			}
				
			/*
			int c = getCurrentPageNo();
			if( c < 0 ) {
				c = 1;
			}
			if( this.getTotalCount() <= 0 ) {
				c = 0;
			}*/
			//如果有统计页总数,则显示
			//if( hasTotalPageCount() ) {
				//sbLink.append("页次(" + c + "/" + this.getTotalPageCount()
					//	+ ")&nbsp;");
			//}
			
			//追加页码下拉框选择
			//当指定了显示页码并且能统计页总数时才能显示
			if( !getPageConfig().isHidePageNoSelect() && hasTotalPageCount() ) {
				sbLink.append( "第" + this.getGoPageNosSelectHtml(10) + "页" );
			}
			
			//追加首页、末页、上页、下页的链接
			String[] aTemp = this.getGoPageLinkHtmls();
			
			sbLink.append("&nbsp;").append(aTemp[0]).append("&nbsp;")
					.append(aTemp[1]);
			sbLink.append("&nbsp;").append(aTemp[2]).append("&nbsp;")
					.append(aTemp[3]).append("&nbsp;");
		}
		
		return sbLink.toString();
		
	}//~ toHtml
	
	/**
	 * 得到分页配置信息,如果未指定则采用默认的配置。
	 * @return pageConfig 持有分页配置信息的对象。 
	 */
	public PageConfig getPageConfig() {
		if( pageConfig == null ) {
			pageConfig = PageConfig.getInstance();
		}
		return pageConfig;
	}

	/**
	 * 设置分页配置信息,有默认值。
	 * @param pageConfig 分页配置信息。
	 */
	public void setPageConfig(PageConfig pageConfig) {
		setPageSize( pageConfig.getPageSize() );
		this.pageConfig = pageConfig;
	}

	/**
	 * 得到分页参数对象。
	 * @return pageParameter 得到分页参数对象。
	 */
	public PageParameter getPageParameter() {
		return pageParameter;
	}

	/**
	 * 设置分页参数对象。
	 * @param pageParameter 分页参数对象。
	 */
	public void setPageParameter(PageParameter pageParameter) {
		//如果参数传递了页尺寸,则设置
		if( pageParameter.getPageSize() != 0 ) {
			setPageSize( pageParameter.getPageSize() );
		} else {
			setPageSize( getPageConfig().getPageSize() );
		}
		this.pageParameter = pageParameter;
	}
	
	
	//~ private methods ---------------------------------------------------------------------------------------------------
	
	/**
	 * 格式化翻页地址。
	 * @param pageNo 链接跳转的页码
	 * @param pageSize 页尺寸
	 * @return 完整的翻页地址。
	 */
	private String formatPageUrl(int pageNo, int pageSize) {
		MessageFormat mf = new MessageFormat(pageParameter.getPageUrl());
		DecimalFormat df = new DecimalFormat("0");
		mf.setFormatsByArgumentIndex(new java.text.Format[]{df,df});
		return mf.format(new Object[]{ new Integer(pageNo), new Integer(pageSize) });
		
	}
	
	/**
	 * 得到用户可选择的页尺寸。
	 */
	private int[] getSizes() {
		int[] sizes = pageConfig.getSelectPageSizes();
		if ( this.isQueryAllElements() ) {
			return sizes;
		}
		int index = 0; // 当前页尺寸在指定尺寸所处的索引
		// 判断当前页尺寸是否在指定范围之内。
		for (int i = 0; i < sizes.length; i++) {
			if (this.getPageSize() == sizes[i]) {
				return sizes;
			} else if (this.getPageSize() > sizes[i]) {
				index++;
			}
		}
		// 如果当前页尺寸不在指定尺寸范围内,则应将其追加到可选尺寸中
		int[] aIntSize = new int[sizes.length + 1];
		for (int i = 0; i < index; i++) {
			aIntSize[i] = sizes[i];
		}
		aIntSize[index] = this.getPageSize();
		for (int i = index; i < sizes.length; i++) {
			aIntSize[i + 1] = sizes[i];
		}
		return aIntSize;
	}//~ getSizes
	
	/**
	 * 获取显示页码选择下拉框的html代码。
	 * @param url 选择下拉框时需要跳转的地址。
	 * @param add 与当前页码的最大差值。
	 * @return 显示页码选择下拉框的html代码。
	 */
	private String getGoPageNosSelectHtml(int add) {
		String strSelected = "";
		StringBuffer sb = new StringBuffer();
		sb.append("<select onchange=\"javascript:execPageUrl(this.value);\">");
		int[] nos = this.getCurrentNos(add);
		for (int i = 0; i < nos.length; i++) {
			strSelected = nos[i] == getCurrentPageNo() ? "selected" : "";
			sb.append("<option value=\"" + formatPageUrl( nos[i], getPageSize() ) + "\" "
					+ strSelected + ">" + nos[i] + "</option>");
		}
		sb.append("</select>");
		return sb.toString();
	}//~getGoPageNoSelectHtml
	
	/**
	 * 获取显示首页、末页、上页、下页的html代码。
	 * @return 数组的四个元素分别为显示首页、末页、上页、下页的html代码。
	 */
	private String[] getGoPageLinkHtmls() {
		
		String first = pageConfig.getFirstPageStr(), // 首页
			last = pageConfig.getLastPageStr(),	//末页
			prev = pageConfig.getPrevPageStr(),	//上页
			next = pageConfig.getNextPageStr();   //下页
		if (getCurrentPageNo() > 1) {
			first = "<a href=\"" + formatPageUrl(1,getPageSize() ) + "\" title='第一页' "
					+ ">" + first + "</a>";
			prev = "<a href=\"" + formatPageUrl(getCurrentPageNo() - 1, getPageSize()) + "\" title='上一页'>" + prev + "</a>";
		}
		if( !hasTotalPageCount() && totalCount != 0 ) {
			//如果无法计算总 页数,则总是给出下页链接
			next = "<a href=\"" + formatPageUrl(getCurrentPageNo() + 1, getPageSize()) + "\" title='下一页'>" + next + "</a>";
			
		} else if( getCurrentPageNo() < this.getTotalPageCount() ) {
			last = "<a href=\"" + formatPageUrl(this.getTotalPageCount(), getPageSize() ) + "\" title='最后一页'>" + last + "</a>";
			next = "<a href=\"" + formatPageUrl(getCurrentPageNo() + 1, getPageSize()) + "\" title='下一页'>" + next + "</a>";
		}
		String[] a = new String[]{first,last,prev,next};
		return a;
	}
	
	/**
	 * 得到显示分页大小选择的下拉框的html代码。
	 * 
	 * @return 显示分页大小选择的下拉框的html代码。
	 */
	private String getSizeSelectHtml() {
		StringBuffer sb = new StringBuffer();
		sb.append("<select onchange=\"javascript:execPageUrl(this.value);\">");
		//总记录在500以下才给出全部的选择
		if( this.getTotalCount() < 500 ) {
			sb.append("<option value=\"" + formatPageUrl(getCurrentPageNo(),-1) + "\">全部</option>");
		}
		int[] aSize = this.getSizes();
		String strSelected = "";
		for (int i = 0; i < aSize.length; i++) {
			strSelected = aSize[i] == this.getPageSize() ? "selected" : "";
			sb.append("<option value=\"" + formatPageUrl(getCurrentPageNo(),aSize[i]) + "\" "
					+ strSelected + ">" + aSize[i] + "</option>");
		}
		sb.append("</select>");
		return sb.toString();
	}
	
	/**
	 * 获取执行翻页地址的脚本
	 * @return
	 */
	private String getExecPageUrlScript() {
		StringBuffer sb = new StringBuffer();
		sb.append("<script language=\"javascript\">");
		sb.append("function execPageUrl(url) {");
		//如果地址是一段脚本则直接执行脚本,否则直接跳转到指定地址
		sb.append("	if(url.toLowerCase().indexOf('javascript:') > 0 ) {");
		sb.append("	eval(url);");
		sb.append("	} else {");
		sb.append("	window.location = url  ");
		sb.append("	}");
		sb.append("}");
		sb.append("</script>");
		return sb.toString();
	}
	
	/**
	 * 设置每页显示的记录数
	 * @param pageSize 每页显示的记录数.
	 */
	private void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 得到当前页码,判断传递的页码与总页的关系。
	 * @return 当前页码。
	 */
	private int getCurrentPageNo() {
		//如果当前页码比总页数大,则返回最后一个页码
		if( pageParameter.getCurrentPageNo() > getTotalPageCount() && this.hasTotalCount() ) {
    		return getTotalPageCount();
    	}
		return pageParameter.getCurrentPageNo();
	}
	
}

⌨️ 快捷键说明

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