幸せのちから

          平凡的世界
          看似平常實(shí)崎嶇
          成如容易卻艱辛

          Chapter 12. Limit

          Chapter 12. Limit

          12.1. Limit指南

          默認(rèn)的情況下eXtremeTable取得所有的結(jié)果集然后處理Beans集合,這樣的好處是 你可以隨意進(jìn)行排序、過濾和分頁操作。你只需要組裝Beans集合并讓eXtremeTable知道如何 引用它。這樣的操作對于小到中等數(shù)據(jù)量的結(jié)果集非常有效,當(dāng)結(jié)果集很大時這將非常糟糕。 這是一個判斷,但我更喜歡描述如何做出我的技術(shù)決定。如果您認(rèn)為在性能上有問題, 那么最好是使用一個profiler工具記錄并查看它。有許多開源和商業(yè)的profiler工具可以幫助 你做出最好的判斷。因此,假設(shè)我們發(fā)現(xiàn)了性能上存在問題,需要我們自己來處理分頁。

          手動處理分頁意味著你一次只想取得一頁顯示需要的結(jié)果集。同時,你需要自己處理排序、過濾和分頁。 下面的討論是基于我假設(shè)你從數(shù)據(jù)庫中取得集合,當(dāng)然同樣的原理能應(yīng)用到任何地方。

          這是一個重要的部分。為了得到較小的結(jié)果集,你可以創(chuàng)建一個普通的查詢語句,但是limit你得到的結(jié)果集。 在Sybase和SQLServer中你可以使用rowcount命令,在MySql中你可以使用limit命令。 我不知道其他數(shù)據(jù)庫怎么使用,但我確信每個數(shù)據(jù)庫都有相似的功能。 也就是說當(dāng)用戶瀏覽第一頁是得到第一頁需要的 結(jié)果集,當(dāng)用戶瀏覽下一頁時,再得到下一頁需要的結(jié)果集。

          使用Sybase的開發(fā)人員可能會說:rowcount命令總是從第一條開始,那么當(dāng)我到第二頁時我也必須 從第一條數(shù)據(jù)開始。 是的,你現(xiàn)在得到的是兩頁的結(jié)果集,而不需要得到所有的結(jié)果集。當(dāng)你到第三頁時,你只需要得到三頁的結(jié)果集。。。。。。 其他數(shù)據(jù)庫比如MySQL,允許你精確地得到你想要的那段數(shù)據(jù),這樣你就可以只得到當(dāng)前頁面顯示需要的結(jié)果集。

          為了知道用戶想如何排序和過濾,他們想瀏覽哪一頁,一頁需要顯示幾條結(jié)果,eXtremeTable有一個使用LimitFactory 創(chuàng)建的名為Limit的簡便接口:

          12.2. 創(chuàng)建Limit

          首先你需要通過LimitFactory得到一個Limit實(shí)例:

          Context context = new HttpServletRequestContext(request);
          LimitFactory limitFactory = new TableLimitFactory(context, tableId);
          Limit limit = new TableLimit(limitFactory);

          Limit對象定義了limit結(jié)果集的所有方法。

          TableLimitFactory具有另外一個構(gòu)造函數(shù),如果沒有指定tableId的話默認(rèn)的tableId將為ec。

          Context context = new HttpServletRequestContext(request);
          LimitFactory limitFactory = new TableLimitFactory(context);
          Limit limit = new TableLimit(limitFactory);

          12.3. Filter和Sort屬性

          當(dāng)你對Limit實(shí)例化時,實(shí)例化對象包含兩個對象:FilterSet和Sort。

          private FilterSet filterSet;
          private Sort sort;

          FilterSet包含一個過濾動作(Action)和一個過濾器對象數(shù)組。 動作為TableConstants.FILTER_ACTION或TableConstants.CLEAR_ACTION。 一個過濾器包含一個property和這個過濾器的值。

          private final String action;
          private final Filter[] filters;

          Sort對象包含property和sortOrder。sortOrder為 TableConstants.SORT_ASC或TableConstants.SORT_DESC:

          private Sort sort;

          12.4. 設(shè)置頁和行屬性

          設(shè)置行屬性:

          limit.setRowAttributes(totalRows, DEFAULT_ROWS_DISPLAYED);

          下面是設(shè)置行屬性可能用到的信息:

          private int rowStart;
          private int rowEnd;
          private int currentRowsDisplayed;
          private int page;
          private int totalRows;

          每個變量都有一個getter方法,我將不深入講解屬性的細(xì)節(jié)。

          12.5. Setup

          在你完成所有的定制工作:排序、過濾.....定制的Controller(Spring)或者Action(Struts)或者其他類似的框架后, 另外你需要創(chuàng)建一個callback,eXtremeTable已經(jīng)提供了一個名為LimitCallback的實(shí)現(xiàn)。為了使用你只需要設(shè)置表 屬性:retrieveRowsCallback、filterRowsCallback和sortRowsCallback:

          <ec:table
          items="presidents"
          retrieveRowsCallback="limit"
          filterRowsCallback="limit"
          sortRowsCallback="limit"
          action="${pageContext.request.contextPath}/limit.run"
          title="Presidents"
          >
          <ec:row>
          <ec:column property="fullName" title="Name"/>
          <ec:column property="nickName" />
          <ec:column property="term" />
          <ec:column property="born" cell="date"/>
          <ec:column property="died" cell="date"/>
          <ec:column property="career" />
          </ec:row>
          </ec:table>

          使用callback需要做的唯一事情是傳輸集合到request,同時傳輸totalRows屬性。 totalRows表示總行數(shù),使用PaginationCallback.TOTAL_ROWS靜態(tài)變量將易于維護(hù)。 如果JSP頁面使用了兩個(以上)eXtremeTable的話你可以利用tableId分別傳輸totalRows。 例如如果tableId名為pres,你可以如下處理:

          request.setAttribute("pres", presidents);
          request.setAttribute("pres_totalRows", new Integer(""+totalRows));

          譯者注:關(guān)于limit使用的更詳細(xì)信息,請參考《Limit指南》。

          posted on 2006-02-28 21:47 Lucky 閱讀(855) 評論(0)  編輯  收藏 所屬分類: extremeComponents

          <2006年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627281234
          567891011

          導(dǎo)航

          隨筆分類(125)

          文章分類(5)

          日本語

          搜索

          積分與排名

          最新隨筆

          最新評論

          主站蜘蛛池模板: 梅州市| 南宫市| 桂东县| 石狮市| 民丰县| 元谋县| 永顺县| 新民市| 剑阁县| 财经| 高台县| 梅河口市| 乐平市| 五华县| 汨罗市| 江陵县| 武平县| 修水县| 齐河县| 金湖县| 南城县| 灵寿县| 南投县| 绥江县| 逊克县| 石嘴山市| 香格里拉县| 宁河县| 开平市| 宁国市| 祁连县| 永新县| 门源| 双鸭山市| 南平市| 西藏| 准格尔旗| 浦东新区| 南雄市| 滦南县| 沙河市|