<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 115  文章 - 481  trackbacks - 0
    <2006年4月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    常用鏈接

    留言簿(19)

    隨筆檔案(115)

    文章檔案(4)

    新聞檔案(1)

    成員連接

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

      在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)  編輯  收藏

    FeedBack:
    # re: EasyJWeb Tools中業(yè)務(wù)引擎分頁的設(shè)計(jì)實(shí)現(xiàn) 2006-04-10 17:57 胡子魚

    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è)對象,是否比較好?


      回復(fù)  更多評論
      
    # re: EasyJWeb Tools中業(yè)務(wù)引擎分頁的設(shè)計(jì)實(shí)現(xiàn) 2006-04-10 18:23 大峽
    樓上的建議很好,因?yàn)镮PageList屬于業(yè)務(wù)層,而WebForm屬于表示層,因此現(xiàn)在我們是通過一個(gè)簡單的Util實(shí)現(xiàn)兩者的轉(zhuǎn)換的,如下所示:
    public static void saveIPageList2WebForm(IPageList pList,WebForm
    form)
    {
    if(pList!=null){
    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()));
    }
    }  回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲一区二区三区丝袜| 韩国免费a级作爱片无码| 亚洲AV之男人的天堂| 最近国语视频在线观看免费播放 | 黄色免费在线网站| 国产成人精品日本亚洲18图| 国产一级大片免费看| 久久亚洲免费视频| 亚洲AV永久无码精品网站在线观看 | 另类小说亚洲色图| 久久综合日韩亚洲精品色| 天天看片天天爽_免费播放| aa级毛片毛片免费观看久| 中文字幕 亚洲 有码 在线| 亚洲日本va午夜中文字幕久久 | 亚洲中文字幕久久精品无码喷水| 久久WWW免费人成一看片| 色婷婷综合缴情综免费观看| 亚洲精品免费在线视频| 久久亚洲av无码精品浪潮| 丁香花免费高清视频完整版| 黄色短视频免费看| 亚洲av无码专区在线观看亚| 亚洲人成电影亚洲人成9999网| 国产一区在线观看免费| 中文字幕免费在线看线人| a在线观看免费视频| 精品免费AV一区二区三区| 亚洲成电影在线观看青青| 亚洲精品无码永久在线观看你懂的| 成年人在线免费观看| 5g影院5g天天爽永久免费影院 | 免费一级成人毛片| 好男人www免费高清视频在线| 免费观看在线禁片| 国产va免费精品| 在线观看国产一区亚洲bd| 亚洲 暴爽 AV人人爽日日碰| 4480yy私人影院亚洲| 亚洲产国偷V产偷V自拍色戒 | 久久亚洲精品成人av无码网站|