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

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

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

    隨筆-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 閱讀(3391) 評論(6)  編輯  收藏 所屬分類: Java

    評論:
    # re: extremeComponents排序實現不區分大小寫 2006-04-08 13:29 | xplucky
    寫的非常棒,extremeComponents提供了很多的接口用于定制,至于排序extremeComponents給出了一個基礎的參考實現,如果你需要定制自己的實現,你只要參考已有的視線,將其中的視線方法替換為你自己的就行了。這在extremeComponents的指南中已經提過。相關的中文文檔可以參考extremeComponents網站的wiki,或我的blog
    ---- http://m.tkk7.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)
    ...................  回復  更多評論
      
    主站蜘蛛池模板: 日本黄色免费观看| 暖暖日本免费在线视频| 久久亚洲高清综合| 手机永久免费的AV在线电影网| 在线a级毛片免费视频| 91丁香亚洲综合社区| 亚洲免费福利在线视频| 久久夜色精品国产噜噜亚洲a| 性生交片免费无码看人| 亚洲中文字幕无码av永久| 永久免费bbbbbb视频| 国产精品亚洲精品久久精品 | 亚洲av福利无码无一区二区 | 人妻18毛片a级毛片免费看| 亚洲AV无码一区二区三区在线观看| 美女黄色免费网站| 亚洲男人天堂2020| 国产又黄又爽又大的免费视频| 亚洲AV中文无码字幕色三| 精品一区二区三区无码免费视频| 99久久亚洲综合精品成人网| **毛片免费观看久久精品| 亚洲高清中文字幕免费| 免费一级毛片在线播放不收费| 一级片在线免费看| 亚洲网站在线观看| 成年美女黄网站18禁免费| 美女无遮挡免费视频网站| 亚洲一区AV无码少妇电影☆| 中文字幕在线观看免费视频| 日本亚洲色大成网站www久久| 男人的天堂亚洲一区二区三区| 含羞草国产亚洲精品岁国产精品| 久久久久亚洲av毛片大| 67pao强力打造国产免费| 亚洲精品又粗又大又爽A片| 亚洲人成网站在线观看青青| 7m凹凸精品分类大全免费| 亚洲av片在线观看| 久久亚洲国产精品| 午夜两性色视频免费网站|