/**
* 2013-06-05更新,四个图标分别配置
*/
package org.howsun.dao.page;
import java.text.MessageFormat;
import java.util.Properties;
import org.howsun.util.Propertys;
import org.howsun.util.Strings;
/**
* 功能描述:往html页面输出<br>
* 如果需要配置统一的风格,需要如下配置文件:<br>
* 路径:classpath:META-INF/pagination.properties<br>
* 内容:<br>
* #是否显示总页数:<br>
* DisplayTotalPages=false<br>
* #是否显示总记录数:<br>
* DisplayTotalRecords=false<br>
* #首页链接图标,可以指定相对或绝对图标路径,也可以字符串,默认为“ ”,下同
* IconTop=/images/navigation_top.gif
* #上一页链接图标
* IconPrevious=/images/navigation_previous.gif
* #下一页链接图标
* IconNext=/images/navigation_next.gif
* #最后一页链接图标
* IconBottom=/images/navigation_bottom.gif
* #当前页码样式<br>
* PaginationStyleForCurrent=<br>
* #链接页码样式<br>
* PaginationStyleForLinked=<br>
* <br>
* @author 张纪豪(howsun.zhang@google.com)
* @version 1.0.0
*/
public class Paginations{
///////////////////////////////////////////////////Static/////////////////////////////////////////////////
/**是否显示总页数*/
public static boolean displayTotalPages = false;
/**是否显示总记录数*/
public static boolean displayTotalRecords = false;
/**是否要跳转页文本框*/
public static boolean hasJumpPage = false;
/**当前页码样式*/
public static String paginationStyleForCurrent = "";
/**链接页码样式*/
public static String paginationStyleForLinked = "";
/**首页图标**/
public static String IconTop = "";
/**上一页图标**/
public static String IconPrevious = "";
/**下一页图标**/
public static String IconNext = "";
/**尾页图标**/
public static String IconBottom = "";
static String JUMP_URL = "<input name=\"_jumppage_\" type=\"text\" id=\"_jumppage_\" size=\"3\" maxlength=\"3\"/><a href=\"javascript:void(0);\" onclick=\"javascript:var pageIndex=document.getElementById('_jumppage_');if(parseInt(pageIndex.value)){window.location.href='%s'.replace('{_jump_page_}',pageIndex.value);}else{alert('请输入正确的页码')}\">跳转</a>";
static String JUMP_URL_POSI = "{_jump_page_}";
static{
try {
Properties properties = Propertys.loadPropertiesInMetaInf("pagination.properties");
displayTotalPages = Propertys.readPropertiesBooleanValue(properties, "DisplayTotalPages", false);
displayTotalRecords = Propertys.readPropertiesBooleanValue(properties, "DisplayTotalRecords", false);
paginationStyleForCurrent = properties.getProperty("PaginationStyleForCurrent", "pagenumbervisited");
paginationStyleForLinked = properties.getProperty("PaginationStyleForLinked", "pagenumber");
IconTop = properties.getProperty("IconTop", "首页");
IconPrevious = properties.getProperty("IconPrevious", "上一页");
IconNext = properties.getProperty("IconNext", "下一页");
IconBottom = properties.getProperty("IconBottom", "尾页");
hasJumpPage = Propertys.readPropertiesBooleanValue(properties, "hasJumpPage", false);
} catch (Exception e) {
e.printStackTrace();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
private Page page;
public Paginations(Page page){
this.page = page;
}
/**
* 按默认配置打印页码
* @return
*/
public String print(){
return print(displayTotalPages, displayTotalRecords, paginationStyleForCurrent, paginationStyleForLinked);
}
/**
* 打印页码
* @param displayTotalPages 是否显示总页数
* @param displayTotalRecords 是否显示总记录数
* @param imagePath 图标位置
* @param paginationStyleForCurrent 当前页码样式
* @param paginationStyleForLinked 链接页码样式
* @return
*/
public String print(boolean displayTotalPages, boolean displayTotalRecords, String paginationStyleForCurrent, String paginationStyleForLinked){
if(page.getTotalCount() == 0){
return "";
}
StringBuilder sb = new StringBuilder();
//如果设定了要打印总页数,则在JSP页面中输出当前页和总页数
if(displayTotalPages){
sb.append("当前页/总页数:"+ page.getPageIndex() + "/" + page.getPageCount() + " ");
}
//sb.append("页码:");
//如果当前页码大于1时,应该输出开始一页和上一页的连接
if(page.getPageIndex() > 1){
sb.append("<a title=\"开始一页\" href=\"")
.append(conversionUrl(page.getUrl(), 1, page.getPageCount()))
.append("\" class=\"")
.append(paginationStyleForLinked)
.append("\">")
.append(getNavigationIcon(0))
.append("</a> ");
sb.append("<a title=\"上一页\" href=\"")
.append(conversionUrl(page.getUrl(), page.getPageIndex() - 1, page.getPageCount()))
.append("\" class=\"")
.append(paginationStyleForLinked)
.append("\">")
.append(getNavigationIcon(1))
.append("</a> ");
}
//开始在总页数里循环
for (int i = 1; i <= page.getPageCount(); i++){
//假如有几十页、几百页、甚至n多,不能全部将页码输出,这里只取10页
if(page.getPageIndex() < 5 && i < 10){
if(i == page.getPageIndex()){
//当前页不应该有连接
sb.append("<span")
.append(getStyle(paginationStyleForCurrent))
.append(">")
.append(i)
.append("</span> ");
}else{
sb.append("<a href=\"")
.append(conversionUrl(page.getUrl(), i, page.getPageCount()))
.append("\" class=\"")
.append(paginationStyleForLinked)
.append("\" title=\"第")
.append(i)
.append("页\">")
.append(i)
.append("</a> ");
}
}else{
if(i > page.getPageIndex() - 5 && i < page.getPageIndex() + 5){
if(i == page.getPageIndex()){
sb.append("<span")
.append(getStyle(paginationStyleForCurrent))
.append(">")
.append(i)
.append("</span> ");
}else{
sb.append("<a href=\"")
.append(conversionUrl(page.getUrl(), i, page.getPageCount()))
.append("\" class=\"")
.append(paginationStyleForLinked)
.append("\" title=\"第")
.append(i)
.append("页\">")
.append(i)
.append("</a> ");
}
}
}
}
//只要没有进到最后一页,都应该输出下一面和最后一页连接
if(page.getPageIndex() < page.getPageCount()){
sb.append(" <a title=\"下一页\" href=\"")
.append(conversionUrl(page.getUrl(), page.getPageIndex() + 1, page.getPageCount()))
.append("\" class=\"")
.append(paginationStyleForLinked)
.append("\">")
.append(getNavigationIcon(2))
.append("</a> ");
sb.append("<a title=\"最后一页\" href=\"")
.append(conversionUrl(page.getUrl(), page.getPageCount(), page.getPageCount()))
.append("\" class=\"")
.append(paginationStyleForLinked)
.append("\">")
.append(getNavigationIcon(3))
.append("</a>");
}
//是否开启跳转页功能且总页数大于10页
if(hasJumpPage && page.getPageCount() > 10){
sb.append(" ")
.append(conversionUrl(page.getUrl(), -100, page.getPageCount()));
}
//标记中调用是否指定输出每页记录数和总记录数
if(displayTotalRecords)
sb.append(" 每页记录数/总记录数:")
.append(page.getPageSize())
.append("/")
.append(page.getTotalCount());
return sb.toString();
}
/**
* 转换URL,携带页数量,可以省去统计步骤
* @param url
* @param pageindex
* @param pageCount
* @return
*/
public static String conversionUrl(String url, int pageindex, int pageCount){
if(url == null || url.length() < 1){
return "index.jsp";
}
int index = url.indexOf("?");
StringBuffer sb = new StringBuffer();
/*
* 如果是REST风格
* e.g. http://www.howsun.org/article/list_*.html
*/
if(url.indexOf('*') > -1){
if(pageindex == -100){
url = url.replace("*", String.valueOf(JUMP_URL_POSI));
sb.append(url)
.append(index > -1 ? "&" : "?")
.append(Page.PAGE_TOTAL_PARAMETER_NAME)
.append("=")
.append(pageCount);
return String.format(JUMP_URL, sb.toString());
}
url = url.replace("*", String.valueOf(pageindex));
return sb.append(url)
.append(index > -1 ? "&" : "?")
.append(Page.PAGE_TOTAL_PARAMETER_NAME)
.append("=")
.append(pageCount)
.toString() ;
}
sb.append(url);
if(index > -1){
char c = sb.charAt(sb.length() - 1);
if(c != '?' && c != '&'){
sb.append("&");
}
}else{
sb.append("?");
}
if(pageindex == -100){
sb.append(Page.PAGE_TOTAL_PARAMETER_NAME)
.append("=")
.append(pageCount)
.append("&")
.append(Page.PAGE_NUMBER_PARAMETER_NAME)
.append("=")
.append(JUMP_URL_POSI);
return String.format(JUMP_URL, sb.toString());
}
sb.append(Page.PAGE_NUMBER_PARAMETER_NAME)
.append("=")
.append(pageindex)
.append("&")
.append(Page.PAGE_TOTAL_PARAMETER_NAME)
.append("=")
.append(pageCount);
return sb.toString();
}
public static String getNavigationIcon(int type){
String icon = "<img src=\"%s\" border=\"0\" alt=\"%s\" title=\"%s\"/>";
switch (type) {
case 0:
return (IconTop.endsWith(".gif") || IconTop.endsWith(".jpg") || IconTop.endsWith(".png"))
? String.format(icon, IconTop, "最开始一页","最开始一页")
: IconTop;
case 1:
return (IconPrevious.endsWith(".gif") || IconPrevious.endsWith(".jpg") || IconPrevious.endsWith(".png"))
? String.format(icon, IconPrevious, "上一页","上一页")
: IconPrevious;
case 2:
return (IconNext.endsWith(".gif") || IconNext.endsWith(".jpg") || IconNext.endsWith(".png"))
? String.format(icon, IconNext, "下一页","下一页")
: IconNext;
case 3:
return (IconBottom.endsWith(".gif") || IconBottom.endsWith(".jpg") || IconBottom.endsWith(".png"))
? String.format(icon, IconBottom, "最后一页","最后一页")
: IconBottom;
}
return " ";
//return hasIcons ? ("<img src=\"" + (imagePath + Paginations.ICONS[type][1]) + "\" border=\"0\"/>") : Paginations.ICONS[type][0];
}
/**
* 获取链接样式
* @param paginationStyleForCurrent
* @return
*/
public static String getStyle(String paginationStyleForCurrent){
return Strings.hasLengthBytrim(paginationStyleForCurrent) ? String.format(" class=\"%s\"", paginationStyleForCurrent) : "";
}
/**
* @param args
*/
public static void main(String[] args) {
Page page = new Page(11,50,"/index?");
page.setTotalCount(13453463);
Paginations printer = new Paginations(page);
System.out.println(printer.print());
System.out.println(page.getPageCount()*50);
System.out.println(MessageFormat.format("/index_{0}?pc={1}", 3,40));
}
}