拦截特性被用在运行时需要修改属性值的时候,它使得改变基于数据的eXtremeTable的行为成为可能。在阅读扩展标签属性时,你会发现它和扩展标签属性具有同样的概念和方法标识。
区分使用他们的首要准则是:如果需要向TLD里已经定义的并且能够在JSP中访问的标签添加新的属性时,应该使用扩展标签属性;如果仅仅是需要修改已经定义好的属性的值的时候,应该使用拦截器。
你可能需要了解更多的eXtremeTable如何运作的技术背景才能完全理解这种特性。
eXtremeTable首先做的就是遍历所有标签并创建对应的模型beans
(pojos)。beans是具有和标签一样属性,但是使用真实类型来替换仅仅使用字符串类型的对象。beans是被模型使用并且是你需要使用拦截特性修改的对象。
所有的拦截器接口都定义了一个add方法, add方法被用来处理模型bean第一次创建时的属性。行和列的拦截器还有一个modify
方法。modify方法可以在当行和类进行处理是对属性值进行操作。
下面列出了具有拦截特性的标签和他们需要被实现的接口,Bean栏显示了被模型创建的Bean。
示范拦截特性的完美示例就是根据一定的标准来对行进行高亮显示,这也是我们将要完成的示例。它很短也很简单,不过它实现的概念同样适用于每一个拦截器接口。
我们需要做的第一件事就是实现InterceptRow接口。你会注意到这个接口有两个方法:addRowAttributes()
和modifyRowAttributes()。addRowAttributes方法在行bean创建的时候被调用,
modifyRowAttributes方法在表处理当前页面行的时候被调用。
public class MarkerIntercept implements InterceptRow {
public void addRowAttributes(TableModel tableModel, Row row) {
}
public void modifyRowAttributes(TableModel model, Row row) {
President president = (President) model.getCurrentRowBean();
String career = president.getCareer();
if (StringUtils.contains(career, "Soldier")) {
row.setStyle("background-color:#fdffc0;");
} else {
row.setStyle("");
}
}
}
在Preferences里你应该定义这个行拦截器的别名。
row.intercept.marker=org.extremesite.intercept.MarkerIntercept
这样就可以在行标签中使用拦截器MarkerIntercept了。
<ec:row intercept="marker">
如果不清楚Preferences和TableTag定义语法请参考Preferences指南。