FilterRowsCallback被用來過濾傳給eXtremeTable的Beans的Collection。
FilterRowsCallback的默認實現(xiàn)是得到Beans或Maps的Collection,然后通過實現(xiàn)jakarta
Predicate接口來進行過濾。當然,如果你需要進行一些定制你可以插接自己的實現(xiàn)。
本示例示范了如何調整代碼為過濾器提供一個精確的比較功能。當前的實現(xiàn)是通過使用StringUtils.contains()方法進行模糊比較。
本示例將使用StringUtils.equals()方法。你可以按照你的需要來調整代碼進行更多定制。
1.1. 定制FilterRowsCallback示例
首先你需要做的是創(chuàng)建一個實現(xiàn)Predicate接口的定制類。Predicate要求我們實現(xiàn)evaluate()方法來判斷是否包含
當前bean。因為你僅僅調整現(xiàn)在已有的功能,首先得到filterPredicate的源代碼(在發(fā)行包的callback包下),
拷貝到你的工程里。然后向下面展示的一樣將
StringUtils.contains()方法修改為StringUtils.equals()方法:
public final class ExactMatchFilterPredicate implements Predicate {
private boolean isSearchMatch(String value, String search) {
...
else if (StringUtils.equals(value, search)) {
return true;
}
...
}
}
然后我們需要實現(xiàn)和Predicate共同作用的FilterRowsCallback接口。再一次從發(fā)行包的callback包下拷貝ProcessRowsCallback源代碼到你的工程里。
請參照我們創(chuàng)建的定制的ExactMatchFilterPredicate
類來確認僅僅實現(xiàn)了FilterRowsCallback和修改Predicate。
public class ExactMatchFilterRows implements FilterRowsCallback {
public Collection filterRows(TableModel model, Collection rows) throws Exception {
...
if (filtered) {
Collection collection = new ArrayList();
Predicate filterPredicate = new ExactMatchFilterPredicate(model);
CollectionUtils.select(rows, filterPredicate, collection);
return collection;
}
...
}
}
為了使用這個FilterRowsCallback你應該在Preferences中聲明一個別名。當然,你可以省略這步而在JSP中提供這個FilterRowsCallback實現(xiàn)類的全路徑,但是使用Preferences更簡潔。
table.filterRowsCallback.exactMatch=org.extremesite.callback.ExactMatchFilterRows
在TableTag通過設置filterRowsCallback屬性來使用ExactMatchFilterRows。
<ec:table filterRowsCallback="exactMatch"/>
如果不清楚Preferences和ColumnTag定義語法請參考Preferences指南。