攔截特性被用在運行時需要修改屬性值的時候,它使得改變基于數(shù)據(jù)的eXtremeTable的行為成為可能。在閱讀擴展標簽屬性時,你會發(fā)現(xiàn)它和擴展標簽屬性具有同樣的概念和方法標識。
區(qū)分使用他們的首要準則是:如果需要向TLD里已經(jīng)定義的并且能夠在JSP中訪問的標簽添加新的屬性時,應該使用擴展標簽屬性;如果僅僅是需要修改已經(jīng)定義好的屬性的值的時候,應該使用攔截器。
你可能需要了解更多的eXtremeTable如何運作的技術(shù)背景才能完全理解這種特性。
eXtremeTable首先做的就是遍歷所有標簽并創(chuàng)建對應的模型beans
(pojos)。beans是具有和標簽一樣屬性,但是使用真實類型來替換僅僅使用字符串類型的對象。beans是被模型使用并且是你需要使用攔截特性修改的對象。
所有的攔截器接口都定義了一個add方法, add方法被用來處理模型bean第一次創(chuàng)建時的屬性。行和列的攔截器還有一個modify
方法。modify方法可以在當行和類進行處理是對屬性值進行操作。
下面列出了具有攔截特性的標簽和他們需要被實現(xiàn)的接口,Bean欄顯示了被模型創(chuàng)建的Bean。
示范攔截特性的完美示例就是根據(jù)一定的標準來對行進行高亮顯示,這也是我們將要完成的示例。它很短也很簡單,不過它實現(xiàn)的概念同樣適用于每一個攔截器接口。
我們需要做的第一件事就是實現(xiàn)InterceptRow接口。你會注意到這個接口有兩個方法:addRowAttributes()
和modifyRowAttributes()。addRowAttributes方法在行bean創(chuàng)建的時候被調(diào)用,
modifyRowAttributes方法在表處理當前頁面行的時候被調(diào)用。
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指南。