PE分页标签实现分析
PE中通过自定义标签提供了分页功能(前台部分)。前台要实现分页,主要就是需要向后台传递将要展示的页数编号。
<pe:combinedPage total="${recordNumber}" pageSize="${pageSize}" formName="form2" ajax="true" script="true" action="BaoAcctErrorList.do" fieldList="BeginDate,EndDate"/>
<table width="100%" border="0" cellpadding="0" cellspacing="0" >
<tr >
<td class="pagesLinks" width="100%" align="right">
当前第<b><pe:PageNo/></b>页 共<b><pe:PageNumber/></b>页 <b><pe:RecordNumber/></b>条记录
<pe:GotoPage type='1' insertContent="class='xxx'" insertContent2="class='yyy' "/>
<pe:TopPage type='2' value="Page.TopPage" />
<pe:PrevPage type='2' value="Page.PrevPage"/>
<pe:NextPage type='2' value="Page.NextPage" />
<pe:BottomPage type='2' value="Page.BottomPage" />
</td>
</tr>
</table>
这事pe中常用的前台页面代码结构,接下来就分析一下这些标签的代码,看看是如何实现分页的。
首先是combinedPage这个标签:
PageBean pageBean = new PageBean();
pageBean.xhtml = xhtml;
pageBean.jsDisabled = jsDisabled;
pageBean.scriptSuffix = this.scriptSuffix;
pageBean.action = this.action;
pageBean.hiddenFieldName = this.hiddenFieldName;
pageBean.hiddenTotalFieldName = this.hiddenTotalFieldName;
this.pageContext.setAttribute(this.var, pageBean, 1);
pageBean.recordNumber = 0;
pageBean.pageSize = this.defaultPageSize;
//记录总数(标签属性传递)
Object tmpObject = this.total;
if (tmpObject != null){
if ((tmpObject instanceof Number)) {
pageBean.recordNumber = ((Number)tmpObject).intValue();
} else{
String tmpStr = tmpObject.toString();
if (tmpStr.equals("")){
System.err.println("CombinedPageTag: total is invalid!, pls delete this tag or use pagable action");
return 0;
}
pageBean.recordNumber = Integer.parseInt(tmpStr);
}
}else{
String tmpStr = this.pageContext.getRequest().getParameter(this.hiddenTotalFieldName);
if (tmpStr != null){
pageBean.recordNumber = Integer.parseInt(tmpStr);
}else{
System.err.println("CombinedPageTag: total is invalid!!, pls delete this tag or use pagable action");
return 0;
}
}
//pageSize标签属性
Object pageSizeObject = this.pageSize;
if (pageSizeObject != null){
if ((pageSizeObject instanceof Number)){
pageBean.pageSize = ((Number)pageSizeObject).intValue();
}else {
String tmpStr = pageSizeObject.toString();
pageBean.pageSize = Integer.parseInt(tmpStr);
}
}
//总页数
pageBean.pageNumber = ((pageBean.recordNumber + pageBean.pageSize - 1) / pageBean.pageSize);
int pageNo = 0;
//当前页数
Object currentIndexInRequest = this.pageContext.getAttribute(this.hiddenFieldName, 2);
if (currentIndexInRequest != null){
if ((currentIndexInRequest instanceof Number)){
pageNo = ((Number)currentIndexInRequest).intValue();
}else{
pageNo = Integer.parseInt(currentIndexInRequest.toString());
}
}else{
String currentIndex = this.pageContext.getRequest().getParameter(this.hiddenFieldName);
if (currentIndex != null){
pageNo = Integer.parseInt(currentIndex);
}
}
pageBean.pageNo = (pageNo / pageBean.pageSize + 1);
pageBean.prevPageIndex = pageNo;
pageBean.nextPageIndex = pageNo;
pageBean.lastPageIndex = ((pageBean.pageNumber - 1) * pageBean.pageSize);
if (pageNo >= pageBean.pageSize){
pageBean.prevPageEnable = true;
pageBean.prevPageIndex = (pageNo - pageBean.pageSize);
}
if (pageNo + pageBean.pageSize < pageBean.recordNumber) {
pageBean.nextPageEnable = true;
pageBean.nextPageIndex = (pageNo + pageBean.pageSize);
}
这个标签的代码量较大,主要作用就是根据页面上设置的属性(total,pageSize)来计算总共的页数,并且输出需要的js代码,供下面的标签调用,同时通过一个PageBean对象来保存一些分页相关的数据。
下面看下当前页号标签PageNo的代码:
public int doStartTag() throws JspException {
try{
PageBean pageBean = (PageBean)this.pageContext.getAttribute(this.var, 1);
if (pageBean == null){
this.pageContext.getOut().print("pls define combinedPage Tag before:" + getClass().getName());
}else {
this.pageContext.getOut().print(pageBean.getPageNo());
}
}catch (Exception ex){
throw new JspException("pe.http.tag_fail_to_write", ex);
}
return 0;
}
下一页标签PrePage的代码:
public int doStartTag()throws JspException{
PageBean pageBean = (PageBean)this.pageContext.getAttribute(this.var, 1);
if (pageBean == null){
try {
this.pageContext.getOut().print("pls define combinedPage Tag before:" + getClass().getName());
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
if ((!pageBean.isPrevPageEnable()) && (this.hidden)){
return 0;
}
if (pageBean.jsDisabled) {
return doStartTagWithoutJS(pageBean);
}
return doStartTagForDefault(pageBean);
}
private int doStartTagForDefault(PageBean pageBean) throws JspException {
try{
StringBuffer sb = new StringBuffer();
if (this.type == 1){
sb.append("<input ");
sb.append(this.insertContent);
sb.append("type='button' ");
sb.append("id='PrevPage' ");
sb.append("name='PrevPage' ");
sb.append("value='");
sb.append(format(this.value));
sb.append("' ");
}else if (this.type == 2){
sb.append("<a href=\"####\" ");
sb.append(this.insertContent);
}
sb.append(" ");
if (pageBean.isPrevPageEnable()){
sb.append("onClick=\"pe_changePage").append(pageBean.scriptSuffix).append("(this,");
sb.append(pageBean.getPrevPageIndex());
sb.append(")\"");
}else if (pageBean.xhtml) {
sb.append("disabled=\"disabled\"");
} else {
sb.append("disabled");
}
sb.append(" ");
if (this.type == 1){
sb.append("/>");
} else if (this.type == 2){
sb.append(">");
sb.append(format(this.value));
sb.append("</a>");
}
this.pageContext.getOut().print(sb.toString());
} catch (Exception ex){
throw new JspException("pe.http.tag_fail_to_write", ex);
}
return 0;
}
其他标签实现方式类似,这里就不再分析了。
by CSII@王大仙