eXtremeComponents使用总结--1(转载)
前言eXtremeComponents是一系列提供高級顯示的開源JSP定制標簽。當前的包含 的組件為eXtremeTable,用于以表的形式顯示數據。 本文檔處于更新中。大部分章節我將僅僅描述如何使用eXtremeTable。當然, 為了使程序高效并具有更高的靈活性,源代碼被再三重構。隨后, 我認為闡述一下如 何做設計決定是值得的。我希望大家能知道使用extremeTable是多么容易,并且所 有的東西都是可配置。如果你有任何的要求和建議, 請及時通過論壇或者 extremecomponents@gmail.com和我聯系。 我想感謝Chris Bauer(Hibernate開發小組)和Rod Johnson(Spring開發小組)。 Chris提供并修改了DocBook-XSL使它能生成Hibernate參考指南。Rod對于使用從Hibernate 得到的這個軟件來生成Spring文檔提供了支持。我現在用它來生成eXtremeComponents的文檔。 譯者注:如果大家有什么疑問和建議,可以通過xplucky@gmail.com和我聯系。 Chapter 1. 配置1.1. 先決條件
最小的Jars要求:
PDF導出需要的Jars:
XLS導出需要的Jars:
1.2. 安裝從sourceforge 下載發行包。(http://sourceforge.net/projects/extremecomp/) 在壓縮文件里你能找到開始使用需要的所有東西:
將extremecomponents.jar文件拷貝到你的工程的/WEB-INF/lib目錄下。 處理TLD文件有兩種方式。 你可以把extremecomponents.tld文件放到WEB-INF目錄下的任何地方。 不過,為了便于管理,我喜歡把我的TLD文件都放到/WEB-INF/tld目錄下。你需要根據你的extremecomponents.tld 文件的位置來修改/WEB-INF/web.xml文件的標簽映射。 <taglib><taglib-uri>/tld/extremecomponents</taglib-uri> <taglib-location>/WEB-INF/tld/extremecomponents.tld</taglib-location> </taglib> 隨后,你需要向下面一樣在你的JSP里把eXtremeTable包含進來: <%@ taglib uri="/tld/extremecomponents" prefix="ec" %>如果你的servlet容器支持JSP 1.2 (或更高版本),它將能夠自動發現TLD文件,那么你什么也不需要做。 當extremecomponents.jar被容器加載的時候,在它的META-INF目錄下的extremecomponents.tld文件將被找到。 這時,你需要向下面一樣在你的JSP里把eXtremeTable包含進來: <%@ taglib uri="http://www.extremecomponents.org" prefix="ec" %>為了使用eXtremeTable樣式,從styles目錄拷貝extremecomponents.css到你存放.css腳本的地方。 當然在JSP頁面里,你需要提供一個到CSS的鏈接。就像我將我的樣式表放在/styles目錄下。 <%@ taglib uri="/tld/c" prefix="c" %><link rel="stylesheet" type="text/css" href="<c:url value="/styles/extremecomponents.css"/>"> 1.3. 導出過濾器(可選)為了使導出功能有效,你需要設置導出過濾器。這是一個僅用于導出功能的可選配置。 如下所示在/WEB-INF/web.xml里配置過濾器: <filter><filter-name>eXtremeExport</filter-name> <filter-class>org.extremecomponents.table.filter.ExportFilter</filter-class> </filter> <filter-mapping> <filter-name>eXtremeExport</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 過濾器還有一個可選的初始化參數,用于決定什么時候生成報頭(headers)。我發現大多數的servlet容器 傾向于在調用過濾器的doFilter()方法后才設置響應報頭(response headers)。然而,一些servlet容器只有在 調用過濾器的doFilter()方法前設置響應報頭,過濾器才能正常工作。默認的方法是調用過濾器的doFilter()方法后 設置響應報頭,你可以通過使用responseHeadersSetBeforeDoFilter這個初始化參數調整它。 <filter><filter-name>eXtremeExport</filter-name> <filter-class>org.extremecomponents.table.filter.ExportFilter</filter-class> <init-param> <param-name>responseHeadersSetBeforeDoFilter</param-name> <param-value>true</param-value> </init-param> </filter> 如果你使用了Sitemesh,你將需要包含SitemeshPageFilter。SitemeshPageFilter擴展了正常的 sitemesh的PageFilter,它使得正在進行導出的JSP頁面不被修飾。 如下所示在/WEB-INF/web.xml里配置過濾器: <filter><filter-name>Sitemesh</filter-name> <filter-class>org.extremecomponents.table.filter.SitemeshPageFilter</filter-class> </filter> <filter-mapping> <filter-name>Sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 1.4. 安裝測試使用發行包的test.jsp來測試安裝。將test.jsp拷貝到web應用的最頂層, 默認的圖片文件在 /images/table/子目錄下。為了測試,創建相應的目錄并將拷貝所有需要的圖片。所有工作都完成后,你可以在瀏覽 器里運行test.jsp了。 提示: 我不提倡在JSP里使用腳本(scriplets),但為了不用使用框架而能進行快速測試,在test.jsp 使用腳本是唯一的辦法。 Chapter 2. 概述2.1. 引言eXtremeTable在給定的servlet范圍(scope)外取得Beans或Maps的集合用于JSP頁面顯示。 servelet范圍的搜索順序是:page, request, session和application。通過設定TableTage的items 屬性,eXtremeTable知道哪些需要在servlet范圍外被保持。 集合里的Beans是pojo,如果使用maps那么它就是鍵值對。你可以認為每一個bean就是表中的一行數據。 在接下來的文檔中,我將使用Beans集合來代替這兩種集合。 實際表使用的最小語法如下所示: <ec:tableitems="presidents" action="${pageContext.request.contextPath}/presidents.run" imagePath="${pageContext.request.contextPath}/images/*.gif"> <ec:row> <ec:column property="firstName"/> <ec:column property="lastName"/> <ec:column property="termDate"/> </ec:row> </ec:table> 這就是eXtremeTable的一個典型定義。通過這些定義,你將得到格式化的列和頁頭,工具欄的所有 特性也能很好工作。 Chapter 3. TableTag3.1. 引言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。 3.2. 顯示圖片為了顯示圖片需要設置imagePath屬性: <ec:tableitems="presidents" var="pres" imagePath="${pageContext.request.contextPath}/images/*.gif" > ... </ec:table> eXtremeTable將找到一個目錄下的所有圖片并使用特殊的語法來定義他們是那類圖片。 本示例中所有的圖片都直接保存在web上下文的images目錄下。*.gif使eXtremeTable知道所 有的圖片都是GIF格式的。在我們討論preferences后,你將發現你可以你可以通過在 extremecomponents.properties文件中設定這個屬性,而不用再整個應用的每個eXtremeTable 中包含它。 3.3. 過濾、排序和動作(Action)eXtremeTable內嵌了過濾和排序功能,你只需要決定是否需要使用他們。你要使用的屬性是 filterable和sortable,他們都是布爾值并且默認值是true。默認的所有特性都有效,你可以按照 需要來關掉一些特性。比如,如果你不想使用排序或過濾你可以把他們的屬性設為false。 <ec:tableitems="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。 3.4. 設定每頁顯示行數默認地eXtremeTable一頁將顯示15行。你可以通過設定rowsDisplayed屬性為你想顯示行數的數 值來改變它。rowsDisplayed也可以在extremecomponents.properties文件中設定。(參考Preferences)。 提示:如果你想在一頁中顯示所有行,只需要設置showPagination為false。 3.5. 樣式TableTag關聯了很多樣式屬性: <ec:tablecellspacing="0" cellpadding="0" border="0" width="80%" style="" styleClass="" /> 所有這些都是可選的。 3.6. 保存表的狀態表新增了兩個屬性: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。 3.7. 其他屬性為了保持一致性,所有的顯示特性都命名為showXXXX。他們包括showPagination、showStatusBar、 showTooltips、和showExports。 title屬性將在表的上方顯示標題,標題的位置根據使用的視圖不同而不同。當前默認視圖中標題位于表的上方 工具條的左邊。更詳細的信息請參考View。 你會發現還有一些屬性沒有被探討,因為他們將在其他章探討。autoIncludeParameters在ParameterTag里被探討; retrieveRowsCallback,sortRowsCallback和filterRowsCallback在Callbacks里被探討。 3.8. 擴展屬性大多數標簽包含一系列的固定屬性,這樣那些已經實現的功能能夠被使用。然而,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:customTableitems="presidents" action="${pageContext.request.contextPath}/public/demo/presidents.jsp" title="Presidents" > <ec:row> <ec:column property="nickName"/> </ec:row> </mycompany:customTable> |
總結
以上是生活随笔為你收集整理的eXtremeComponents使用总结--1(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VB程序设计教程(第四版)龚沛曾-实验8
- 下一篇: weblogic安装及部署