分页标签demo:
概要:主要记录分页的一些步骤,直接上栗子。
1丶在WEB-INF下的tld包下建立page.tld标签。
2丶建与标签对相的标签类,这里叫PageTagImpl.java
3丶建立一个PageBean对象用来与JSP打交道(包括初始化对象,可不建,不是必要的文件)
4丶JSP页面引入该分页标签。
1丶在WEB-INF下的tld包下建立page.tld标签。
2丶建与标签对相的标签类,这里叫PageTagImpl.java
public class PageTagImpl extends TagSupport {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(PageTagImpl.class.getName());
//当前页
private Integer currentPage;
//总页数
private Integer totalPages;
//是否有下一页
private Boolean hasNext;
//是否有上一页
private Boolean hasPre;
//显示的最大条目数
private Integer maxShow = 10;
//每一页显示的条目数
private Integer pageSize;
private String pageForm;
@Override
public int doStartTag() throws JspException {
try {
generationPageHTML();
} catch (Exception e) {
logger.error(e.getMessage(),e);
}
return EVAL_BODY_INCLUDE;
}
/**
* @Title: generationPageHTML
* @Description: 生成分页的html
* @throws IOException 参数
* void 返回类型
* @throws
*/
private void generationPageHTML()
throws IOException {
StringBuffer out = new StringBuffer("<p pageForm=\""+pageForm+"\" id=\"pageControl\" class=\"page-bar\">");
out.append("共").append(totalPages).append("页,每页显示:").append(pageSize).append("条");
out.append("<a gopage=\"1\" href=\"###\"><em class=\"first-page\"></em></a>");
int startPage = 1;
int endPage = Math.min(maxShow, totalPages);
if(totalPages>maxShow && currentPage>maxShow-1){
int maxShowHalf = maxShow/2;
startPage = currentPage - maxShowHalf;
endPage = currentPage + maxShowHalf-1;
}
if(hasPre){
out.append("<a gopage=\"-1\" href=\"###\"><em class=\"pre-page\"></em></a>");
}
String clasz = "";
for(int index=startPage;index<=endPage;index++){
if(index==currentPage){
clasz = " class=\"cura\"";
}else{
clasz = "";
}
out.append("<a gopage=\""+index+"\" href=\"###\" "+clasz+">"+index+"</a>");
}
if(hasNext){
out.append("<a gopage=\"-2\" href=\"###\"><em class=\"next-page\"></em></a>");
}
out.append("<a gopage=\""+totalPages+"\" href=\"###\"><em class=\"last-page\"></em></a>");
out.append("<a href=\"###\"><em class=\"go-page\">GO</em></a>");
//业务逻辑
/**
* <p class="page-bar">
共20页,每页显示:10条
<a href="###"><em class="first-page"></em></a>
<a href="###"><em class="pre-page"></em></a>
<a href="###">1</a>
<a href="###" class="cura">2</a>
<a href="###">3</a>
<a href="###">4</a>
<a href="###">5</a>
<a href="###">6</a>
<a href="###">7</a>
<a href="###">8</a>
<a href="###"><em class="next-page"></em></a>
<a href="###"><em class="last-page"></em></a>
<a href="###"><em class="go-page">GO</em></a>
</p>
*/
out.append("</p>");
pageContext.getOut().write(out.toString());
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getTotalPages() {
return totalPages;
}
public void setTotalPages(Integer totalPages) {
this.totalPages = totalPages;
}
public Boolean getHasNext() {
return hasNext;
}
public void setHasNext(Boolean hasNext) {
this.hasNext = hasNext;
}
public Boolean getHasPre() {
return hasPre;
}
public void setHasPre(Boolean hasPre) {
this.hasPre = hasPre;
}
public Integer getMaxShow() {
return maxShow;
}
public void setMaxShow(Integer maxShow) {
this.maxShow = maxShow;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public String getPageForm() {
return pageForm;
}
public void setPageForm(String pageForm) {
this.pageForm = pageForm;
}
}
这个类的属性对应的是tid文件的每个属性,doStartTag()方法是为了向JSP页面输出你想要分页的格式内容,包括从数据库中的到的PageBean的属性设置。
3丶建立一个PageBean对象用来与JSP打交道(包括初始化对象,可不建,不是必要的文件)
public class PageBean {
/**
* 属性serialVersionUID
*/
//每页显示条数
public static final int PAGESIZE = 10;
//当前页
private int currentPage;
//总页数
public int totalPages;
//每页显示条数
private int pageSize;
//总行数
private int totalRows;
//显示开始位置
private int startNum;
//显示结束位置
private int endIndex;
//下一页
private int nextPage;
//前一页
private int previousPage;
//查询记录数
private int queryRecordSize;
//是否有下一页
private boolean hasNextPage;
//是否有上一页
private boolean hasPreviousPage;
public PageBean() {
this.currentPage = 1;
this.pageSize = PAGESIZE;
this.startNum =0;
this.endIndex = PAGESIZE;
}
public void initMap(Map<String, Object> param){
param.put("startNum", this.startNum);
param.put("endIndex", this.endIndex);
}
public void initMap2(Map<String, String> param){
param.put("startNum", this.startNum+"");
param.put("endIndex", this.endIndex+"");
}
public PageBean(int totalRows) {
this(totalRows, 1, PAGESIZE);
}
public PageBean(int totalRows, int currentPage) {
this(totalRows, currentPage, PAGESIZE);
}
public PageBean(int totalRows, int currentPage, int pageSize) {
this.currentPage = 1;
this.totalPages = 0;
this.pageSize = 0;
this.totalRows = 0;
this.startNum = 0;
this.nextPage = 0;
this.previousPage = 0;
this.queryRecordSize = 10;
this.hasNextPage = false;
this.hasPreviousPage = false;
this.pageSize = pageSize;
this.currentPage = currentPage;
this.totalRows = totalRows;
this.endIndex = pageSize;
repaginate();
}
public void repaginate() {
if (this.totalRows % this.pageSize == 0) {
this.totalPages = (this.totalRows / this.pageSize);
} else {
this.totalPages = (this.totalRows / this.pageSize + 1);
}
if (this.currentPage >= this.totalPages) {
this.hasNextPage = false;
this.currentPage = this.totalPages;
} else {
this.hasNextPage = true;
}
if (this.currentPage <= 1) {
this.hasPreviousPage = false;
this.currentPage = 1;
} else {
this.hasPreviousPage = true;
}
if(this.currentPage <= 1)
{
this.startNum = 0;
}else
{
this.startNum = ((this.currentPage - 1) * this.pageSize + 1);
}
if(this.currentPage > 1 && this.currentPage != this.totalPages)
{
this.endIndex = this.currentPage * this.pageSize ;
}else if(this.currentPage > 1 && this.currentPage == this.totalPages)
{
this.startNum = (this.currentPage - 1) * this.pageSize;
this.endIndex = this.totalRows;
}else
{
this.endIndex = this.pageSize ;
}
this.nextPage = (this.currentPage + 1);
if (this.nextPage >= this.totalPages) {
this.nextPage = this.totalPages;
}
this.previousPage = (this.currentPage - 1);
if (this.previousPage <= 1) {
this.previousPage = 1;
}
if (this.queryRecordSize != 0)
return;
this.queryRecordSize = this.pageSize;
}
public boolean isHasNextPage() {
return this.hasNextPage;
}
public boolean isHasPreviousPage() {
return this.hasPreviousPage;
}
public int getNextPage() {
return this.nextPage;
}
public void setNextPage(int nextPage) {
this.nextPage = nextPage;
}
public int getPreviousPage() {
return this.previousPage;
}
public void setPreviousPage(int previousPage) {
this.previousPage = previousPage;
}
public int getCurrentPage() {
return this.currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
this.startNum = pageSize*(this.currentPage-1)+1;
this.endIndex = pageSize*(this.currentPage);
}
public int getPageSize() {
return this.pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPages() {
return this.totalPages;
}
public int getTotalRows() {
return this.totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
public int getStartNum() {
return this.startNum;
}
public void setStartNum(int startNum) {
this.startNum = startNum;
}
public int getQueryRecordSize() {
return this.queryRecordSize;
}
public void setQueryRecordSize(int queryRecordSize) {
this.queryRecordSize = queryRecordSize;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public int getEndIndex() {
return endIndex;
}
public void setEndIndex(int endIndex) {
this.endIndex = endIndex;
}
}
这里的repaginate()方法是在serverImpl中调用,也就是说当你在数据库中查询出数据总数的时候就要重置PageBean里的各个属性,再将它传给Jsp。
serverImpl的调用:
public List<CollegeDto> searchPage(Map<String,String> map, PageBean pageBean) {
pageBean.initMap2(map);
List<CollegeDto> colleges = collegeDao.searchPage(map);
if(!colleges.isEmpty()){
pageBean.setTotalRows(colleges.get(0).getNums());
pageBean.repaginate();
}
return colleges;
}
最后,在JSP页面给表单加一个标签调用即可。
JSP代码:
<form action="${ctx}/core/college.findCollegeDto.html" id="myPageForm">
<input type="hidden" name="pageBean.currentPage" value="${pageBean.currentPage }">
</form>
<page:pageTag currentPage="${pageBean.currentPage }"
totalPages="${pageBean.totalPages }" hasNext="${pageBean.hasNextPage }"
hasPre="${pageBean.hasPreviousPage }" pageSize="${pageBean.pageSize }"
maxShow="10" pageForm="myPageForm"></page:pageTag>
JS代码:
当点击下一页或者页码数时触发的事件,把当前页传入查询方法再一次查询。
$(function(){
$("#pageControl").find("a").each(function(){
$(this).click(function(){
var currentPage = $("input[name='pageBean.currentPage']").val();
var pageFormId = $("#pageControl").attr("pageForm");
var gopage = $(this).attr("gopage");
//alert(gopage);
if(gopage==-1){
currentPage = new Number(currentPage)-1;
}else if(gopage==-2){
currentPage = new Number(currentPage)+1;
}else{
currentPage = gopage;
}
$("input[name='pageBean.currentPage']").val(currentPage);
$("#"+pageFormId).submit();
});
});
});
最后我捋一捋思路:
1丶首先点击到该页面时,进入FindXX.do方法查询出总条数,并把PageBean的属性重置,设置好各个属性,包括总页面,总条数,是否有下一页,是否有上一页等属性,并把该对象返回给调用该indXX.do方法的JSP页面,待JSP加载到<page:pageTag />
标签时便会根据你tid文件关联的Class类找到PageTagImpl类,然后根据你的方法输出一段html到你写上标签的JSP页面处。
2丶再根据这段HTML设置的属性写上JS代码点击事件将该当前页传入该Action即可。
至此,只要讲JS代码和<page:pageTag />
标签引入JSP页面内便可实现分页查询功能。