隨筆-193  評論-715  文章-1  trackbacks-0
          作者:張明星 時間:2006.04.07. MSN:fastzch@hotmail.com

          extremeComponents是一個十分不錯的WEB層顯示表格的好東東,其功能十分強大,而且對個性化支持也很好,自己可以做很多的擴展。相關的資料要查看官方網站(http://www.extremecomponents.org)。

          extremeComponents提供了諸多的接口,其中有一個接口就是為了實現排序而出現的,接口如下:
          1?public?interface?SortRowsCallback?{
          2? public?Collection?sortRows(TableModel?model,?Collection?rows)?throws?Exception;
          3?}?

          同時,在標簽中需指明排序所用的接口,代碼如下:
          1?<ec:table??var="pres"??action="/showNews.do"??sortRowsCallback="demo.MySortCallback"??/>
          2?

          經過我的一番研究,在排序時,extremeComponents使用的是org.apache.commons.beanutils.BeanComparator這個類作為實現的比較器,同時也使用了ReverseComparator,NullComparator等類,官方的實現可以參見org.extremecomponents.table.callback.ProcessRowsCallback文件(這個文件實現了三個接口,分別是RetrieveRowsCallback, FilterRowsCallback, SortRowsCallback,我們在這里只用實現SortRowsCallback就夠了)。問題的關鍵就在于NullComparator這個類,如果你對JAVA基礎很熟悉的話,你就會知道JAVA的排序時都會有一個Comparator,在這里就不多講了,有興趣的讀者可以去看JDK的源碼。

          經過我的幾次追蹤,發現排序的最終實現交給了Arrays類的mergeSort方法,這個方法是一個靜態的方法,有兩個實現,這里用到的是一個帶Comparator的實現,具體代碼如下:
          ?1?private?static?void?mergeSort(Object?src[],?Object?dest[],
          ?2???????????????????????????????????int?low,?int?high,?int?off,?Comparator?c)?{
          ?3?????int?length?=?high?-?low;
          ?4?
          ?5?????//?Insertion?sort?on?smallest?arrays
          ?6?????if?(length?<?INSERTIONSORT_THRESHOLD)?{
          ?7?????????for?(int?i=low;?i<high;?i++)
          ?8?????????for?(int?j=i;?j>low?&&?c.compare(dest[j-1],?dest[j])>0;?j--)
          ?9?????????????swap(dest,?j,?j-1);
          10?????????return;
          11?????}
          12?
          13?????????//?Recursively?sort?halves?of?dest?into?src
          14?????????int?destLow??=?low;
          15?????????int?destHigh?=?high;
          16?????????low??+=?off;
          17?????????high?+=?off;
          18?????????int?mid?=?(low?+?high)?>>?1;
          19?????????mergeSort(dest,?src,?low,?mid,?-off,?c);
          20?????????mergeSort(dest,?src,?mid,?high,?-off,?c);
          21?
          22?????????//?If?list?is?already?sorted,?just?copy?from?src?to?dest.??This?is?an
          23?????????//?optimization?that?results?in?faster?sorts?for?nearly?ordered?lists.
          24?????????if?(c.compare(src[mid-1],?src[mid])?<=?0)?{
          25????????????System.arraycopy(src,?low,?dest,?destLow,?length);
          26????????????return;
          27?????????}
          28?
          29?????????//?Merge?sorted?halves?(now?in?src)?into?dest
          30?????????for(int?i?=?destLow,?p?=?low,?q?=?mid;?i?<?destHigh;?i++)?{
          31?????????????if?(q?>=?high?||?p?<?mid?&&?c.compare(src[p],?src[q])?<=?0)
          32?????????????????dest[i]?=?src[p++];
          33?????????????else
          34?????????????????dest[i]?=?src[q++];
          35?????????}
          36?????}

          仔細看看,不難發現,問題的關鍵就在于使用的Comparator?的compare方法。

          由此,找到了解決問題的根本辦法,實現自己的Comparator?類,我的實現如下:

          ?1?package?demo;
          ?2?
          ?3?import?org.apache.commons.collections.comparators.NullComparator;
          ?4?public?class?MyComparator?extends?NullComparator{
          ?5?
          ?6?????public?int?compare(Object?object,?Object?object1)?{
          ?7?????????String?s1=(String)object;
          ?8?????????String?s2=(String)object1;
          ?9?????????
          10?????????return?s1.compareToIgnoreCase(s2);
          11?????}
          12?}
          13?
          看看,是不是超級簡單?答案是肯定的(你或許會說,弄了半天就這么簡單呀)。

          再來看看我對SortRowsCallback接口的實現,代碼如下:
          ?1?package?demo;
          ?2?
          ?3?import?java.util.*;
          ?4?
          ?5?import?org.apache.commons.beanutils.BeanComparator;
          ?6?import?org.apache.commons.collections.comparators.ReverseComparator;
          ?7?import?org.extremecomponents.table.bean.Column;
          ?8?import?org.extremecomponents.table.core.TableConstants;
          ?9?import?org.extremecomponents.table.core.TableModel;
          10?import?org.extremecomponents.table.callback.SortRowsCallback;
          11?import?org.extremecomponents.table.limit.Sort;
          12?
          13?public?final?class?MySortCallback?implements?SortRowsCallback?{
          14?
          15?????public?Collection?sortRows(TableModel?model,?Collection?rows)
          16?????????????throws?Exception?{
          17?????????boolean?sorted?=?model.getLimit().isSorted();
          18?
          19?????????if?(!sorted)?{
          20?????????????return?rows;
          21?????????}
          22?
          23?????????Sort?sort?=?model.getLimit().getSort();
          24?????????String?sortProperty?=?sort.getProperty();
          25?????????String?sortOrder?=?sort.getSortOrder();
          26?????????Column?column?=?model.getColumnHandler().getColumnByAlias(sortProperty);
          27?????????String?property?=?column.getProperty();
          28?
          29?????????if?(sortOrder.equals(TableConstants.SORT_ASC))?{
          30?????????????BeanComparator?comparator?=?new?BeanComparator(property,
          31?????????????????????new?MyComparator());
          32?????????????Collections.sort((List)?rows,?comparator);
          33?????????}?else?if?(sortOrder.equals(TableConstants.SORT_DESC))?{
          34?????????????BeanComparator?reversedNaturalOrderBeanComparator?=?new?BeanComparator(
          35?????????????????????property,?new?ReverseComparator(new?MyComparator()));
          36?????????????Collections.sort((List)?rows,?reversedNaturalOrderBeanComparator);
          37?????????}
          38?
          39?????????return?rows;
          40?????}
          41?
          42??}
          好了,大功告成。

          PS:別忘了在標簽中設置你自己定義的接口喲。
          posted on 2006-04-07 21:34 Robin's Programming World 閱讀(3389) 評論(6)  編輯  收藏 所屬分類: Java

          評論:
          # re: extremeComponents排序實現不區分大小寫 2006-04-08 13:29 | xplucky
          寫的非常棒,extremeComponents提供了很多的接口用于定制,至于排序extremeComponents給出了一個基礎的參考實現,如果你需要定制自己的實現,你只要參考已有的視線,將其中的視線方法替換為你自己的就行了。這在extremeComponents的指南中已經提過。相關的中文文檔可以參考extremeComponents網站的wiki,或我的blog
          ---- http://www.aygfsteel.com/lucky  回復  更多評論
            
          # re: extremeComponents排序實現不區分大小寫 2006-04-08 15:30 | Robin's Java World
          @xplucky 過獎了,真的有點不敢當,其實排序也存在著一定的問題,好像只能對字符串進行排序。其它類型的我不知道行不?按我的程序實現好像是不行的,我也沒測試過。不過方法就是這樣,起個拋磚引玉的作用。
            回復  更多評論
            
          # re: extremeComponents排序實現不區分大小寫 2006-04-08 16:11 | xplucky
          extremeComponents只是提供了一個基礎的框架,或者定義了一個基礎的結構,并給出了一些必要的也是比較基礎的實現。它的強大之處就是給了使用者,很多機會來完成自己的定制工作,因為每個實際應用要求的實現可能有區別。當然,這時候有人可能會說,既然需要我自己去實現,那我又為什么還要去使用它呢,還不如我自己從頭到尾完全按照自己的需要去做自己的不就行了?關于這個問題,我的看法是更好的復用性(reuse)。因為extremeComponents提供了最基礎的結構,給定了一些基準,如果大家都能夠參照這些基準根據自己的需求去定制一些東西,比如說:cell、filter,然后大家都能share出來,使整個的外圍能夠繁榮起來。那么對于大家來說,就有機會選擇自己需要的實現,而不用再去完成一些別人已經完成的工作,這跟eclipse的插件類似。
          以上只是我的一家之言。
            回復  更多評論
            
          # re: extremeComponents排序實現不區分大小寫 2006-04-10 20:39 | Robin's Java World
          @xplucky
          其實有時候很弄不懂一些人不喜歡這樣的方式,反正我很喜歡開源的東東。  回復  更多評論
            
          # re: extremeComponents排序實現不區分大小寫 2006-04-11 09:25 | xplucky
          @Robin's Java World
          每個人都有自己的想法,這樣才能百家爭鳴,像在軟件開發方法上就有: 模型驅動、測試驅動...... 每種都有它的支持者,志同道合堅持自己的理想吧。  回復  更多評論
            
          # re: extremeComponents排序實現不區分大小寫 2008-06-27 13:31 | coolshuiping
          這個對嵌套屬性不起作用啊,報錯
          源碼:
          <ec:table items="orderList" var="order" action="${pageContext.request.contextPath}/history/test"autoIncludeParameters="${(empty param.autoInc)?(true):(false)}" sortRowsCallback="com.zealyoung.gsm.web.viewdoc.MySortCallback">
          <ec:exportXls fileName="orderList.xls" tooltip="導出 Excel"/>
          <ec:row>
          <ec:column property="id" width="5%" cell="rowCount" title="序號"/>
          <ec:column property="district.name" width="5%" title="地區" alias="district" ></ec:column>
          <ec:column property="number" width="12%" title="訂單號" ><a href="#" onclick="window.parent.location='/order/showOrder/${order.id }'">${order.number }</a></ec:column>
          <ec:column property="store.name" width="15%" alias="store" title="店鋪名稱" ><a href="#" onclick="winOpen('/store/particular/${order.store.id }','excelpreview_store_${order.store.id }')" >${order.store.name }</a> </ec:column>
          <ec:column property="store.address" alias="store" title="店鋪地址" />
          <ec:column property="date.time" width="18%" alias="date" cell="date" title="時間" ></ec:column>
          </ec:row>
          </ec:table>


          錯誤信息:
          javax.servlet.jsp.JspException: TableTag Problem: javax.servlet.jsp.JspException:
          TableTag.doAfterBody() Problem: java.lang.NullPointerException
          at com.zealyoung.gsm.web.viewdoc.MySortCallback.sortRows(MySortCallback.java:29)
          at org.extremecomponents.table.core.TableModelUtils.sortRows(TableModelUtils.java:66)
          at org.extremecomponents.table.core.TableModelImpl.execute(TableModelImpl.java:233)
          at org.extremecomponents.table.tag.TableTag.doAfterBody(TableTag.java:459)
          at _jsp._web_22dinf._views._common._excelpreview__jsp._jspService(_excelpreview__jsp.java:197)
          at com.caucho.jsp.JavaPage.service(JavaPage.java:61)
          at com.caucho.jsp.Page.pageservice(Page.java:578)
          ...................  回復  更多評論
            
          主站蜘蛛池模板: 和龙市| 中方县| 东港市| 潮州市| 仲巴县| 临沭县| 玉屏| 留坝县| 泸州市| 临夏县| 勃利县| 灵台县| 镇平县| 神木县| 青神县| 靖安县| 梧州市| 习水县| 新津县| 合山市| 北碚区| 宁津县| 芷江| 白河县| 德阳市| 建平县| 卫辉市| 镶黄旗| 林芝县| 股票| 惠水县| 南和县| 耒阳市| 平陆县| 凤山县| 汨罗市| 蓝田县| 贵州省| 望谟县| 确山县| 峨眉山市|