Chapter 3. TableTag
TableTag用來設(shè)定什么被顯示并且如何進(jìn)行顯示。默認(rèn)的eXtremeTable在servlet范圍(按照page,request, session,applicaton的順序)尋找具有名稱和items屬性設(shè)置相同的Beans集合(如前章所述它指Beans和Maps兩種集合)。 表將遍歷所有列,它使用var屬性將當(dāng)前行對(duì)應(yīng)的bean從集合傳到page范圍,因此你可以從page范圍中重新得到這些數(shù)據(jù) 進(jìn)行操作。tableId用來唯一標(biāo)識(shí)表,如果在JSP頁面里包含兩個(gè)或兩個(gè)以上的表時(shí)需要設(shè)置它。
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");
}
現(xiàn)在你可以構(gòu)造表了:
<%@ 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>
從本示例中你應(yīng)該知道我們將名為presidents的Beans集合以presidents為名稱放到request中。 為了使表知道如何找到這個(gè)Beans集合,我們?cè)O(shè)置TableTag的items屬性為presidents。同時(shí)我們定義 了兩列:firstName和lastName。firstName列是最普通的用法:我們僅僅想讓這列從當(dāng)前bean中得到相應(yīng) firstName的值;lastName列示另外一種用法:明確取得值。
從一列中明確取得值非常有用,但是你需要理解表是如何構(gòu)造行的。為了構(gòu)造行,表需要對(duì)所有行進(jìn)行 rowsDisplayed屬性設(shè)定次數(shù)的迭代。每次迭代都從Beans里取得下一個(gè)bean并使用var屬性設(shè)定的名稱傳入page 范圍。也可以說每次迭代你都訪問的是集合中當(dāng)前行對(duì)應(yīng)的bean。
為了顯示圖片需要設(shè)置imagePath屬性:
<ec:table
items="presidents"
var="pres"
imagePath="${pageContext.request.contextPath}/images/*.gif"
>
...
</ec:table>
eXtremeTable將找到一個(gè)目錄下的所有圖片并使用特殊的語法來定義他們是那類圖片。 本示例中所有的圖片都直接保存在web上下文的images目錄下。*.gif使eXtremeTable知道所 有的圖片都是GIF格式的。在我們討論preferences后,你將發(fā)現(xiàn)你可以你可以通過在 extremecomponents.properties文件中設(shè)定這個(gè)屬性,而不用再整個(gè)應(yīng)用的每個(gè)eXtremeTable 中包含它。
eXtremeTable內(nèi)嵌了過濾和排序功能,你只需要決定是否需要使用他們。你要使用的屬性是 filterable和sortable,他們都是布爾值并且默認(rèn)值是true。默認(rèn)的所有特性都有效,你可以按照 需要來關(guān)掉一些特性。比如,如果你不想使用排序或過濾你可以把他們的屬性設(shè)為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>
如果你仍不確信,你可以來驗(yàn)證他們。首先,設(shè)置filterable和sortable為true,你將看到 eXtremeTable允許你輸入關(guān)鍵詞來過濾結(jié)果集,它也允許你通過在頁頭(header)上滾動(dòng)鼠標(biāo)來排序。 然后,設(shè)置filterable和sortable為fale,你將發(fā)現(xiàn)所有這些特性都不允許使用。
本示例需要指出的是使用action屬性,action被用來告訴eXtremeTable當(dāng)過濾或排序時(shí)如何回 到當(dāng)前的頁面。本例中我通過Spring框架的controller(在這里是presidents.run)來得到Beans集合。 你不需要擔(dān)心傳參問題,eXtremeTable將保存所有的參數(shù)并將它們和過濾器、排序、分頁一起傳遞給 Beans集合。更詳細(xì)的信息請(qǐng)參考ParameterTag。
默認(rèn)地eXtremeTable一頁將顯示15行。你可以通過設(shè)定rowsDisplayed屬性為你想顯示行數(shù)的數(shù) 值來改變它。rowsDisplayed也可以在extremecomponents.properties文件中設(shè)定。(參考Preferences)。
提示:如果你想在一頁中顯示所有行,只需要設(shè)置showPagination為false。
TableTag關(guān)聯(lián)了很多樣式屬性:
<ec:table
cellspacing="0"
cellpadding="0"
border="0"
width="80%"
style=""
styleClass=""
/>
所有這些都是可選的。
表新增了兩個(gè)屬性:state和stateAttr。state屬性參照State借口并能插接如何保存表的狀態(tài)的不同實(shí)現(xiàn)。
State借口如下:
public interface State {
public void saveParameters(TableModel model, Map parameters);
public Map getParameters(TableModel model);
}
state屬性使用預(yù)設(shè)的四種狀態(tài)(default、notifyToDefault、persist和notifyToPersist)之一, 你也可以插接自己的實(shí)現(xiàn)。default狀態(tài)不維持任何狀態(tài);persist狀態(tài)沒有任何參數(shù)傳入,將一直維持表的狀態(tài); notifyToDefault狀態(tài)將一直維持表的狀態(tài)直到你傳入?yún)?shù)告訴它回到default狀態(tài);notifyToPersist狀態(tài) 將一直維持當(dāng)前狀態(tài)直到你傳入?yún)?shù)告訴它維持persisted狀態(tài)。
stateAttr為指定參數(shù)提供了一條途徑,你也可以使用屬性文件在全局范圍內(nèi)指定它。 為了向后兼容,默認(rèn)參數(shù)一直為useSessionFilterSort。
如果你想state按照不同方式工作你只要實(shí)現(xiàn)State接口,然后使用TableTag的state屬性來指定實(shí)現(xiàn)類的 全路徑。
作為一條首要規(guī)則當(dāng)使用state屬性時(shí),需要指定tableId。這是因?yàn)閟tate使用tableId為名保存在session里。 如果tableId不唯一,eXtremeTable將覆蓋另一個(gè)同名的內(nèi)容。tableId默認(rèn)值為ec。
為了保持一致性,所有的顯示特性都命名為showXXXX。他們包括showPagination、showStatusBar、 showTooltips、和showExports。
title屬性將在表的上方顯示標(biāo)題,標(biāo)題的位置根據(jù)使用的視圖不同而不同。當(dāng)前默認(rèn)視圖中標(biāo)題位于表的上方 工具條的左邊。更詳細(xì)的信息請(qǐng)參考View。
你會(huì)發(fā)現(xiàn)還有一些屬性沒有被探討,因?yàn)樗麄儗⒃谄渌绿接憽utoIncludeParameters在ParameterTag里被探討; retrieveRowsCallback,sortRowsCallback和filterRowsCallback在Callbacks里被探討。
大多數(shù)標(biāo)簽包含一系列的固定屬性,這樣那些已經(jīng)實(shí)現(xiàn)的功能能夠被使用。然而,eXtremeTable具有一種更具彈性的架構(gòu), 你可以添加自己的標(biāo)簽屬性實(shí)現(xiàn)更多的定制工作。此外,eXtremeTable提供了非常清晰的鉤子(hooks)允許你得到那些定制的 標(biāo)簽屬性來做一些你需要的工作。
通過addExtendedAttributes()方法將擴(kuò)展屬性包含到eXtremeTable里:
public void addExtendedAttributes(Table table);
如果方法被覆蓋TableTag將調(diào)用它。你需要做的就是擴(kuò)展TableTag,覆蓋addExtendedAttributes()方法,然后添加自己 的屬性到表對(duì)象中。一個(gè)定制的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");
}
}
現(xiàn)在你添加了屬性值到table對(duì)象。
另外,你也可以定制自己的標(biāo)簽和自己的TLD文件。你不需要修改extremecomponents.tld文件。 你能象使用eXtremeTable里的標(biāo)簽一樣使用自己的標(biāo)簽,除了使用你自己標(biāo)簽的參照。假如你的標(biāo)簽參照為mycompany 并且標(biāo)簽為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>
posted on 2006-02-26 12:12 Lucky 閱讀(1112) 評(píng)論(2) 編輯 收藏 所屬分類: extremeComponents