Dev@Free

          zJun's Tech Weblog

          Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子

          Displaytag1.1支持在外部實(shí)現(xiàn)大數(shù)據(jù)量分頁(yè)。主要有兩種方式實(shí)現(xiàn):

          Displaytag 1.1 offers two alternative ways for working with partial lists:

          • the first one uses the valuelist pattern, and requires that the object that you give to displaytag implements the org.displaytag.pagination.PaginatedList interface. You can pass this object to displaytag as an usual list, and it will extract paging and sorting information from it. This way is more recommended if you have to build your backend layer and you can easily follow this pattern.
          • a second way, recommended if you only have to use partial list for few tables that show a performance problem using full lists, is passing all the needed parameters as separate tag attributes (recors to be shown, page number, total number of records...)

          其中第二種方式看起來(lái)較為簡(jiǎn)單,只需在<displaytag>中增加兩個(gè)屬性:partialList="true"size="resultSize"即可,但是在使用發(fā)現(xiàn)這種方式由于是在原來(lái)內(nèi)存分頁(yè)的基礎(chǔ)上修改的,所以還是存在一些Bug(比如:分頁(yè)導(dǎo)航的值不會(huì)變......)

          所以這里介紹Displaytag推薦的第一種方式,即:
          實(shí)現(xiàn)org.displaytag.pagination.PaginatedListorg.displaytag.pagination.PaginatedList接口。

          實(shí)現(xiàn)PaginatedList接口:

          import ?java.util.List;

          import
          ?org.displaytag.pagination.PaginatedList;
          import
          ?org.displaytag.properties.SortOrderEnum;

          /**
          ?*?分頁(yè)列表
          ?*?
          ?*?
          @author ?John.Zhu
          ?*?
          ?
          */

          public ? class ?PageList? implements ?PaginatedList? {
          ????
          /**
          ?????*?每頁(yè)的列表
          ?????
          */

          ????
          private ?List?list;

          ????
          /**
          ?????*?當(dāng)前頁(yè)碼
          ?????
          */

          ????
          private ? int ?pageNumber? = ? 1 ;

          ????
          /**
          ?????*?每頁(yè)記錄數(shù)?page?size
          ?????
          */

          ????
          private ? int ?objectsPerPage? = ? 15 ;

          ????
          /**
          ?????*?總記錄數(shù)
          ?????
          */

          ????
          private ? int ?fullListSize? = ? 0 ;

          ????
          private
          ?String?sortCriterion;

          ????
          private
          ?SortOrderEnum?sortDirection;

          ????
          private
          ?String?searchId;

          ????
          public ?List?getList()?
          {
          ????????
          return
          ?list;
          ????}


          ????
          public ? void ?setList(List?list)? {
          ????????
          this .list? =
          ?list;
          ????}


          ????
          public ? int ?getPageNumber()? {
          ????????
          return
          ?pageNumber;
          ????}


          ????
          public ? void ?setPageNumber( int ?pageNumber)? {
          ????????
          this .pageNumber? =
          ?pageNumber;
          ????}


          ????
          public ? int ?getObjectsPerPage()? {
          ????????
          return
          ?objectsPerPage;
          ????}


          ????
          public ? void ?setObjectsPerPage( int ?objectsPerPage)? {
          ????????
          this .objectsPerPage? =
          ?objectsPerPage;
          ????}


          ????
          public ? int ?getFullListSize()? {
          ????????
          return
          ?fullListSize;
          ????}


          ????
          public ? void ?setFullListSize( int ?fullListSize)? {
          ????????
          this .fullListSize? =
          ?fullListSize;
          ????}


          ????
          public ?String?getSortCriterion()? {
          ????????
          return
          ?sortCriterion;
          ????}


          ????
          public ? void ?setSortCriterion(String?sortCriterion)? {
          ????????
          this .sortCriterion? =
          ?sortCriterion;
          ????}


          ????
          public ?SortOrderEnum?getSortDirection()? {
          ????????
          return
          ?sortDirection;
          ????}


          ????
          public ? void ?setSortDirection(SortOrderEnum?sortDirection)? {
          ????????
          this .sortDirection? =
          ?sortDirection;
          ????}


          ????
          public ?String?getSearchId()? {
          ????????
          return
          ?searchId;
          ????}


          ????
          public ? void ?setSearchId(String?searchId)? {
          ????????
          this .searchId? =
          ?searchId;
          ????}


          }

          Contoller:
          /**
          ?????*?分頁(yè)查詢
          ?????*?
          ?????*?
          @param ?request
          ?????*?
          @param
          ?response
          ?????*?
          @return

          ?????*?
          @throws ?Exception
          ?????
          */

          ????
          private ?ModelAndView?paging(HttpServletRequest?request,
          ????????????HttpServletResponse?response,?ModelAndView?mav)?
          throws ?Exception?
          {
          ????????
          // ?獲取當(dāng)前頁(yè)數(shù),displaytag通過(guò)參數(shù)"page"傳遞這個(gè)值

          ???????????????? int ?pageNumber;
          ????????
          if ?(request.getParameter( " page " )? != ? null

          ????????????????
          && ? ! "" .equals(request.getParameter( " page " )))? {
          ????????????pageNumber?
          = ?Integer.parseInt(request.getParameter( " page "
          ));
          ????????}
          ? else ? {
          ????????????pageNumber?
          = ? 1
          ;
          ????????}

          ????????PageList?pageList?
          = ? new ?PageList();
          ????????Map?map?
          = ?WebUtils.getParametersStartingWith(request,? " search_ "
          );
          ????????Page?page?
          =
          ?dao.query(map,?pageNumber,?PAGE_SIZE);
          ????????????????
          // ?設(shè)置當(dāng)前頁(yè)數(shù)

          ????????pageList.setPageNumber(pageNumber);
          ????????????????
          // ?設(shè)置當(dāng)前頁(yè)列表

          ????????pageList.setList(page.getResults());
          ????????????????
          // ?設(shè)置page?size

          ????????pageList.setObjectsPerPage(PAGE_SIZE);
          ????????????????
          // ?設(shè)置總頁(yè)數(shù)

          ????????pageList.setFullListSize(page.getTotalCount());

          ????????mav.addObject(
          " results "
          ,?pageList);

          ????????
          return
          ?mav;
          ????}

          好了,現(xiàn)在直接在JSP上使用 displaytag就行了:
          < display:table? name ="${results}" ?id ="row" ?class ="simple?nocol" ?pagesize ="${pageSize}" ?export ="true" ?
          ????????????????????decorator
          ="org.displaytag.decorator.TotalTableDecorator"
          ?
          ????????????????????requestURI
          ="${pageContext.request.contextPath}/pageQuery.do?method=paging" >

          ??????????????? ?
          < display:column? property ="date.time" ?title ="日期" ?format ="{0,date,yyyy-MM-dd}" ?sortable ="false" ? />
          ????????????????
          < display:column? property ="code" ?title ="編碼" ?group ="1" ?sortable ="false" ? />
          ????????????????
          < display:column? property ="name" ?title ="名稱" ?group ="1" ?sortable ="false" ? />
          ?????????????????
          < display:column? property ="costTotal" ?title ="總額(元)" ?format ="{0,number,0,000}" ?total ="true" ?sortable ="false" ? />

          </ display:table >

          posted on 2007-02-08 11:35 zJun's帛羅閣 閱讀(7469) 評(píng)論(20)  編輯  收藏 所屬分類: 開發(fā)環(huán)境

          評(píng)論

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子[未登錄] 2007-04-03 01:46 jerry

          requestURI ="${pageContext.request.contextPath}/pageQuery.do?method=paging"

          你有沒有碰到過(guò)當(dāng)點(diǎn)下一頁(yè)時(shí)會(huì)出現(xiàn)http://xxx/pageQuery.do?method=paging&method=paging  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2007-09-30 16:11 fenix

          樓主是個(gè)負(fù)責(zé)人的好人,頂頂  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2007-09-30 16:27 fenix

          有個(gè)問(wèn)題,樓主。你的PAGE對(duì)象是什么樣的哦  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2007-12-28 15:23 迷途羔羊

          可是點(diǎn)擊頁(yè)面排序的時(shí)候不排序了啊  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子[未登錄] 2008-02-29 18:38 佳佳

          樓主,你的ModelAndView 是什么樣的呢,能不能提供更完整的例子呢  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-02-29 20:22 zJun's帛羅閣

          @迷途羔羊
          排序是要自己寫代碼實(shí)現(xiàn)的,所以叫 external paging嘛。  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-02-29 20:31 zJun's帛羅閣

          @佳佳
          這個(gè)ModelAndView是Spring中的類,具體可以參考這里: http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/web/servlet/ModelAndView.html
          也可以換成是Struts的實(shí)現(xiàn),這只是用在page和controller之間傳遞參數(shù)用的,和用request是一樣的。  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-03-13 19:18 yushibo

          Page對(duì)象是什么,沒寫出來(lái)  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-03-13 19:32 zJun's帛羅閣

          @yushibo

          public class Page {

          static private int DEFAULT_PAGE_SIZE = 15;

          /**
          * 每頁(yè)的記錄數(shù)
          */
          private int pageSize = DEFAULT_PAGE_SIZE;

          /**
          * 當(dāng)前頁(yè)第一條數(shù)據(jù)在List中的位置,從0開始
          */
          private int start;

          /**
          * 當(dāng)前頁(yè)中存放的記錄
          */
          private List results;

          /**
          * 總記錄數(shù)
          */
          private int totalCount;

          /**
          * 構(gòu)造方法,只構(gòu)造空頁(yè)
          */
          public Page() {
          this(0, 0, DEFAULT_PAGE_SIZE, new ArrayList());
          }

          /**
          * 默認(rèn)構(gòu)造方法
          *
          * @param start
          * 本頁(yè)數(shù)據(jù)在數(shù)據(jù)庫(kù)中的起始位置
          * @param totalSize
          * 數(shù)據(jù)庫(kù)中總記錄條數(shù)
          * @param pageSize
          * 本頁(yè)容量
          * @param results
          * 本頁(yè)包含的數(shù)據(jù)
          */
          public Page(int start, int totalSize, int pageSize, List results) {
          this.pageSize = pageSize;
          this.start = start;
          this.totalCount = totalSize;
          this.results = results;
          }

          /**
          * 取數(shù)據(jù)庫(kù)中包含的總記錄數(shù)
          */
          public int getTotalCount() {
          return this.totalCount;
          }

          /**
          * 取總頁(yè)數(shù)
          */
          public int getTotalPageCount() {
          if (totalCount % pageSize == 0)
          return totalCount / pageSize;
          else
          return totalCount / pageSize + 1;
          }

          /**
          * 取每頁(yè)數(shù)據(jù)容量
          */
          public int getPageSize() {
          return pageSize;
          }

          /**
          * 當(dāng)前頁(yè)記錄
          */
          public List getResults() {
          return results;
          }

          /**
          * 取當(dāng)前頁(yè)碼,頁(yè)碼從1開始
          */
          public int getCurrentPageNo() {
          return start / pageSize + 1;
          }

          /**
          * 是否有下一頁(yè)
          */
          public boolean hasNextPage() {
          return this.getCurrentPageNo() < this.getTotalPageCount() - 1;
          }

          /**
          * 是否有上一頁(yè)
          */
          public boolean hasPreviousPage() {
          return this.getCurrentPageNo() > 1;
          }

          /**
          * 獲取任一頁(yè)第一條數(shù)據(jù)的位置,每頁(yè)條數(shù)使用默認(rèn)值
          */
          protected static int getStartOfPage(int pageNo) {
          return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
          }

          /**
          * 獲取任一頁(yè)第一條數(shù)據(jù)的位置,startIndex從0開始
          */
          public static int getStartOfPage(int pageNo, int pageSize) {
          return (pageNo - 1) * pageSize;
          }

          /**
          * 設(shè)置總記錄數(shù)
          */
          public void setTotalCount(int totalCount) {
          this.totalCount = totalCount;
          }

          /**
          * 設(shè)置記錄
          * @param results
          */
          public void setResults(List results) {
          this.results = results;
          }

          public void setPageSize(int pageSize) {
          this.pageSize = pageSize;
          }
          }
            回復(fù)  更多評(píng)論   

          # re: DAO的實(shí)現(xiàn)能否提供源代碼。 2008-04-26 14:19 xieamao

          代碼中dao,怎么沒有生成實(shí)例就直接引用方法。難道是靜態(tài)方法。但是貌似不是類,而是一個(gè)變量,因?yàn)樾憽?br>dao.query(*)能否提供,DAO的實(shí)現(xiàn)。  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-04-27 23:46 zJun's帛羅閣

          @xieamao
          dao.query()中是使用Hibernate實(shí)現(xiàn)分頁(yè)的查詢,在有很多現(xiàn)成的實(shí)現(xiàn)。  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-04-28 20:20 xieamao

          @zJun's帛羅閣
          @xieamao
          dao.query()中是使用Hibernate實(shí)現(xiàn)分頁(yè)的查詢,在有很多現(xiàn)成的實(shí)現(xiàn)。但函數(shù)中的參數(shù)MAP起什么作用,我覺得PageNumber,Page_Size就夠了。所以我想問(wèn)一下您的代碼實(shí)現(xiàn)。  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-04-29 10:45 xieamao

          ao.query()中是使用Hibernate實(shí)現(xiàn)分頁(yè)的查詢,但函數(shù)中的參數(shù)MAP起什么作用,我覺得PageNumber,Page_Size就夠了。所以我想問(wèn)一下您的代碼實(shí)現(xiàn)(能貼出來(lái)么,或者把關(guān)鍵代碼貼出來(lái))  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-04-29 11:20 xieamao

          dao.query()中的map,是不是設(shè)置Page對(duì)象屬性值 ,感覺這個(gè)Page對(duì)象不要也可以。  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-04-29 11:24 xieamao

          問(wèn)的問(wèn)題有點(diǎn)初級(jí),自己動(dòng)手實(shí)現(xiàn)一下。  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-04-30 14:24 xieamao

          Controller 中的PAGE_SIZE和dao變量是怎么來(lái)的,能否貼出代碼。  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-05-04 14:07 xieamao

          俺擴(kuò)展成功了!
          但是感覺每翻一次頁(yè)就查詢一次數(shù)據(jù)庫(kù),這樣大數(shù)據(jù)量顯示時(shí),雖然不會(huì)出現(xiàn)內(nèi)存占用過(guò)大的問(wèn)題,但是查詢過(guò)于頻繁。能不能這樣,一次查詢500,每頁(yè)顯示20條,這200條之后,點(diǎn)擊下一頁(yè)時(shí),再繼續(xù)查詢500條記錄(如果沒有500條就查剩余的)這樣可以有效緩解,數(shù)據(jù)庫(kù)負(fù)載。
          但我想來(lái)想去不知如何實(shí)現(xiàn)。按照此文所提供的方法。
            回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子 2008-05-04 14:14 xieamao

          應(yīng)該為這500條之后  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子[未登錄] 2008-05-15 01:50 lg

          有個(gè)問(wèn)題要請(qǐng)教下,
          在dt中,table本身是支持一個(gè)sort="page"或者"list"來(lái)表示排序是在整個(gè)list中還是在一個(gè)頁(yè)面中進(jìn)行的!

          現(xiàn)在的問(wèn)題是,自己實(shí)現(xiàn)列表的排序,dt會(huì)有一個(gè)自動(dòng)生成的sort="*待排序的列*",,所以在action(struts)中,怎樣得到sort="page"或者“l(fā)ist”這個(gè)sort呢?另外,我發(fā)現(xiàn)在 PaginatedList中沒有表示這個(gè)sort的變量呢?

          lz有辦法沒?

          --------------
          另外,
          一般按客戶的要求,都可以通過(guò)一定的條件過(guò)濾在列表中顯示的數(shù)據(jù)。而我發(fā)現(xiàn),dt好像沒有辦法實(shí)現(xiàn)這樣的功能!
          即,輸入一個(gè)過(guò)濾條件,列表中顯示的數(shù)據(jù)是被過(guò)濾的項(xiàng)?
          望lz指教!  回復(fù)  更多評(píng)論   

          # re: Displaytag1.1大數(shù)據(jù)量分頁(yè)的例子[未登錄] 2008-06-06 13:15 zz

          暈 效果出來(lái)了 ,可是下邊不知道 為什么多了一行 空行 ,郁悶啊!: (  回復(fù)  更多評(píng)論   

          導(dǎo)航

          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統(tǒng)計(jì)

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊(cè)

          收藏夾

          博客

          文檔

          站點(diǎn)

          論壇

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 石景山区| 昭觉县| 隆安县| 津南区| 鸡东县| 扎鲁特旗| 汽车| 都昌县| 洛川县| 泸州市| 九龙城区| 晋江市| 昌宁县| 平凉市| 松阳县| 遂昌县| 寿宁县| 肥西县| 海城市| 丰城市| 信宜市| 沙洋县| 平江县| 嘉鱼县| 原平市| 中卫市| 醴陵市| 万年县| 麻阳| 沾益县| 当涂县| 边坝县| 濮阳市| 浮山县| 阳春市| 元阳县| 台中市| 怀仁县| 巧家县| 汉源县| 商南县|