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

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

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

    Dev@Free

    zJun's Tech Weblog

    Displaytag1.1大數據量分頁的例子

    Displaytag1.1支持在外部實現大數據量分頁。主要有兩種方式實現:

    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"即可,但是在使用發現這種方式由于是在原來內存分頁的基礎上修改的,所以還是存在一些Bug(比如:分頁導航的值不會變......)

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

    實現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 ;

    ????
    /**
    ?????*?每頁記錄數?page?size
    ?????
    */

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

    ????
    /**
    ?????*?總記錄數
    ?????
    */

    ????
    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?
    {
    ????????
    // ?獲取當前頁數,displaytag通過參數"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);
    ????????????????
    // ?設置當前頁數

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

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

    ????????pageList.setObjectsPerPage(PAGE_SIZE);
    ????????????????
    // ?設置總頁數

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

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

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

    好了,現在直接在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帛羅閣 閱讀(7445) 評論(20)  編輯  收藏 所屬分類: 開發環境

    評論

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

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

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

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

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

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

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

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

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

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

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

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

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

    # re: Displaytag1.1大數據量分頁的例子 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的實現,這只是用在page和controller之間傳遞參數用的,和用request是一樣的。  回復  更多評論   

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

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

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

    @yushibo

    public class Page {

    static private int DEFAULT_PAGE_SIZE = 15;

    /**
    * 每頁的記錄數
    */
    private int pageSize = DEFAULT_PAGE_SIZE;

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

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

    /**
    * 總記錄數
    */
    private int totalCount;

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

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

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

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

    /**
    * 取每頁數據容量
    */
    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;
    }

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

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

    /**
    * 設置總記錄數
    */
    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的實現能否提供源代碼。 2008-04-26 14:19 xieamao

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    lz有辦法沒?

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

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

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

    導航

    <2007年2月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728123
    45678910

    統計

    常用鏈接

    留言簿(15)

    隨筆分類

    隨筆檔案

    相冊

    收藏夾

    博客

    文檔

    站點

    論壇

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一级毛片在线免费视频| 亚洲欧美国产欧美色欲| 国产jizzjizz免费看jizz| 成人免费无码大片a毛片| 一本岛高清v不卡免费一三区| 久久久久久国产a免费观看黄色大片| 国产精品美女久久久免费| 美女一级毛片免费观看| 国产精品免费大片一区二区| 久久免费观看国产精品| 永久免费看bbb| 国产亚洲精aa成人网站| 亚洲福利视频网址| 黄网站在线播放视频免费观看| 免费高清国产视频| 永久免费AV无码网站在线观看 | 国产亚洲欧美在线观看| 最新亚洲人成无码网www电影| 国产精品久久亚洲不卡动漫| 最近免费中文字幕高清大全 | 亚洲午夜成激人情在线影院| 亚洲精品中文字幕麻豆| 亚洲av产在线精品亚洲第一站| 亚洲精品123区在线观看| 亚洲高清乱码午夜电影网| 亚洲精品无码永久在线观看你懂的 | 麻豆一区二区免费播放网站| 成人免费一区二区三区在线观看| 国产成在线观看免费视频| 免费一级e一片在线播放| 亚洲视频在线观看| 亚洲精品无播放器在线播放 | 日韩免费高清一级毛片在线| 在线亚洲精品自拍| 亚洲日本视频在线观看| 日日躁狠狠躁狠狠爱免费视频| 国产精品免费大片| 亚洲欧洲久久av| 亚洲日韩国产一区二区三区在线| 国产在线观看免费视频软件 | 亚洲暴爽av人人爽日日碰|