其实在网上查了很多关于分页的技术,别人写的代码一大堆一大堆的,实在没耐心看下去,只好取其精华精神,转化为己有,自己试着写一个分页的实现,因为自己的代码符合自己的风格和想法,所以很有耐心看下去,哈哈...为了以后再次回顾这部分知识,把代码的关键部分放到这里以便以后查看,如果有高人指点那是将是我的荣幸!
Page:页码对象
/**
* 分页对象,用于存储总页数,当前页数。
* @author 波仔
*
*/
public class Page implements Serializable{
private int selected_page;//取值范围:1-n
private int pages_total;//总页数
private int last_page;//上一页
private int next_page;//下一页
private int last_hop;//上一个页码段:每一个页面最多显示10个页码,记为一个页码段。
private int next_hop;//下一个页码段
private List<Integer> current_pages;//当前页数。
public int getPages_total() {
return pages_total;
}
public void setPages_total(int pages_total) {
this.pages_total = pages_total;
}
.......以下都是set/get方法
.......
}
数据库获取Page对象代码部分:
/**
* 获取下一页的页码对象
* @param blog_id 用户请求的博文id
* @param start_page 用户请求的页码
* @return 返回一个分页对象
*/
public static Page getCurrentPageNum(int blog_id,int start_page){
try{
Page page = new Page();
page.setSelected_page(start_page);
String sql = "select count(*) from tbl_reviews where article_id=?";
java.sql.PreparedStatement prestmt1 = MysqlConnector.getConnection().prepareStatement(sql);
prestmt1.setInt(1,blog_id);
java.sql.ResultSet rs1 = prestmt1.executeQuery();
while(rs1.next()){
page.setPages_total(rs1.getInt(1)/10);//设定总页数
}
prestmt1.close();
//如何计算页码????
if((start_page-1)>0){//存在上一页
page.setLast_page(start_page-1);
}else{
page.setLast_page(-1);
}
if((page.getPages_total()-start_page)>0){//存在下一页
page.setNext_page(start_page+1);
}else{
page.setNext_page(-1);
}
List<Integer> list = new ArrayList<Integer>();
if(page.getPages_total()<=10){//如果当前页面能将页码完全显示。
for(int i = 1;i<=page.getPages_total();i++){
list.add(new Integer(i));
page.setLast_hop(-1);//表示没有上一段页码
page.setNext_hop(-1);//表示没有下一段页码
}
}else{//如果在当前页面不能显示全部页码。
int lh = start_page-(start_page%10);
int nh = start_page-(start_page%10)+11;
if(lh>0&&(start_page%10!=0)){//有上一段页码
page.setLast_hop(lh);
}else if(lh>0&&(start_page%10==0)){
page.setLast_hop(lh-10);
}else{page.setLast_hop(-1);}
if(nh<page.getPages_total()&&(start_page%10!=0)){//有下一段页码
page.setNext_hop(nh);
}else if(nh<page.getPages_total()&&(start_page%10==0)){
page.setNext_hop(nh-10);
}else if(nh>page.getPages_total()&&(start_page%10==0)){
if(nh-10<page.getPages_total()){
page.setNext_hop(nh-10);
}else{
page.setNext_hop(-1);
}
}
else{page.setNext_hop(-1);}
for(int j = start_page-(start_page%10)+1;
j<start_page-(start_page%10)+10;j++){
list.add(new Integer(j));
}
}
return page;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
由于本人对数据结构和算法不是很在行,上面的实现可能笨了点,但是没有功劳也有苦劳吧....
页面实现:
<tr>
<td align="center" class="list">
<c:if test="${cur_page.last_page>0}">
<a href="viewblog.do?id=${article.id}&page=${cur_page.last_page }">上一页</a>
</c:if>
<c:if test="${cur_page.last_hop>0}">
<a href="viewblog.do?id=${article.id}&page=${cur_page.last_hop }"><< </a>
</c:if>
<c:forEach var="p" items="${cur_page.current_pages}">
<c:if test="${p==cur_page.selected_page}">
<strong><a href="viewblog.do?id=${article.id}&page=${p}">${p }</a></strong>
</c:if>
<c:if test="${p!=cur_page.selected_page}">
<a href="viewblog.do?id=${article.id}&page=${p}">${p }</a>
</c:if>
</c:forEach>
<c:if test="${cur_page.next_hop>0}">
<a href="viewblog.do?id=${article.id}&page=${cur_page.next_hop }">>> </a>
</c:if>
<c:if test="${cur_page.next_page>0}">
<a href="viewblog.do?id=${article.id}&page=${cur_page.next_page }">下一页</a>
</c:if>
</td>
</tr>
分页效果如下:
情况1: 上一页 1 2 3 4 5 6 7 8 9 10 >> 下一页
情况2: 上一页 << 11 12 13 14 15 16 17 18 19 20 >> 下一页
情况3: 上一页 << 21 22 23 24 下一页
注意:粗体红色字表示当前页,'>>'表示下一个页码段,'<<'表示上一个页码段。例如:情况1中的‘>>’指向第11页,
情况2中的'<<'指向第10页
联系我:hunnuxiaobo@gmail.com