【CSII-PE】PE分页标签实现分析

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@王大仙

猜你喜欢

转载自blog.csdn.net/joxlin/article/details/81561770
PE
今日推荐