📄 pageinfo.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() + "条记录 ");
}
//如果是0条记录,则不执行下面的判断
if( totalCount == 0 ) {
return sbLink.toString();
}
if( this.isQueryAllElements() ) {
//显示所有记录
sbLink.append("当前显示" + this.getSizeSelectHtml()
+ "记录 ");
} else {
//----------不显示所有记录
//显示当前显示的记录范围
if( getCurrentPageSize() == 1 ) {
sbLink.append("当前显示第" + (this.getCurrentPageFirstElementNo() + 1)
+ "条 ");
} else {
sbLink.append("当前显示" + (this.getCurrentPageFirstElementNo() + 1)
+ "-" + (this.getCurrentPageLastElementNo()+1) + "条 ");
}
if ( !getPageConfig().isHidePageSizeSelect()) {
sbLink.append("每页显示" + this.getSizeSelectHtml() + "条 ");
}
/*
int c = getCurrentPageNo();
if( c < 0 ) {
c = 1;
}
if( this.getTotalCount() <= 0 ) {
c = 0;
}*/
//如果有统计页总数,则显示
//if( hasTotalPageCount() ) {
//sbLink.append("页次(" + c + "/" + this.getTotalPageCount()
// + ") ");
//}
//追加页码下拉框选择
//当指定了显示页码并且能统计页总数时才能显示
if( !getPageConfig().isHidePageNoSelect() && hasTotalPageCount() ) {
sbLink.append( "第" + this.getGoPageNosSelectHtml(10) + "页" );
}
//追加首页、末页、上页、下页的链接
String[] aTemp = this.getGoPageLinkHtmls();
sbLink.append(" ").append(aTemp[0]).append(" ")
.append(aTemp[1]);
sbLink.append(" ").append(aTemp[2]).append(" ")
.append(aTemp[3]).append(" ");
}
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 + -