在Web應(yīng)用開發(fā)中,不管是有沒有數(shù)據(jù)庫,經(jīng)常要用到分頁處理問題。EasyJWeb中通過引入IPageList接口來輕松解決我們的遇到的各種分頁問題,包括對數(shù)據(jù)庫記錄分頁、文件目錄分頁、數(shù)組或者Java對象分頁等。
EasyJWeb作為一個(gè)Web框架,其MVC核心中本身沒有包含分頁的內(nèi)容,我們這里所說的分頁設(shè)計(jì)是指在EasyJWeb?Tools業(yè)務(wù)引擎中關(guān)于分頁需求應(yīng)用的設(shè)計(jì)。
1、應(yīng)用示例代碼 首先們看看該分頁設(shè)計(jì)的有關(guān)應(yīng)用示例代碼,該示例的完整代碼可在
http://www.easyjf.com/download.htm中下載!
???
示例代碼A:com.easyjweb.action.userManageAction.java
這是EasyJWeb文檔中示例3(添刪改查)中有關(guān)記錄分頁顯示的部分代碼:
??public?class?userManageAction?extends?AbstractCrudAction?{
public?IPageList?doQuery(WebForm?form,?int?currentPage,?int?pageSize)?{
???....
????DbPageList?pList=new?DbPageList(User.class,scope,paras);//通過調(diào)用DbPageList對象,返回分頁結(jié)果IPageList
???????pList.doList(currentPage,pageSize);
???????return?pList;
??}
??...
從代碼中我們可以看出,這是一個(gè)對數(shù)庫記錄集對象的分頁處理例子。直接通實(shí)現(xiàn)了IPageList接口的DbPageList類實(shí)現(xiàn)數(shù)據(jù)庫的分頁。
示例代碼B:net.meybo.mail.action.EmailAction.java
這是MeyboMail?Web郵件客戶端開源簡化版中,中對郵件主題進(jìn)行分頁顯示的代碼。
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()));
???????????}??
...
上面例子中是對一個(gè)List集合進(jìn)行分頁,因?yàn)镸eyboMail?Web中沒有用到數(shù)據(jù)庫,所以使用ListQuery查詢處理器進(jìn)行處理。
2、EasyJWeb?Tools中業(yè)務(wù)引擎中有關(guān)分頁的接口及類 EasyJWeb?Tools中通過使用IPageList及IQuery兩個(gè)接口對分頁問題進(jìn)行抽象。
下面是IPageList接口的全部代碼:
????package?com.easyjf.web.tools;
???import?java.util.Collection;
???import?java.util.List;
???public?interface?IPageList?{
???public?List?getResult();//取回分頁的結(jié)果
???public?void?setQuery(IQuery?q);//設(shè)置查詢處理器
???public?int?getPages();//返回總頁數(shù)
???public?int?getRowCount();//返回總記錄數(shù)
???public?int?getCurrentPage();//返回當(dāng)前頁
???public?void?doList(int?pageSize,int?pageNo,String?totalSQL,String?queryHQL);//執(zhí)行分頁處理
???public?void?doList(int?pageSize,int?pageNo,String?totalSQL,String?queryHQL,Collection?paraValues);//執(zhí)行分頁處理
???}
在IPageList中,我們看到通過設(shè)置查詢處理器實(shí)現(xiàn)數(shù)據(jù)的查詢及分頁,這里我們在看看IQuery接口的內(nèi)容:
package?com.easyjf.web.tools;
import?java.util.Collection;
import?java.util.List;
public?interface?IQuery?{
int?getRows(String?conditing);//得到總記錄數(shù)
List?getResult(String?conditing);//根據(jù)條件查詢并返回結(jié)果
void?setFirstResult(int?begin);//設(shè)置開始記錄
void?setMaxResults(int?max);//設(shè)置每次查詢返回的最大記錄
void?setParaValues(Collection?paraValues);//設(shè)置查詢參數(shù)值
List?getResult(String?conditing,int?begin,int?max);//從結(jié)果集中begin開始的位置,取max條記錄
}
由此可見,我們的IPageList其實(shí)是通過設(shè)置調(diào)用不同的查詢處理器實(shí)現(xiàn)對不同類型數(shù)據(jù)來進(jìn)行分頁處理的。?
3、通用分頁處理IPageList的實(shí)現(xiàn)PageList類 在EasyJWeb?Tools中,我們的PageList類實(shí)現(xiàn)了IPageList接口,其是一個(gè)通用的分頁處理類,其它各種類型數(shù)據(jù)的分頁可以通過繼承它來實(shí)現(xiàn)。
PageList.java的全部代碼如下:
package?com.easyjf.web.tools;
import?java.util.*;
/**
*?實(shí)現(xiàn)通過調(diào)用IQuery實(shí)現(xiàn)分頁處理
*?@author?蔡世友
*
*/
public?class?PageList??implements?IPageList{
private?int?rowCount;//記錄數(shù)
private?int?pages;//總頁數(shù)????
private?int?currentPage;//實(shí)際頁數(shù)
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;?//記算總頁數(shù)???????
???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;?//記算總頁數(shù)???????
???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訪問數(shù)據(jù)庫時(shí)的IQuery接口實(shí)現(xiàn) 這是EasyJF網(wǎng)站后臺(tái)中,使用Hibernate中間件對數(shù)據(jù)庫訪問時(shí)候,其對應(yīng)查詢處理器IQuery接口的實(shí)現(xiàn)。
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("參數(shù)":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列表數(shù)據(jù)進(jìn)行分頁的查詢處理器ListQuery實(shí)現(xiàn) 當(dāng)我們要分頁的目標(biāo)數(shù)據(jù)不是數(shù)據(jù)庫記錄,而是其它儲(chǔ)存方式時(shí)(如文本、xml或者內(nèi)存中的實(shí)時(shí)對象線程等),可以轉(zhuǎn)化為數(shù)組或List等。這時(shí)可通過使用ListQuery查詢處理器實(shí)現(xiàn)分頁查詢。
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、關(guān)于分頁的算法討論 由于EasyJWeb?Tools業(yè)務(wù)引擎是對眾多分頁需求的簡單抽象。因此,無法對分頁查詢處理器的算法等作具體的限制,上面給出的兩個(gè)查詢處理器只是一個(gè)簡單的應(yīng)用實(shí)例,大家可以根據(jù)實(shí)際應(yīng)用項(xiàng)目中的需求進(jìn)行查詢處理器的實(shí)現(xiàn)及算法設(shè)計(jì)。
由于水平有限,該設(shè)計(jì)上有很多不合理的地方,懇請大家指正!
7、EasyJWeb簡介 EasyJWeb是基于java技術(shù),應(yīng)用于WEB應(yīng)用程序快速開發(fā)的MVC框架,框架設(shè)計(jì)構(gòu)思來源于國內(nèi)眾多項(xiàng)目實(shí)踐,充分借簽了當(dāng)前主流的開源Web框架(Struts、JSF、Tapestry?、Webwork等),吸取了其優(yōu)點(diǎn)及精華,利用Velocity作為模板頁面引擎,是一個(gè)實(shí)現(xiàn)了頁面及代碼完全分離的MVC開發(fā)框架,是一個(gè)旨在于為中小型Web應(yīng)用系統(tǒng)提供快速開發(fā)實(shí)踐的簡易Web框架。
EasyJF開源團(tuán)隊(duì)于2006年初才開始建設(shè),因此當(dāng)前整個(gè)開發(fā)團(tuán)隊(duì)組建以及所發(fā)布的作品,都顯得極不成熟。EasyJWeb仍然處于測試階段,請廣大的Java愛好者多多批評及建議。同進(jìn)也非常歡迎您能加入到我們的國產(chǎn)開源隊(duì)伍中。
EasyJWeb官方網(wǎng)址:
www.easyjf.com????EasyJF團(tuán)隊(duì)官方網(wǎng)址:
www.easyjf.com?
posted on 2006-04-10 10:22
簡易java框架 閱讀(1182)
評論(2) 編輯 收藏