在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年初才開始建設,因此當前整個開發團隊組建以及所發布的作品,都顯得極不成熟。easyjweb仍然處于測試階段,請廣大的java愛好者多多批評及建議。同進也非常歡迎您能加入到我們的國產開源隊伍中。
easyjweb官方網址:www.easyjf.com
easyjf團隊官方網址:www.easyjf.com 注冊會員,創建你的web開發資料庫,