extremeComponents是一個十分不錯的WEB層顯示表格的好東東,其功能十分強大,而且對個性化支持也很好,自己可以做很多的擴展。相關的資料要查看官方網站(http://www.extremecomponents.org)。
extremeComponents提供了諸多的接口,其中有一個接口就是為了實現排序而出現的,接口如下:
1?public?interface?SortRowsCallback?{
2? public?Collection?sortRows(TableModel?model,?Collection?rows)?throws?Exception;
3?}?
2? public?Collection?sortRows(TableModel?model,?Collection?rows)?throws?Exception;
3?}?
同時,在標簽中需指明排序所用的接口,代碼如下:
1?<ec:table??var="pres"??action="/showNews.do"??sortRowsCallback="demo.MySortCallback"??/>
2?
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?????}
?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?
看看,是不是超級簡單?答案是肯定的(你或許會說,弄了半天就這么簡單呀)。?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??}
好了,大功告成。?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:別忘了在標簽中設置你自己定義的接口喲。