版本1.0.0
本文档允许在遵守以下两条原则的条件下被使用和传SEO靠我播: 1)不能凭借本文档索取任何费用 2)以任何方式(印刷物或电子版)使用和传播时本文档时,必须包含本版权申明(更新中...)
Table of Contents
定制FilterCell 1. 引言 1SEO靠我.1. 定制Droplist过滤器Cell示例 定制FilterRowsCallback 1. 引言 1.1. 定制FilterRowsCallback示例 Form指南 1. 引言 1.1. JSPSEO靠我 1.1.1. Form特性的技术说明 1.1.2. Checkbox 1.1.3. Custom Cell 1.1.4. JavaScript 1.2. Cell 1.3. Controller 1SEO靠我.3.1. 表标签动作Controller 1.3.2. Form动作Controller 1.3.3. 重新得到Checkbox的值 Html视图定制指南 1. 引言 1.1. View接口 1.2SEO靠我. Messages示例 拦截器使用指南 1. 引言 1.1. 拦截器列表 1.2. 行拦截器示例 Limit指南 1. 引言 1.1. JSP 1.2. Controller 1.3. ServicSEO靠我e 1.3.1. 取得总行数 1.3.2. 取得Collection 1.4. DAO 1.4.1. 定义Query字符串 1.4.2. Filter 和 Sort Query 字符串 1.4.3. SEO靠我Limit Query String 1.4.4. 取回总行数和Collection. 1.4.5. 默认的Sort顺序 Preferences 指南 1. 引言 1.1. Preferences表 SEO靠我1.2. 指定Preference别名列的filterCell属性控制过滤器如何显示,它和cell属性非常相像并且也是实现Cell接口。马上要定义的是默认的和dropSEO靠我list这两个过滤器cells。 默认的是一个输入框元素而droplist是一个下拉列表元素。当然,如果你需要进行一些定制你可以插接自己的实现。
最近,我被问到是否能够实现一个过滤器cell,显示已经通SEO靠我过别的过滤器过滤得到数据子集。答案当然是肯定的,而且这是我将在这里示范的。通常定制的 cell可以很容易被创建,这个示例将印证这点。在这个示例里last name列里显示的将是通过first nameSEO靠我过滤后的子集。如果没有通过 first name过滤那么所有值都将被显示。
通常你只需要为过滤器cell实现Cell接口。然而,因为我们要创建的过滤器ceSEO靠我ll是一个下拉列表,我们可以通过扩展 FilterDroplistCell来获得它已经提供的很多功能,FilterDroplistCell是发行包已经提供的cells之一。
我们需要覆盖FilterDrSEO靠我oplistCell的唯一方法是getFilterDropList()。这是整个类的全部代码:
public class FilteredDroplistCell extends FilterDroplSEO靠我istCell {
private static Log logger = LogFactory.getLog(FilterDroplistCell.class);
protected List getFSEO靠我ilterDropList(TableModel model, Column column) {
List droplist = new ArrayList();
String firstNameFiltSEO靠我er = model.getLimit().getFilterSet().getValue("firstName");
Collection beans = model.getCollectionOfBSEO靠我eans();
for (Iterator iter = beans.iterator(); iter.hasNext();) {
Object bean = iter.next();
try {
StrinSEO靠我g firstName = BeanUtils.getProperty(bean, "firstName");
if (StringUtils.isNotBlank(firstNameFilter) &SEO靠我& !firstName.equals(firstNameFilter)) {
continue;
}
String lastName = BeanUtils.getProperty(bean, columSEO靠我n.getProperty());
if ((lastName != null) && !droplist.contains(lastName)) {
droplist.add(lastName);
}
} SEO靠我catch (Exception e) {
logger.debug("Problems getting the droplist.", e);
}
}
Collections.sort(droplist);SEO靠我
return droplist;
}
}
如果你比较这个类和父类,你会发现它们只有微小的区别。
首先需要注意的是我们需要找出first name是否已经被过滤了。
String firstNameFilter SEO靠我= model.getLimit().getFilterSet().getValue("firstName");然后我们需要判断当前bean的first name值是否和first name过滤器值相SEO靠我同。如果相同,将当前的last name值 添加到droplist中。
String firstName = BeanUtils.getProperty(bean, "firstName");
if (SSEO靠我tringUtils.isNotBlank(firstNameFilter) && !firstName.equals(firstNameFilter)) {
continue;
}
如果last nameSEO靠我将添加到droplist中,我们需要检查droplist中是否已经包含了这个值。如果没有,我们就把它添加到droplist中。
String lastName = BeanUtils.getProperSEO靠我ty(bean, column.getProperty());
if ((lastName != null) && !droplist.contains(lastName)) {
droplist.addSEO靠我(lastName);
}为了使用这个Cell你应该在Preferences中声明一个别名。 当然,你可以省略这步而在JSP中提供这个Cell实现类的全路径,但是使用Preferences更简洁。
colSEO靠我umn.filterCell.filteredDroplist=org.extremesite.cell.FilteredDroplistCell在ColumnTag通过设置filterCell属性来SEO靠我使用FilteredDroplistCell。
<ec:column property="lastName" filterCell="filteredDroplist"/>如果不清楚PreferenceSEO靠我s和ColumnTag定义语法请参考Preferences指南。
FilterRowsCallback被用来过滤传给eXtremeTable的BeansSEO靠我的Collection。 FilterRowsCallback的默认实现是得到Beans或Maps的Collection,然后通过实现jakarta Predicate接口来进行过滤。当然,如果你需要SEO靠我进行一些定制你可以插接自己的实现。
首先声明,本示例代码包含一些从原包中剪切、粘贴的代码(虽然不是很多)。在 最初的最终发行包之后,值过滤得到进一步改善使得更具复用性并更容易实现,可能和定制cell代码SEO靠我行数相同。 当然,我被要求并非常乐意示范如何在当前代码基础上实现定制过滤。这有非常清晰的hooks实现,并且很容易实现。
本示例示范了如何调整代码为过滤器提供一个精确的比较功能。当前的实现是通过使用StSEO靠我ringUtils.contains()方法进行模糊比较。 本示例将使用StringUtils.equals()方法。你可以按照你的需要来调整代码进行更多定制。
首先你需要做的是创建一个实现Predicate接口的定制类。Predicate要求我们实现evaluate()方法来判断是否包含 当前bean。因为你仅仅调整现在已有的功能,首先得到fiSEO靠我lterPredicate的源代码(在发行包的callback包下), 拷贝到你的工程里。然后向下面展示的一样将 StringUtils.contains()方法修改为StringUtils.equaSEO靠我ls()方法:
public final class ExactMatchFilterPredicate implements Predicate {
private boolean isSearchMaSEO靠我tch(String value, String search) {
...
else if (StringUtils.equals(value, search)) {
return true;
}
...
}
然后我们需要实现和Predicate共同作用的FilterRowsCallback接口。再一次从发行包的callback包下拷贝ProcessRowsCallback源代码到你的工程里。 请参照我们创SEO靠我建的定制的ExactMatchFilterPredicate 类来确认仅仅实现了FilterRowsCallback和修改Predicate。
public class ExactMatchFilterSEO靠我Rows implements FilterRowsCallback {
public Collection filterRows(TableModel model, Collection rows) SEO靠我throws Exception {
...
if (filtered) {
Collection collection = new ArrayList();
Predicate filterPredicatSEO靠我e = new ExactMatchFilterPredicate(model);
CollectionUtils.select(rows, filterPredicate, collection);
rSEO靠我eturn collection;
}
...
}
}
为了使用这个FilterRowsCallback你应该在Preferences中声明一个别名。当然,你可以省略这步而在JSP中提供这个FilterRowsSEO靠我Callback实现类的全路径,但是使用Preferences更简洁。
table.filterRowsCallback.exactMatch=org.extremesite.callback.ExacSEO靠我tMatchFilterRows在TableTag通过设置filterRowsCallback属性来使用ExactMatchFilterRows。
<ec:table filterRowsCallbacSEO靠我k="exactMatch"/>如果不清楚Preferences和ColumnTag定义语法请参考Preferences指南。
eXtremeTable本质上是一个form组件,所SEO靠我以我假定表被包在form里,所有的功能都被认为是对form元素的操作。如果你想在表体中包含一些定制的form元素, 或者想将eXtremeTable嵌入到另外的form中,那么你就要使用表标签的forSEO靠我m属性用来参照最近的form。
为了示范form特性,我们要做的工作将分解为JSP,Cell和Controller。
下面列出的是checkbox示例的完整代码。想要强调的主要事情是表标签SEO靠我form属性设置为presForm,它参照被称为presForm的form元素。
同时请注意表标签的autoIncludeParameters属性。进行排序、过滤、分页时,默认的eXtremeTableSEO靠我将保持所有传至JSP页面的参数。 这个特性对于内部其他的form进行排序、过滤、分页时,用于高效复制form元素同样有效。可以设置 autoIncludeParameters属性为false来固定它。SEO靠我
在这个form使用id属性是因为xhtm标准的要求,同时你也可以使用form的name属性。
网站备案号:浙ICP备17034767号-2