<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帛羅閣 閱讀(7461) 評論(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)

    隨筆分類

    隨筆檔案

    相冊

    收藏夾

    博客

    文檔

    站點

    論壇

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 巨胸狂喷奶水视频www网站免费| 亚洲欧洲日产v特级毛片| 精品亚洲福利一区二区| 亚洲成在人线aⅴ免费毛片| 4444亚洲国产成人精品| 久久国产精品成人片免费| 久久久久久亚洲Av无码精品专口| 免费人成网站在线观看不卡| 亚洲AV无码国产精品色午友在线| a级日本高清免费看| 香蕉视频在线观看亚洲| 99久久国产免费中文无字幕| 亚洲视频在线免费看| 免费精品国产自产拍在线观看图片| 亚洲字幕在线观看| 香蕉视频在线观看免费国产婷婷| 亚洲精品久久无码| 亚洲日韩中文字幕日韩在线| 中文字幕免费在线看电影大全 | 好猛好深好爽好硬免费视频| 怡红院亚洲怡红院首页| 精品亚洲永久免费精品| 亚洲高清美女一区二区三区| 18禁免费无码无遮挡不卡网站| 亚洲性色AV日韩在线观看| 免费一看一级毛片全播放| 插鸡网站在线播放免费观看| 亚洲视频一区调教| 在线成人a毛片免费播放| 成人在线免费视频| 久久亚洲AV成人无码电影| 性感美女视频在线观看免费精品| 黄色免费在线观看网址| 亚洲AV永久无码精品水牛影视| 男女做羞羞的事视频免费观看无遮挡| 久久亚洲精品无码av| 亚洲综合伊人久久综合| 97视频热人人精品免费| h视频在线免费观看| 亚洲精品午夜视频| 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 |