<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)

    成員連接

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

      在Web應(yīng)用開(kāi)發(fā)中,不管是有沒(méi)有數(shù)據(jù)庫(kù),經(jīng)常要用到分頁(yè)處理問(wèn)題。EasyJWeb中通過(guò)引入IPageList接口來(lái)輕松解決我們的遇到的各種分頁(yè)問(wèn)題,包括對(duì)數(shù)據(jù)庫(kù)記錄分頁(yè)、文件目錄分頁(yè)、數(shù)組或者Java對(duì)象分頁(yè)等。

      EasyJWeb作為一個(gè)Web框架,其MVC核心中本身沒(méi)有包含分頁(yè)的內(nèi)容,我們這里所說(shuō)的分頁(yè)設(shè)計(jì)是指在EasyJWeb?Tools業(yè)務(wù)引擎中關(guān)于分頁(yè)需求應(yīng)用的設(shè)計(jì)。

      1、應(yīng)用示例代碼

      首先們看看該分頁(yè)設(shè)計(jì)的有關(guān)應(yīng)用示例代碼,該示例的完整代碼可在http://www.easyjf.com/download.htm中下載!
    ???
      示例代碼A:com.easyjweb.action.userManageAction.java

      這是EasyJWeb文檔中示例3(添刪改查)中有關(guān)記錄分頁(yè)顯示的部分代碼:
    ??public?class?userManageAction?extends?AbstractCrudAction?{
      public?IPageList?doQuery(WebForm?form,?int?currentPage,?int?pageSize)?{
    ???....

    ????DbPageList?pList=new?DbPageList(User.class,scope,paras);//通過(guò)調(diào)用DbPageList對(duì)象,返回分頁(yè)結(jié)果IPageList
    ???????pList.doList(currentPage,pageSize);
    ???????return?pList;
    ??}
    ??...

      從代碼中我們可以看出,這是一個(gè)對(duì)數(shù)庫(kù)記錄集對(duì)象的分頁(yè)處理例子。直接通實(shí)現(xiàn)了IPageList接口的DbPageList類(lèi)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的分頁(yè)。


      示例代碼B:net.meybo.mail.action.EmailAction.java

      這是MeyboMail?Web郵件客戶(hù)端開(kāi)源簡(jiǎn)化版中,中對(duì)郵件主題進(jìn)行分頁(yè)顯示的代碼。
      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()));
    ???????????}??
      ...

      上面例子中是對(duì)一個(gè)List集合進(jìn)行分頁(yè),因?yàn)镸eyboMail?Web中沒(méi)有用到數(shù)據(jù)庫(kù),所以使用ListQuery查詢(xún)處理器進(jìn)行處理。

       

    2、EasyJWeb?Tools中業(yè)務(wù)引擎中有關(guān)分頁(yè)的接口及類(lèi)

      EasyJWeb?Tools中通過(guò)使用IPageList及IQuery兩個(gè)接口對(duì)分頁(yè)問(wèn)題進(jìn)行抽象。
      下面是IPageList接口的全部代碼:
      
    ????package?com.easyjf.web.tools;
    ???import?java.util.Collection;
    ???import?java.util.List;
    ???public?interface?IPageList?{
    ???public?List?getResult();//取回分頁(yè)的結(jié)果
    ???public?void?setQuery(IQuery?q);//設(shè)置查詢(xún)處理器
    ???public?int?getPages();//返回總頁(yè)數(shù)
    ???public?int?getRowCount();//返回總記錄數(shù)
    ???public?int?getCurrentPage();//返回當(dāng)前頁(yè)
    ???public?void?doList(int?pageSize,int?pageNo,String?totalSQL,String?queryHQL);//執(zhí)行分頁(yè)處理
    ???public?void?doList(int?pageSize,int?pageNo,String?totalSQL,String?queryHQL,Collection?paraValues);//執(zhí)行分頁(yè)處理
    ???}

      在IPageList中,我們看到通過(guò)設(shè)置查詢(xún)處理器實(shí)現(xiàn)數(shù)據(jù)的查詢(xún)及分頁(yè),這里我們?cè)诳纯碔Query接口的內(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ù)條件查詢(xún)并返回結(jié)果
      void?setFirstResult(int?begin);//設(shè)置開(kāi)始記錄
      void?setMaxResults(int?max);//設(shè)置每次查詢(xún)返回的最大記錄
      void?setParaValues(Collection?paraValues);//設(shè)置查詢(xún)參數(shù)值
      List?getResult(String?conditing,int?begin,int?max);//從結(jié)果集中begin開(kāi)始的位置,取max條記錄
      }

      由此可見(jiàn),我們的IPageList其實(shí)是通過(guò)設(shè)置調(diào)用不同的查詢(xún)處理器實(shí)現(xiàn)對(duì)不同類(lèi)型數(shù)據(jù)來(lái)進(jìn)行分頁(yè)處理的。?


    3、通用分頁(yè)處理IPageList的實(shí)現(xiàn)PageList類(lèi)
      在EasyJWeb?Tools中,我們的PageList類(lèi)實(shí)現(xiàn)了IPageList接口,其是一個(gè)通用的分頁(yè)處理類(lèi),其它各種類(lèi)型數(shù)據(jù)的分頁(yè)可以通過(guò)繼承它來(lái)實(shí)現(xiàn)。

      PageList.java的全部代碼如下:

      package?com.easyjf.web.tools;

    import?java.util.*;
    /**
    *?實(shí)現(xiàn)通過(guò)調(diào)用IQuery實(shí)現(xiàn)分頁(yè)處理
    *?@author?蔡世友
    *
    */
    public?class?PageList??implements?IPageList{
    private?int?rowCount;//記錄數(shù)
    private?int?pages;//總頁(yè)數(shù)????
    private?int?currentPage;//實(shí)際頁(yè)數(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;?//記算總頁(yè)數(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;?//記算總頁(yè)數(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訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí)的IQuery接口實(shí)現(xiàn)
      這是EasyJF網(wǎng)站后臺(tái)中,使用Hibernate中間件對(duì)數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)時(shí)候,其對(duì)應(yīng)查詢(xún)處理器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、對(duì)于List列表數(shù)據(jù)進(jìn)行分頁(yè)的查詢(xún)處理器ListQuery實(shí)現(xiàn)

      當(dāng)我們要分頁(yè)的目標(biāo)數(shù)據(jù)不是數(shù)據(jù)庫(kù)記錄,而是其它儲(chǔ)存方式時(shí)(如文本、xml或者內(nèi)存中的實(shí)時(shí)對(duì)象線(xiàn)程等),可以轉(zhuǎn)化為數(shù)組或List等。這時(shí)可通過(guò)使用ListQuery查詢(xún)處理器實(shí)現(xiàn)分頁(yè)查詢(xú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)于分頁(yè)的算法討論
      由于EasyJWeb?Tools業(yè)務(wù)引擎是對(duì)眾多分頁(yè)需求的簡(jiǎn)單抽象。因此,無(wú)法對(duì)分頁(yè)查詢(xún)處理器的算法等作具體的限制,上面給出的兩個(gè)查詢(xún)處理器只是一個(gè)簡(jiǎn)單的應(yīng)用實(shí)例,大家可以根據(jù)實(shí)際應(yīng)用項(xiàng)目中的需求進(jìn)行查詢(xún)處理器的實(shí)現(xiàn)及算法設(shè)計(jì)。
      
      由于水平有限,該設(shè)計(jì)上有很多不合理的地方,懇請(qǐng)大家指正!


    7、EasyJWeb簡(jiǎn)介

      EasyJWeb是基于java技術(shù),應(yīng)用于WEB應(yīng)用程序快速開(kāi)發(fā)的MVC框架,框架設(shè)計(jì)構(gòu)思來(lái)源于國(guó)內(nèi)眾多項(xiàng)目實(shí)踐,充分借簽了當(dāng)前主流的開(kāi)源Web框架(Struts、JSF、Tapestry?、Webwork等),吸取了其優(yōu)點(diǎn)及精華,利用Velocity作為模板頁(yè)面引擎,是一個(gè)實(shí)現(xiàn)了頁(yè)面及代碼完全分離的MVC開(kāi)發(fā)框架,是一個(gè)旨在于為中小型Web應(yīng)用系統(tǒng)提供快速開(kāi)發(fā)實(shí)踐的簡(jiǎn)易Web框架。

      EasyJF開(kāi)源團(tuán)隊(duì)于2006年初才開(kāi)始建設(shè),因此當(dāng)前整個(gè)開(kāi)發(fā)團(tuán)隊(duì)組建以及所發(fā)布的作品,都顯得極不成熟。EasyJWeb仍然處于測(cè)試階段,請(qǐng)廣大的Java愛(ài)好者多多批評(píng)及建議。同進(jìn)也非常歡迎您能加入到我們的國(guó)產(chǎn)開(kāi)源隊(duì)伍中。

      EasyJWeb官方網(wǎng)址:www.easyjf.com
    ????EasyJF團(tuán)隊(duì)官方網(wǎng)址:www.easyjf.com?

    posted on 2006-04-10 10:22 簡(jiǎn)易java框架 閱讀(1182) 評(píng)論(2)  編輯  收藏

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

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


      回復(fù)  更多評(píng)論
      
    # re: EasyJWeb Tools中業(yè)務(wù)引擎分頁(yè)的設(shè)計(jì)實(shí)現(xiàn) 2006-04-10 18:23 大峽
    樓上的建議很好,因?yàn)镮PageList屬于業(yè)務(wù)層,而WebForm屬于表示層,因此現(xiàn)在我們是通過(guò)一個(gè)簡(jiǎn)單的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ù)  更多評(píng)論
      

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产成人无码免费网站| 相泽南亚洲一区二区在线播放| 永久免费无码日韩视频| 日本黄页网站免费| 亚洲国产av玩弄放荡人妇| 女人被免费视频网站| 亚洲日韩av无码中文| 日本免费人成黄页网观看视频| 亚洲熟妇无码一区二区三区导航| 在线视频观看免费视频18| 亚洲熟妇无码AV不卡在线播放| 成年人在线免费看视频| 亚洲成av人无码亚洲成av人| 日韩精品免费电影| 美女黄频免费网站| 久久精品国产亚洲精品| 中文字幕永久免费| 精品亚洲成AV人在线观看| 91精品成人免费国产片| 亚洲精华国产精华精华液网站| 亚洲av无码乱码在线观看野外 | 久久久久久国产精品免费免费| 2017亚洲男人天堂一| 日本一道高清不卡免费| 一本到卡二卡三卡免费高| 亚洲精品亚洲人成在线观看| 99re视频精品全部免费| 亚洲一卡2卡三卡4卡无卡下载| 免费乱码中文字幕网站| a级毛片黄免费a级毛片| 亚洲人妖女同在线播放| 国产jizzjizz视频免费看| 最近国语视频在线观看免费播放| 亚洲综合一区二区精品久久| 四虎影视www四虎免费| 又长又大又粗又硬3p免费视频| 亚洲色图在线播放| 波多野结衣久久高清免费| a在线免费观看视频| 亚洲熟妇无码一区二区三区导航| 亚洲中文字幕无码一久久区|