EasyJWeb Tools業務引擎中分頁的設計及實現

來源:互聯網
上載者:User
web|分頁|設計  在Web應用開發中,不管是有沒有資料庫,經常要用到分頁處理問題。EasyJWeb中通過引入IPageList介面來輕鬆解決我們的遇到的各種分頁問題,包括對資料庫記錄分頁、檔案目錄分頁、數組或者Java對象分頁等。

  EasyJWeb作為一個Web架構,其MVC核心中本身沒有包含分頁的內容,我們這裡所說的分頁設計是指在EasyJWeb Tools業務引擎中關於分頁需求應用的設計。

   1、應用範例程式碼

  首先們看看該分頁設計的有關應用範例程式碼,該樣本的完整代碼可在 http://www.easyjf.com/download.htm中下載!
   
   範例程式碼A:com.easyjweb.action.userManageAction.java

  這是EasyJWeb文檔中樣本3(添刪改查)中相關記錄分頁顯示的部分代碼:
  public class userManageAction extends AbstractCrudAction {
  public IPageList doQuery(WebForm form, int currentPage, int pageSize) {
   ....

    DbPageList pList=new DbPageList(User.class,scope,paras);//通過調用DbPageList對象,返回分頁結果IPageList
       pList.doList(currentPage,pageSize);
       return pList;
  }
  ...

  從代碼中我們可以看出,這是一個對數庫記錄集對象的分頁處理例子。直接通實現了IPageList介面的DbPageList類實現資料庫的分頁。


   範例程式碼B:net.meybo.mail.action.EmailAction.java

  這是MeyboMail Web郵件用戶端開源簡化版中,中對郵件主題進行分頁顯示的代碼。
  public class EmailAction implements IWebAction {
...
  private Page doList(WebForm form, Module module,ActiveUser user)
   {
  ...
  List list=null;
  ...
   list=EmailManage.getMailList(user.getUserName(),user.getServerDomain(),boxName);
  IPageList pList=new PageList(new ListQuery(list));      
     if(pList!=null){
           pList.doList(pageSize,currentPage,"","");
           form.addResult("list",pList.getResult());
           form.addResult("pages",new Integer(pList.getPages()));
           form.addResult("rows",new Integer(pList.getRowCount()));
           form.addResult("page",new Integer(pList.getCurrentPage()));
           form.addResult("gotoPageHTML",CommUtil.showPageHtml(pList.getCurrentPage(),pList.getPages()));
           }  
  ...

  上面例子中是對一個List集合進行分頁,因為MeyboMail Web中沒有用到資料庫,所以使用ListQuery查詢處理器進行處理。

   

2、EasyJWeb Tools中業務引擎中有關分頁的介面及類

  EasyJWeb Tools中通過使用IPageList及IQuery兩個介面對分頁問題進行抽象。
  下面是IPageList介面的全部代碼:
  
    package com.easyjf.web.tools;
   import java.util.Collection;
   import java.util.List;
   public interface IPageList {
   public List getResult();//取回分頁的結果
   public void setQuery(IQuery q);//設定查詢處理器
   public int getPages();//返回總頁數
   public int getRowCount();//返回總記錄數
   public int getCurrentPage();//返回當前頁
   public void doList(int pageSize,int pageNo,String totalSQL,String queryHQL);//執行分頁處理
   public void doList(int pageSize,int pageNo,String totalSQL,String queryHQL,Collection paraValues);//執行分頁處理
   }

  在IPageList中,我們看到通過設定查詢處理器實現資料的查詢及分頁,這裡我們在看看IQuery介面的內容:

  package com.easyjf.web.tools;
  import java.util.Collection;
  import java.util.List;
  public interface IQuery {
  int getRows(String conditing);//得到總記錄數
  List getResult(String conditing);//根據條件查詢並返回結果
  void setFirstResult(int begin);//設定開始記錄
  void setMaxResults(int max);//設定每次查詢返回的最大記錄
  void setParaValues(Collection paraValues);//設定查詢參數值
  List getResult(String conditing,int begin,int max);//從結果集中begin開始的位置,取max條記錄
  }

  由此可見,我們的IPageList其實是通過設定調用不同的查詢處理器實現對不同類型資料來進行分頁處理的。 


3、通用分頁處理IPageList的實現PageList類
  在EasyJWeb Tools中,我們的PageList類實現了IPageList介面,其是一個通用的分頁處理類,其它各種類型資料的分頁可以通過繼承它來實現。

  PageList.java的全部代碼如下:

  package com.easyjf.web.tools;

import java.util.*;
/**
* 實現通過調用IQuery實現分頁處理
* @author 蔡世友
*
*/
public class PageList  implements IPageList{
private int rowCount;//記錄數
private int pages;//總頁數    
private int currentPage;//實際頁數
private List result;
private IQuery query;
public PageList()
{
   
}
public PageList(IQuery q)
{
   this.query=q;
}
public void setQuery(IQuery q)
{
   query=q;
}
public List getResult()
{
   return result;
}

public void doList(int pageSize, int pageNo, String totalSQL, String queryHQL) {
   List rs=null;        
   int total=query.getRows(totalSQL);
   if(total>0){            
   this.rowCount=total;
   this.pages=(this.rowCount + pageSize - 1) / pageSize; //記算總頁數       
   int intPageNo=(pageNo>this.pages?this.pages:pageNo);
   if(intPageNo<1)intPageNo=1;      
   this.currentPage=intPageNo;
   if(pageSize>0){
   query.setFirstResult( (intPageNo - 1) * pageSize);       
   query.setMaxResults(pageSize);
   }
   rs=query.getResult(queryHQL);       
   }
   result=rs;
}
public void doList(int pageSize, int pageNo, String totalSQL, String queryHQL,Collection paraValues) {
   List rs=null;    
   query.setParaValues(paraValues);
   int total=query.getRows(totalSQL);
   if(total>0){            
   this.rowCount=total;
   this.pages=(this.rowCount + pageSize - 1) / pageSize; //記算總頁數       
   int intPageNo=(pageNo>this.pages?this.pages:pageNo);
   if(intPageNo<1)intPageNo=1;      
   this.currentPage=intPageNo;
   if(pageSize>0){
   query.setFirstResult( (intPageNo - 1) * pageSize);       
   query.setMaxResults(pageSize);
   }
   rs=query.getResult(queryHQL);       
   }
   result=rs;
}
public int getPages() {
   return pages;
}
public int getRowCount() {
   return rowCount;
}
public int getCurrentPage() {
   return currentPage;
}




4、使用Hibernate訪問資料庫時的IQuery介面實現
  這是EasyJF網站後台中,使用Hibernate中介軟體對資料庫訪問時候,其對應查詢處理器IQuery介面的實現。

  DbQuery.java的全部代碼:

package com.easyjf.comm;

import java.util.Collection;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import com.easyjf.web.tools.IQuery;
public class DbQuery implements IQuery {    
   private Session session;        
   private int begin;
   private int max;    
   private List paraValues;
   public DbQuery(Session session)
   {
       this.session=session;        
   }
   
   public void setParaValues(Collection paraValues) {    
       this.paraValues=(List)paraValues;
   //    System.out.println("參數":paraValues.size();)
   }

   public int getRows(String conditing) {
       Query query1=session.createQuery(conditing);        
       if(paraValues!=null){        
       for(int i=0;i<paraValues.size();i++)
       {            
           query1.setParameter(i,paraValues.get(i));        
           
       }        
       }        
       int total=((Integer)query1.uniqueResult()).intValue();        
       return total;
   }

   public List getResult(String conditing) {        
       Query query=session.createQuery(conditing);    
       if(paraValues!=null){
           for(int i=0;i<paraValues.size();i++)
           {
               query.setParameter(i,paraValues.get(i));
           }    
           }
       if(begin>0)query.setFirstResult(begin);
       if(max>0)query.setMaxResults(max);
       return query.list();
   }

   public void setFirstResult(int begin) {
       this.begin=begin;
   }

   public void setMaxResults(int max) {
       this.max=max;
   }

   public List getResult(String conditing, int begin, int max) {
       Query query=session.createQuery(conditing);    
       if(begin>0)query.setFirstResult(begin);
       if(max>0)query.setMaxResults(max);
       return query.list();        
   }
   public void setParaValues(List paraValues) {
   this.paraValues=paraValues;
   }


5、對於List列表資料進行分頁的查詢處理器ListQuery實現

  當我們要分頁的目標資料不是資料庫記錄,而是其它儲存方式時(如文本、xml或者記憶體中的即時對象線程等),可以轉化為數組或List等。這時可通過使用ListQuery查詢處理器實現分頁查詢。

  ListQuery.java的全部代碼:

package com.easyjf.web.tools;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class ListQuery implements IQuery {
private int begin=0;
private int max=0;
private List list=null;
public ListQuery()
{
    
}
public ListQuery(List l)
{        
    if(l!=null){
    this.list=l;
    this.max=l.size();
    }
}
public void initList(List l)
{
    this.list=l;
    this.max=l.size();
}
    public int getRows(String conditing) {
        
        return (list==null?0:list.size());
    }

    public List getResult(String conditing) {        
        return list.subList(begin,begin+max>list.size()?list.size():begin+max);
    }
    public void setFirstResult(int begin) {        
        this.begin=list.size()<begin?list.size():begin;        
    }
    public void setMaxResults(int max) {
        this.max=max;
    }
    public List getResult(String conditing, int begin, int max) {
        
        return list;
    }    
    public void setParaValues(Collection paraValues) {
        // TODO Auto-generated method stub        
    }
}

6、關於分頁的演算法討論
  由於EasyJWeb Tools業務引擎是對眾多分頁需求的簡單抽象。因此,無法對分頁查詢處理器的演算法等作具體的限制,上面給出的兩個查詢處理器只是一個簡單的應用執行個體,大家可以根據實際應用項目中的需求進行查詢處理器的實現及演算法設計。
  
  由於水平有限,該設計上有很多不合理的地方,懇請大家指正!


7、EasyJWeb簡介

   EasyJWeb是基於java技術,應用於WEB應用程式快速開發的MVC架構,架構設計構思來源於國內眾多項目實踐,充分借簽了當前主流的開源Web架構(Struts、JSF、Tapestry 、Webwork等),吸取了其優點及精華,利用Velocity作為模板頁面引擎,是一個實現了頁面及代碼完全分離的MVC開發架構,是一個旨在於為中小型Web應用系統提供快速開發實踐的簡易Web架構。

  EasyJF開源團隊於2006年初才開始建設,因此當前整個Team Dev組建以及所發布的作品,都顯得極不成熟。EasyJWeb仍然處於測試階段,請廣大的Java愛好者多多批評及建議。同進也非常歡迎您能加入到我們的國產開源隊伍中。

  EasyJWeb官方網址: www.easyjf.com
    EasyJF團隊官方網址: www.easyjf.com 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.