隨筆 - 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)航:
           
          主站蜘蛛池模板: 曲阳县| 会昌县| 新蔡县| 峡江县| 昭苏县| 安仁县| 山东省| 新河县| 垣曲县| 苍梧县| 鄂州市| 太原市| 报价| 拉孜县| 华宁县| 永嘉县| 河津市| 荔浦县| 南和县| 高州市| 阜平县| 茌平县| 正安县| 宁晋县| 肇东市| 当雄县| 唐山市| 桦甸市| 南靖县| 佛冈县| 安陆市| 望谟县| 佛山市| 岑溪市| 南木林县| 崇左市| 龙口市| 文成县| 靖远县| 涞水县| 甘洛县|