Java自定义分页标签的实现
主要字段含义:
页号 pagaNo
页面大小 pageSize
总记录条数 recordCount
计算本次一共分多少页 myPageSize
页号显示开始 start
页号显示结束 end
PageTag需要继承TagSupport类用于实现自定义标签。
import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; public class PageTag extends TagSupport { /** * */ private static final long serialVersionUID = 1L; //页号 第几页 private int pageNo = 1; //页面大小,每一页显示几条记录 private int pageSize = 5; //分页操作后台响应类,后台响应servlet private String url; //总的记录条数,本次分页操作所有的记录总数 private int recordCount = 0; @Override public int doEndTag() throws JspException { // TODO Auto-generated method stub return super.doEndTag(); } @Override public int doStartTag() throws JspException { // TODO Auto-generated method stub //自定义标签的业务逻辑处理,使用分页的相关参数,组织分页标签的内容 StringBuilder tagContent = new StringBuilder(); //组织自定义分页标签的css样式表 tagContent .append("<style type='text/scc'>") .append(".pagination {padding:5px;float:right;font-size:12px;}") .append(".pagination a, .pagination a:link, .pagination a:visited {padding:2px 5px;margin:2px;boder:1px solid #aaaadd;text-decoration:none;color:#006699;}") .append(".pagination a:hover, .pagination a:active {border:1px solid #ff0000;font-weight: bold;background-color: #ff0000; color: #FFF;}") .append(".pagination span.disabled {padding: 2px 5px;margin: 2px;border: 1px solid #eee; color: #ddd;}") .append("</style>"); //自定义标签的标签体内容 tagContent.append("<div class='pagination'>"); if(this.recordCount == 0){ //没有查询到结果记录集,则提示没有显示数据 tagContent.append("<strong>没有可显示的项目</strong>/r/n"); }else{ //查询结果有显示数据时,则进行分页处理 tagContent.append("<form method='post' action='"); tagContent.append(this.getUrl()); tagContent.append("' name='qPagerForm'>"); //自定义标签的隐藏属性,用来进行页码变换时的表单数据:页码和页面大小 tagContent.append("<input type='hidden' name='pageNo' value='1'/>"); tagContent.append("<input type='hidden' name='pageSize' value='"); tagContent.append(this.getPageSize()); tagContent.append(" '/>"); tagContent.append(" 共<strong>"); tagContent.append(this.getRecordCount()); tagContent.append("</strong>项,<strong>"); //计算本次分一共有多少页:不足一页的也算作一页 int myPageSize = (int)Math.ceil((double)this.getRecordCount()/this.getPageSize()); tagContent.append(myPageSize); tagContent.append("</strong>页: "); //防止页面越界的处理 if(this.pageNo > myPageSize){ this.pageNo = myPageSize; } if(this.pageNo < 1){ this.pageNo = 1; } //当前页为第一页时,则上一页不能显示超链接 if(this.pageNo == 1){ tagContent.append("<span class='disabled'>« 上一页</span>"); }else{ //当前页不为第一页时,则进行页面链接处理 tagContent.append("<a href='javascript:turnOverPage(") .append((pageNo - 1)).append(")'>« 上一页</a>/r/n"); } //如果前面页数过多,显示"..." int start = 1; if(this.pageNo > 4){ //在前面的页数大于4页情况下,从当前页的前一页开始显示,前面的页数使用...代替 start = this.pageNo - 1; tagContent.append("<a herf='javascript:turnOverPage(1)'>1</a>/r/n"); tagContent.append("<a herf='javascript:turnOverPage(2)'>2</a>/r/n"); tagContent.append("…/r/n"); } //显示当前页附近的页 int end = this.pageNo + 1; //如果当前页为最后一页 if(end > myPageSize) { //防止end记录的最后一页超出总页数 end = myPageSize; } for(int i = start; i <= end; i++){ if(pageNo ==i){ //当前页号不需要超链接 tagContent.append("<span class='current'>").append(i).append("</span>/r/n"); }else{ //当前页前后的几页需要加上超链接 tagContent.append("<a herf=''javascript:turnOverPage(").append(i) .append(")'>").append(i).append("</a>/r/n"); } } //如果后面页数过多,显示"..." if(end < myPageSize - 2){ //使用...替换 tagContent.append("…/r/n"); } if(end < myPageSize - 1){ //刚好后面剩余页数为两页 tagContent.append("<a herf='javascript:turnOverPage(").append(myPageSize - 1).append(")'>") .append(myPageSize - 1).append("</a>/r/n"); } if(end < myPageSize){ //刚好后面的页数剩余一页 tagContent.append("<a herf='javascript:turnOverPage(").append(myPageSize).append(")'>").append(myPageSize).append("</a>/r/n"); } //下一页处理 if(pageNo == myPageSize){ //如果当前页数为最后一页,则不需要超链接 tagContent.append("<span class='disabled'>下一页 »").append("</span>/r/n"); }else{ //下一页的超链接可以使用 tagContent.append("<a herf='javascript:turnOverPage(").append((pageNo + 1)).append(")'>下一页 »</a>/r/n"); } tagContent.append("</from>"); //拼写js处理函数:当用户点击某一页时,需要将这一页的页码赋值给隐藏表单域, //用来将其作为表单发送给分页响应的servlet tagContent.append("<script language='javascript'>"); tagContent.append("function turnOverPage(no){"); tagContent.append("if(no>"); tagContent.append(myPageSize); tagContent.append("){no="); tagContent.append(myPageSize); tagContent.append(";}"); tagContent.append("if(no<1){no=1;}"); tagContent.append("document.qPagerForm.pageNo.value=no;"); tagContent.append("document.qPagerForm.submit();"); tagContent.append("}"); tagContent.append("</script>"); tagContent.append("</div>"); } //输出标签的内容到前台页面 try { this.pageContext.getOut().write(tagContent.toString()); } catch (IOException e) { //自定义标签输出错误 System.out.println("自定义标签输出错误:" + e.getMessage()); } return SKIP_BODY; } public int getPageNo() { return pageNo; } public void setPageNo(int pageNo) { this.pageNo = pageNo; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getRecordCount() { return recordCount; } public void setRecordCount(int recordCount) { this.recordCount = recordCount; } }
分页的javascript函数
<script language='javascript'> function turnOverPage(no){ if(no > pageSize){ no = pageSize; } if(no < 1){ no = 1; } document.qPagerForm.pageNo.value=no; document.qPagerForm.submit(); } </script>