Dev@Free

          zJun's Tech Weblog

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

          Displaytag1.1支持在外部實現(xiàn)大數(shù)據(jù)量分頁。主要有兩種方式實現(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...)

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

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

          實現(xiàn)PaginatedList接口:

          import ?java.util.List;

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

          /**
          ?*?分頁列表
          ?*?
          ?*?
          @author ?John.Zhu
          ?*?
          ?
          */

          public ? class ?PageList? implements ?PaginatedList? {
          ????
          /**
          ?????*?每頁的列表
          ?????
          */

          ????
          private ?List?list;

          ????
          /**
          ?????*?當前頁碼
          ?????
          */

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

          ????
          /**
          ?????*?每頁記錄數(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:
          /**
          ?????*?分頁查詢
          ?????*?
          ?????*?
          @param ?request
          ?????*?
          @param
          ?response
          ?????*?
          @return

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

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

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

          ????????pageList.setPageNumber(pageNumber);
          ????????????????
          // ?設置當前頁列表

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

          ????????pageList.setObjectsPerPage(PAGE_SIZE);
          ????????????????
          // ?設置總頁數(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帛羅閣 閱讀(7464) 評論(20)  編輯  收藏 所屬分類: 開發(fā)環(huán)境

          評論

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

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

          你有沒有碰到過當點下一頁時會出現(xiàn)http://xxx/pageQuery.do?method=paging&method=paging  回復  更多評論   

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

          樓主是個負責人的好人,頂頂  回復  更多評論   

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

          有個問題,樓主。你的PAGE對象是什么樣的哦  回復  更多評論   

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

          可是點擊頁面排序的時候不排序了啊  回復  更多評論   

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

          樓主,你的ModelAndView 是什么樣的呢,能不能提供更完整的例子呢  回復  更多評論   

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

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

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

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

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

          Page對象是什么,沒寫出來  回復  更多評論   

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

          @yushibo

          public class Page {

          static private int DEFAULT_PAGE_SIZE = 15;

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

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

          /**
          * 當前頁中存放的記錄
          */
          private List results;

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

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

          /**
          * 默認構造方法
          *
          * @param start
          * 本頁數(shù)據(jù)在數(shù)據(jù)庫中的起始位置
          * @param totalSize
          * 數(shù)據(jù)庫中總記錄條數(shù)
          * @param pageSize
          * 本頁容量
          * @param results
          * 本頁包含的數(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ù)庫中包含的總記錄數(shù)
          */
          public int getTotalCount() {
          return this.totalCount;
          }

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

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

          /**
          * 當前頁記錄
          */
          public List getResults() {
          return results;
          }

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

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

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

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

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

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

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

          public void setPageSize(int pageSize) {
          this.pageSize = pageSize;
          }
          }
            回復  更多評論   

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

          代碼中dao,怎么沒有生成實例就直接引用方法。難道是靜態(tài)方法。但是貌似不是類,而是一個變量,因為小寫。
          dao.query(*)能否提供,DAO的實現(xiàn)。  回復  更多評論   

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

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

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

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

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

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

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

          dao.query()中的map,是不是設置Page對象屬性值 ,感覺這個Page對象不要也可以。  回復  更多評論   

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

          問的問題有點初級,自己動手實現(xiàn)一下。  回復  更多評論   

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

          Controller 中的PAGE_SIZE和dao變量是怎么來的,能否貼出代碼。  回復  更多評論   

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

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

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

          應該為這500條之后  回復  更多評論   

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

          有個問題要請教下,
          在dt中,table本身是支持一個sort="page"或者"list"來表示排序是在整個list中還是在一個頁面中進行的!

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

          lz有辦法沒?

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

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

          暈 效果出來了 ,可是下邊不知道 為什么多了一行 空行 ,郁悶啊!: (  回復  更多評論   

          導航

          <2008年2月>
          272829303112
          3456789
          10111213141516
          17181920212223
          2425262728291
          2345678

          統(tǒng)計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 玉林市| 黔西县| 周宁县| 临高县| 义乌市| 隆林| 定南县| 盐源县| 鄂温| 磴口县| 东山县| 新干县| 光泽县| 右玉县| 喀喇沁旗| 屏南县| 鄂托克旗| 额尔古纳市| 迭部县| 文山县| 武宣县| 随州市| 通河县| 临夏县| 正安县| 铁力市| 江津市| 高阳县| 盐亭县| 临漳县| 东莞市| 怀来县| 山东省| 金堂县| 玉门市| 武强县| 抚顺县| 化德县| 德惠市| 阿拉善盟| 天长市|