TableTag用來設定什么被顯示并且如何進行顯示。默認的eXtremeTable在servlet范圍(按照page,request,
session,applicaton的順序)尋找具有名稱和items屬性設置相同的Beans集合(如前章所述它指Beans和Maps兩種集合)。
表將遍歷所有列,它使用var屬性將當前行對應的bean從集合傳到page范圍,因此你可以從page范圍中重新得到這些數據
進行操作。tableId用來唯一標識表,如果在JSP頁面里包含兩個或兩個以上的表時需要設置它。
President bean定義如下:
public class President implements Serializable {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Beans集合需要被組裝并傳到servlet范圍中。我喜歡使用Spring框架,因此示例將使用Spring框架的
控制器(Controller)。如果你正在使用Struts,它和Action的功能類似。如果你使用別的東西,比如直接使用
servlets,你只需要明白我所做的只是組裝Beans集合并傳到request范圍中。
public class Presidents extends AbstractController {
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response)
throws Exception {
List presidents = new ArrayList();
President president = new President();
president.setFirstName("George");
president.setLastName("Washington");
presidents.add(president);
president = new President();
president.setFirstName("John");
president.setLastName("Adams");
presidents.add(president);
request.setAttribute("presidents", presidents);
return new ModelAndView("/demo/presidents.jsp");
}
現在你可以構造表了:
<%@ taglib uri="/tld/extremecomponents" prefix="ec" %>
<ec:table
items="presidents"
var="pres"
imagePath="${pageContext.request.contextPath}/images/*.gif"
action="${pageContext.request.contextPath}/presidents.run"
>
<ec:column property="firstName"/>
<ec:column property="lastName"/>
${pres.lastName}
</ec:column>
</ec:table>
從本示例中你應該知道我們將名為presidents的Beans集合以presidents為名稱放到request中。
為了使表知道如何找到這個Beans集合,我們設置TableTag的items屬性為presidents。同時我們定義
了兩列:firstName和lastName。firstName列是最普通的用法:我們僅僅想讓這列從當前bean中得到相應
firstName的值;lastName列示另外一種用法:明確取得值。
從一列中明確取得值非常有用,但是你需要理解表是如何構造行的。為了構造行,表需要對所有行進行
rowsDisplayed屬性設定次數的迭代。每次迭代都從Beans里取得下一個bean并使用var屬性設定的名稱傳入page
范圍。也可以說每次迭代你都訪問的是集合中當前行對應的bean。
為了顯示圖片需要設置imagePath屬性:
<ec:table
items="presidents"
var="pres"
imagePath="${pageContext.request.contextPath}/images/*.gif"
>
...
</ec:table>
eXtremeTable將找到一個目錄下的所有圖片并使用特殊的語法來定義他們是那類圖片。
本示例中所有的圖片都直接保存在web上下文的images目錄下。*.gif使eXtremeTable知道所
有的圖片都是GIF格式的。在我們討論preferences后,你將發現你可以你可以通過在
extremecomponents.properties文件中設定這個屬性,而不用再整個應用的每個eXtremeTable 中包含它。
eXtremeTable內嵌了過濾和排序功能,你只需要決定是否需要使用他們。你要使用的屬性是
filterable和sortable,他們都是布爾值并且默認值是true。默認的所有特性都有效,你可以按照
需要來關掉一些特性。比如,如果你不想使用排序或過濾你可以把他們的屬性設為false。
<ec:table
items="presidents"
var="pres"
imagePath="${pageContext.request.contextPath}/images/*.gif"
action="${pageContext.request.contextPath}/presidents.run"
filterable="false"
sortable="false"
>
...
</ec:table>
如果你仍不確信,你可以來驗證他們。首先,設置filterable和sortable為true,你將看到
eXtremeTable允許你輸入關鍵詞來過濾結果集,它也允許你通過在頁頭(header)上滾動鼠標來排序。
然后,設置filterable和sortable為fale,你將發現所有這些特性都不允許使用。
本示例需要指出的是使用action屬性,action被用來告訴eXtremeTable當過濾或排序時如何回
到當前的頁面。本例中我通過Spring框架的controller(在這里是presidents.run)來得到Beans集合。
你不需要擔心傳參問題,eXtremeTable將保存所有的參數并將它們和過濾器、排序、分頁一起傳遞給
Beans集合。更詳細的信息請參考ParameterTag。
默認地eXtremeTable一頁將顯示15行。你可以通過設定rowsDisplayed屬性為你想顯示行數的數
值來改變它。rowsDisplayed也可以在extremecomponents.properties文件中設定。(參考Preferences)。
提示:如果你想在一頁中顯示所有行,只需要設置showPagination為false。
TableTag關聯了很多樣式屬性:
<ec:table
cellspacing="0"
cellpadding="0"
border="0"
width="80%"
style=""
styleClass=""
/>
所有這些都是可選的。
表新增了兩個屬性:state和stateAttr。state屬性參照State借口并能插接如何保存表的狀態的不同實現。
State借口如下:
public interface State {
public void saveParameters(TableModel model, Map parameters);
public Map getParameters(TableModel model);
}
state屬性使用預設的四種狀態(default、notifyToDefault、persist和notifyToPersist)之一,
你也可以插接自己的實現。default狀態不維持任何狀態;persist狀態沒有任何參數傳入,將一直維持表的狀態;
notifyToDefault狀態將一直維持表的狀態直到你傳入參數告訴它回到default狀態;notifyToPersist狀態
將一直維持當前狀態直到你傳入參數告訴它維持persisted狀態。
stateAttr為指定參數提供了一條途徑,你也可以使用屬性文件在全局范圍內指定它。
為了向后兼容,默認參數一直為useSessionFilterSort。
如果你想state按照不同方式工作你只要實現State接口,然后使用TableTag的state屬性來指定實現類的 全路徑。
作為一條首要規則當使用state屬性時,需要指定tableId。這是因為state使用tableId為名保存在session里。
如果tableId不唯一,eXtremeTable將覆蓋另一個同名的內容。tableId默認值為ec。
為了保持一致性,所有的顯示特性都命名為showXXXX。他們包括showPagination、showStatusBar、
showTooltips、和showExports。
title屬性將在表的上方顯示標題,標題的位置根據使用的視圖不同而不同。當前默認視圖中標題位于表的上方 工具條的左邊。更詳細的信息請參考View。
你會發現還有一些屬性沒有被探討,因為他們將在其他章探討。autoIncludeParameters在ParameterTag里被探討;
retrieveRowsCallback,sortRowsCallback和filterRowsCallback在Callbacks里被探討。
大多數標簽包含一系列的固定屬性,這樣那些已經實現的功能能夠被使用。然而,eXtremeTable具有一種更具彈性的架構,
你可以添加自己的標簽屬性實現更多的定制工作。此外,eXtremeTable提供了非常清晰的鉤子(hooks)允許你得到那些定制的
標簽屬性來做一些你需要的工作。
通過addExtendedAttributes()方法將擴展屬性包含到eXtremeTable里:
public void addExtendedAttributes(Table table);
如果方法被覆蓋TableTag將調用它。你需要做的就是擴展TableTag,覆蓋addExtendedAttributes()方法,然后添加自己
的屬性到表對象中。一個定制的TreeTag示例如下:
public class TreeTag extends TableTag {
private String parentAttribute;
private String identifier;
public void setParentAttribute(String parentAttribute) {
this.parentAttribute = parentAttribute;
}
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
public void addExtendedAttributes(Table table) {
table.addAttribute(TableConstants.PARENT_ATTRIBUTE, TagUtils.evaluateExpressionAsString("parentAttribute",
parentAttribute, this, pageContext));
table.addAttribute(TableConstants.IDENTIFIER, TagUtils.evaluateExpressionAsString("identifier",
identifier, this, pageContext));
table.setFilterRowsCallback("org.extremecomponents.tree.ProcessTreeRowsCallback");
table.setSortRowsCallback("org.extremecomponents.tree.ProcessTreeRowsCallback");
}
}
現在你添加了屬性值到table對象。
另外,你也可以定制自己的標簽和自己的TLD文件。你不需要修改extremecomponents.tld文件。
你能象使用eXtremeTable里的標簽一樣使用自己的標簽,除了使用你自己標簽的參照。假如你的標簽參照為mycompany
并且標簽為customTable,你可以先下面一樣使用他們:
<mycompany:customTable
items="presidents"
action="${pageContext.request.contextPath}/public/demo/presidents.jsp"
title="Presidents"
>
<ec:row>
<ec:column property="nickName"/>
</ec:row>
</mycompany:customTable>