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

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

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

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

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

          經(jīng)過(guò)我的幾次追蹤,發(fā)現(xiàn)排序的最終實(shí)現(xiàn)交給了Arrays類的mergeSort方法,這個(gè)方法是一個(gè)靜態(tài)的方法,有兩個(gè)實(shí)現(xiàn),這里用到的是一個(gè)帶Comparator的實(shí)現(xiàn),具體代碼如下:
          ?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?????}

          仔細(xì)看看,不難發(fā)現(xiàn),問(wèn)題的關(guān)鍵就在于使用的Comparator?的compare方法。

          由此,找到了解決問(wèn)題的根本辦法,實(shí)現(xiàn)自己的Comparator?類,我的實(shí)現(xiàn)如下:

          ?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?
          看看,是不是超級(jí)簡(jiǎn)單?答案是肯定的(你或許會(huì)說(shuō),弄了半天就這么簡(jiǎn)單呀)。

          再來(lái)看看我對(duì)SortRowsCallback接口的實(shí)現(xiàn),代碼如下:
          ?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:別忘了在標(biāo)簽中設(shè)置你自己定義的接口喲。
          posted on 2006-04-07 21:34 Robin's Programming World 閱讀(3389) 評(píng)論(6)  編輯  收藏 所屬分類: Java

          評(píng)論:
          # re: extremeComponents排序?qū)崿F(xiàn)不區(qū)分大小寫(xiě) 2006-04-08 13:29 | xplucky
          寫(xiě)的非常棒,extremeComponents提供了很多的接口用于定制,至于排序extremeComponents給出了一個(gè)基礎(chǔ)的參考實(shí)現(xiàn),如果你需要定制自己的實(shí)現(xiàn),你只要參考已有的視線,將其中的視線方法替換為你自己的就行了。這在extremeComponents的指南中已經(jīng)提過(guò)。相關(guān)的中文文檔可以參考extremeComponents網(wǎng)站的wiki,或我的blog
          ---- http://www.aygfsteel.com/lucky  回復(fù)  更多評(píng)論
            
          # re: extremeComponents排序?qū)崿F(xiàn)不區(qū)分大小寫(xiě) 2006-04-08 15:30 | Robin's Java World
          @xplucky 過(guò)獎(jiǎng)了,真的有點(diǎn)不敢當(dāng),其實(shí)排序也存在著一定的問(wèn)題,好像只能對(duì)字符串進(jìn)行排序。其它類型的我不知道行不?按我的程序?qū)崿F(xiàn)好像是不行的,我也沒(méi)測(cè)試過(guò)。不過(guò)方法就是這樣,起個(gè)拋磚引玉的作用。
            回復(fù)  更多評(píng)論
            
          # re: extremeComponents排序?qū)崿F(xiàn)不區(qū)分大小寫(xiě) 2006-04-08 16:11 | xplucky
          extremeComponents只是提供了一個(gè)基礎(chǔ)的框架,或者定義了一個(gè)基礎(chǔ)的結(jié)構(gòu),并給出了一些必要的也是比較基礎(chǔ)的實(shí)現(xiàn)。它的強(qiáng)大之處就是給了使用者,很多機(jī)會(huì)來(lái)完成自己的定制工作,因?yàn)槊總€(gè)實(shí)際應(yīng)用要求的實(shí)現(xiàn)可能有區(qū)別。當(dāng)然,這時(shí)候有人可能會(huì)說(shuō),既然需要我自己去實(shí)現(xiàn),那我又為什么還要去使用它呢,還不如我自己從頭到尾完全按照自己的需要去做自己的不就行了?關(guān)于這個(gè)問(wèn)題,我的看法是更好的復(fù)用性(reuse)。因?yàn)閑xtremeComponents提供了最基礎(chǔ)的結(jié)構(gòu),給定了一些基準(zhǔn),如果大家都能夠參照這些基準(zhǔn)根據(jù)自己的需求去定制一些東西,比如說(shuō):cell、filter,然后大家都能share出來(lái),使整個(gè)的外圍能夠繁榮起來(lái)。那么對(duì)于大家來(lái)說(shuō),就有機(jī)會(huì)選擇自己需要的實(shí)現(xiàn),而不用再去完成一些別人已經(jīng)完成的工作,這跟eclipse的插件類似。
          以上只是我的一家之言。
            回復(fù)  更多評(píng)論
            
          # re: extremeComponents排序?qū)崿F(xiàn)不區(qū)分大小寫(xiě) 2006-04-10 20:39 | Robin's Java World
          @xplucky
          其實(shí)有時(shí)候很弄不懂一些人不喜歡這樣的方式,反正我很喜歡開(kāi)源的東東。  回復(fù)  更多評(píng)論
            
          # re: extremeComponents排序?qū)崿F(xiàn)不區(qū)分大小寫(xiě) 2006-04-11 09:25 | xplucky
          @Robin's Java World
          每個(gè)人都有自己的想法,這樣才能百家爭(zhēng)鳴,像在軟件開(kāi)發(fā)方法上就有: 模型驅(qū)動(dòng)、測(cè)試驅(qū)動(dòng)...... 每種都有它的支持者,志同道合堅(jiān)持自己的理想吧。  回復(fù)  更多評(píng)論
            
          # re: extremeComponents排序?qū)崿F(xiàn)不區(qū)分大小寫(xiě) 2008-06-27 13:31 | coolshuiping
          這個(gè)對(duì)嵌套屬性不起作用啊,報(bào)錯(cuò)
          源碼:
          <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="導(dǎo)出 Excel"/>
          <ec:row>
          <ec:column property="id" width="5%" cell="rowCount" title="序號(hào)"/>
          <ec:column property="district.name" width="5%" title="地區(qū)" alias="district" ></ec:column>
          <ec:column property="number" width="12%" title="訂單號(hào)" ><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="時(shí)間" ></ec:column>
          </ec:row>
          </ec:table>


          錯(cuò)誤信息:
          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)
          ...................  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 平利县| 舟山市| 西和县| 永登县| 西昌市| 大英县| 鹿泉市| 内黄县| 宣武区| 灌南县| 南澳县| 珠海市| 绵阳市| 彭山县| 眉山市| 英山县| 贺州市| 惠东县| 长沙县| 林周县| 海原县| 和平县| 开远市| 东平县| 阜平县| 呈贡县| 庐江县| 巴青县| 张家港市| 高碑店市| 堆龙德庆县| 沐川县| 卢龙县| 惠来县| 军事| 建平县| 常德市| 大新县| 华池县| 崇礼县| 岢岚县|