日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

eXtremeComponents 使用总结

發布時間:2024/8/1 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 eXtremeComponents 使用总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言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. 先決條件Servlet 2.3或更高版本JDK 1.3.1或更高版本最小的Jars要求:commons-beanutils 1.6commons-collections 3.0commons-lang 2.0commons-logging 1.0.4standard 1.0.2PDF導出需要的Jars:minimum jars (above)avalon-framework 4.0batik 1.5-fop-0.20-5fop 0.20.5xalan 2.5.1xercesImpl 2.6.1xml-apis 2.0.2XLS導出需要的Jars:minimum jars (above)poi-2.5.1.jar1.2. 安裝從sourceforge 下載發行包。(http://sourceforge.net/projects/extremecomp/)在壓縮文件里你能找到開始使用需要的所有東西:extremecomponents.jarextremecomponents.tldextremecomponents.css默認的一組圖片源代碼test.jsp (用于確認安裝是否正確)將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. TableTag 3.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:tableitems="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>Chapter 4. RowTag 4.1. 引言RowTag用來定義表中的行。一個簡單RowTag示例如下:<ec:tableitems="presidents"var="pres"action="${pageContext.request.contextPath}/presidents.run"><ec:row><ec:column property="name"/><ec:column property="term"/></ec:row> </ec:table>4.2. 高亮顯示行使用highlightRow屬性可以設置行的高亮顯示,它的值為true或false,默認值為false。<ec:tableitems="presidents"var="pres"action="${pageContext.request.contextPath}/presidents.run"><ec:row highlightRow="true"><ec:column property="name"/><ec:column property="term"/></ec:row> </ec:table>設置highlightRow屬性后,它將插入設置行css類的javascript腳本,默認的css 類為highlight。你可以使用highlightClass來使用定制的css類。 4.3. 樣式RowTag關聯了很多樣式屬性:<ec:rowstyle=""styleClass=""highlightClass=""/>所有這些都是可選的。highlightClass設置行高亮顯示時的css類; style屬性定義行內聯的樣式;styleClass允許你定義一個行顯示的css類。 4.4. Javascript屬性為了便于你對于行數據進行動態交互處理,提供了onclick、onmouseover和 onmouseout屬性。<ec:rowοnclick=""οnmοuseοver=""οnmοuseοut=""/>4.5. 擴展屬性大多數標簽包含一系列的固定屬性,這樣那些已經實現的功能能夠被使用。然而,eXtremeTable具有一種更具彈性的架構, 你可以添加自己的標簽屬性實現更多的定制工作。此外,eXtremeTable提供了非常清晰的鉤子(hooks)允許你得到那些定制的 標簽屬性來做一些你需要的工作。通過addExtendedAttributes()方法將擴展屬性包含到eXtremeTable里:public void addExtendedAttributes(Row row);Chapter 5. ColumnTag 5.1. 引言ColumnTag用來定義表中的列。示例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;} }下例生成firstName和lastName列:<ec:tableitems="presidents"var="pres"action="${pageContext.request.contextPath}/presidents.run"/><ec:row><ec:column property="firstName"/><ec:column property="lastName">${pres.lastName}</ec:column></ec:row> </ec:table>通過對TableTag的討論,已經知道列可以通過動態或精確的方式得到他們的值。 firstName列動態地取得相應的值,列找到當前的bean并調用相應的getFirstName()取得值。 lastName列明確地從當前bean取得值,它要求你自己取得相應的值。如下例:<ec:tableitems="presidents"var="pres"action="${pageContext.request.contextPath}/presidents.run"><ec:row><ec:column property="lastName">${pageScope.pres.lastName}</ec:column></ec:row> </ec:table>從page范圍中取得名為pres的bean并得到它對應的lastName屬性值。如果你正使用 Beans集合請確認具有對應的getter方法;如果使用Maps集合則不需要任何別的動作, eXtremeTable能夠通過屬性名從Map中得到對應的值。提供這種可選取值方法的主要原因是使你能夠對其他類型的html標簽提供動作支持,例如顯示 一幅圖片或者通過定義href使該列成為到其它頁的一個鏈接。<ec:tableitems="presidents"var="pres"action="${pageContext.request.contextPath}/presidents.run"><ec:row><ec:column property="lastName"><a href="http://goto.president.detail">${pageScope.pres.lastName}</a></ec:column></ec:row> </ec:table>切記bean中所有的屬性都是可訪問的,因此你甚至可以通過firstName屬性 來顯示下一頁。請注意firstName屬性是如何作為URL字符串傳輸的。<ec:tableitems="presidents"var="pres"action="${pageContext.request.contextPath}/presidents.run"/><ec:row><ec:column property="lastName"><a href="http://goto.president.detail?firstName=${pageScope.pres.firstName}">${pageScope.presidents.lastName}</a></ec:column></ec:row> </ec:table>我將不再在任何示例中強調pageScope。JSP標簽總是最先在pageScope中尋找任何對像, 因此我們總是能安全地返回正確的bean。 5.2. Cell每一列總是被實現Cell接口的對象修飾,你可以認為Cell是一個為了html顯示或導出而返回格式化值的對象。 發行包包含的Cell有DisplayCell、DateCell、 NumberCell和RowCountCell。 DisplayCell是僅僅顯示列值的默認cell;DateCell使用parse屬性(可選)和format屬性來格式化對應的屬性值; NumberCell使用format屬性來格式化對應的屬性值;RowCountCell顯示當前行。提示:為了避免混亂并提高靈活性Cell接口已經被修改。而且對于區別 如何處理html和導出顯示值也不是很清晰。以前列值作為html顯示,列的propertyValue作為導出使用。 另外列值和propertyValue已經重寫,他們以前在view中是不能被訪問的。cell現在是singleton并且不再線程安全,改變的原因是為了Cell接口能更簡單地被使用。 init()和destroy()方法作為singleton更靈活但是處于一種混亂的狀態。Cell接口如下:public interface Cell {/*** The display that will be used for the exports.*/public String getExportDisplay(TableModel model, Column column);/*** The html that will be displayed in the table.*/public String getHtmlDisplay(TableModel model, Column column); }現在得到導出和html顯示存在明顯的區別。更重要的,需要返回字符串。列值和屬性值不再 需要設置。DisplayCell是擴展AbstractCell的最簡單的Cell。AbstractCell定義 的虛擬方法getCellValue用來返回cell的值。雖然AbstractCell在一些情況下是有用的, 但更多情況下只需要直接實現Cell接口。DisplayCell:public class DisplayCell extends AbstractCell {public String getExportDisplay(TableModel model, Column column) {return column.getPropertyValueAsString();}protected String getCellValue(TableModel model, Column column) {return column.getValueAsString();} }AbstractCell:public abstract class AbstractCell implements Cell {public String getExportDisplay(TableModel model, Column column) {return getCellValue(model, column);}public String getHtmlDisplay(TableModel model, Column column) {HtmlBuilder html = new HtmlBuilder();CellBuilder.tdStart(html, column);CellBuilder.tdBody(html, getCellValue(model, column));CellBuilder.tdEnd(html);return html.toString();}/*** A convenience method to get the display value.*/protected abstract String getCellValue(TableModel model, Column column); }現在你應該知道Cell是多么簡單。只需通過實現Cell接口或擴展AbstractCell來定制你自己的Cell, 并設置列標簽的Cell屬性為類的全路徑。例如: 如果你定制了一個名為MyCell的Cell,那么你可以像下面一樣使用它:<ec:column property="firstName" cell="com.mycompany.cell.MyCell"/>如果你改變列的數據,那么過濾或排序可能沒有意義。切記我的意思是如果你人為地改變數據, 而不是使用樣式對它進行包裝或作為<a href>包含。 如果你的定制cell顯示數據的樹狀視圖,或者是一幅圖片, 那么過濾和排序等一切邏輯操作都是沒有意義的。 5.3. Filter Cell列的filterCell屬性控制過濾器如何顯示,它和cell屬性非常相像并且也是實現Cell接口。 已經定義了兩個過濾器cells:默認的和droplist。默認的是一個輸入框元素,除非你確信你需要使這列可以進行過濾, 否則你不需要做任何事。你可以像下面一樣使用droplist過濾器Cell:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"><ec:row><ec:column property="status" filterCell="droplist"/></ec:row> </ec:table>filterCell也允許你定義定制的過濾器,所有你必須做的就是實現Cell接口或者擴展AbstractCell, 并設置列標簽的Cell屬性為類的全路徑。例如,如果你定制了一個名為MyCell的Cell,那么你可以像下面一樣使用它:<ec:column property="firstName" filterCell="com.mycompany.cell.MyFilterCell"/>參閱Cell節了解如何創建你自己定制Cells的更多信息。 5.4. Header CellheaderCell屬性控制headers如何顯示,它和cell屬性非常相像并且也是實現Cell接口。 默認header cell作為文本顯示,包含排序邏輯。headerCell也允許你定義定制的過濾器,所有你必須做的就是實現Cell接口或者擴展AbstractCell, 并設置列標簽的Cell屬性為類的全路徑。例如,如果你定制了一個名為MyCell的Cell,那么你可以像下面一樣使用它:<ec:column property="firstName" headerCell="com.mycompany.cell.MyHeaderCell"/>參閱Cell節了解如何創建你自己定制Cells的更多信息。 5.5. 樣式ColumnTag關聯了很多樣式屬性:<ec:columnwidth=""style=""styleClass=""headerStyle=""headerClass=""filterStyle=""filterClass=""/>所有這些都是可選的。style屬性定義列內聯的樣式;styleClass允許你定義一個列顯示的css類; headerClass屬性允許你改變header列的css類;filterClass屬性允許你改變filter列的css類。 5.6. 解析和格式化解析和格式化屬性被用在日期和貨幣的顯示上。和date交互的工作依賴于你的bean屬性是否是一個字符串或者是一個Date對象。 如果是一個字符串那么你就需要確定parse屬性,parse屬性是按照模板定義來解析一個字符串為 一個日期對象。如果bean中的屬性是日期型對象則不需要添加parse屬性。不論如何你都需要設置format屬性。 format屬性按你提供的模板對值進行格式化。本示例中使用MM/dd/yyyy模板格式化日期型值。因為bean中的born屬性值為字符串,所以我們需要 使用parse屬性來將它轉換成日期型數值。<ec:column property="born" cell="date" parse="yyyy-MM-dd" format="MM/dd/yyyy"/>對于貨幣只需要設置format屬性:<ec:column property="payroll" cell="currency" format="###,###,##0.00"/>很多時候在extremeTable中,你使用同樣的模版來解析和格式化日期和貨幣值。 所以便利的方法是在你自己的extremecomponents.properties文件中定義解析和格式化屬性。 參閱Preferences章了解更多信息。 5.7. 過濾和排序你可能記得在TableTag中看見過filterable和sortable屬性,ColumnTag中也有相同的屬性。 列的filterable和sortable屬性將覆蓋表的filterable和sortable屬性設置。當你需要除了對表中的一、兩列之外的 所有列進行過濾和排序時,十分便利。<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"><ec:row><ec:column property="firstName" filterable="false"/><ec:column property="lastName" sortable="false"/></ec:row> </ec:table>5.8. Calc列新增了兩個屬性:calc和calcTitle:<ec:column property="data" calc="total" calcTitle="Total:" />calc屬性實現具有唯一方法的Calc接口:public interface Calc {public Number getCalcResult(TableModel model, Column column); }它傳入model和column,并返回一個Number型的值。默認的實現為總計和平均值。為了使用定制的Calc,只需要使用ColumnTag的calc屬性來指定實現Calc接口的實現類的 全路徑。Calc為singleton并且不是線程安全的,因此不要定義任何類變量。 5.9. 允許和不允許視圖viewsAllowed屬性制定類允許使用的視圖。視圖包括:html、pdf、xls、csv,以及任何定制的視圖。 如果你指定一個或幾個視圖,那么列僅能使用這些指定的視圖。例如:你指定viewsAllowed="pdf",這意味著 這列只允許PDF導出,而不能進行其他格式的導出或html視圖。<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"><ec:row><ec:column property="firstName"/><ec:column property="lastName" viewsAllowed="pdf"/></ec:row> </ec:table>viewsDenied屬性制定類不允許使用的視圖。視圖包括:html、pdf、xls、csv,以及任何定制的視圖。 如果你指定一個或幾個視圖,那么列僅這些指定的視圖不能被使用。例如:你指定viewsDenied="html",這意味著 這列不允許使用html試圖,但能進行任何形式的導出。<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"><ec:row><ec:column property="firstName"/><ec:column property="lastName" viewsDenied="html"/></ec:row> </ec:table>5.10. 其他屬性title屬性用來為header設定一個描述性的名稱。如果你不定義title那么列將使用屬性名。 如果你不想顯示任何title,你只需要設置title屬性值為一個空白(whitespace)。<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"title="Presidents"><ec:row><ec:column property="firstName"/> //title shows as First Name<ec:column property="firstName" title="First Name"/> //title shows as First Name<ec:column property="firstName" title=" "/> //no title shows up</ec:row> </ec:table>5.11. 擴展屬性大多數標簽包含一系列的固定屬性,這樣那些已經實現的功能能夠被使用。然而,eXtremeTable具有一種更具彈性的架構, 你可以添加自己的標簽屬性實現更多的定制工作。此外,eXtremeTable提供了非常清晰的鉤子(hooks)允許你得到那些定制的 標簽屬性來做一些你需要的工作。通過addExtendedAttributes()方法將擴展屬性包含到eXtremeTable里:public void addExtendedAttributes(Column column);如果方法被覆蓋ColumnTag將調用它。你需要做的就是擴展ColumnTag,覆蓋addExtendedAttributes()方法,然后添加自己 的屬性到列對象中。一個定制的CustomTag示例如下:public class MyCustomTag extends ColumnTag {private String customAttributeOne;public String getCustomAttributeOne() {return customAttributeOne;}public void setCustomAttributeOne(String customAttributeOne) {this.customAttributeOne = customAttributeOne;}public void addExtendedAttributes(Column column) {column.addAttribute("customAttributeOne", customAttributeOne);} }現在你添加了屬性值到Column對象,現在你可以像下例一樣來定制cell:public class MyCustomCell implements Cell {public String getHtmlDisplay(TableModel model, Column column) {Object customAttributeOne = column.getAttribute("customAttributeOne")String customAttributeOne = column.getAttributeAsString("customAttributeOne")} }另外,你也可以定制自己的標簽和自己的TLD文件。你不需要修改extremecomponents.tld文件。 你能象使用eXtremeTable里的標簽一樣使用自己的標簽,除了使用你自己標簽的參照。假如你的標簽參照為mycompany 并且標簽為customColumn,你可以像下面一樣使用他們:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/public/demo/presidents.jsp"title="Presidents"><ec:row><mycompany:customColumnproperty="hello"cell="com.mycompany.cell.MyCustomCell"customAttributeOne="Hello World"/></ec:row> </ec:table>Chapter 6. ParameterTag 6.1. 引言eXtremeTable能夠指定是否處理所有的參數。默認為處理所有的參數,這意味著當你進行 過濾、排序、分頁時,所有的參數都被eXtremeTable保存并傳到JSP中。通常這是你需要的功能, 然而,有時候你需要只允許一些特定的參數保存到eXtremeTable中。我喜歡把它看作鎖定extremeTable, 可以通過設置表的autoIncludeParameters屬性值為false來到達目的:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"autoIncludeParameters=”false”>... </ec:table>甚至當表被鎖定時,你仍然可以通過簡單地使用parameter標簽來包含一些你想使用的參數。下例 包含了foo參數:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"autoIncludeParameters=”false”><ec:parameter name=”foo” value=”${param.foo}”/>... </ec:table>現在所有的eXtremeTable參數都被鎖定。但過濾、排序和翻頁時,foo參數仍將被傳遞。 Chapter 7. ExportTag 7.1. 引言eXtremeTable具有導出不同格式文件的功能,導出的數據為過濾和排序后的所有結果集, 分頁不會影響返回的結果集。換句話說,如果表數據分多頁顯示,那么所有頁的數據都將被導出。 導出的格式為Microsoft Excel (OpenOffice Calc)、PDF和CSV。使用ExportXlsTag導出Microsoft Excel (OpenOffice Calc):<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"/><ec:exportXlsfileName="presidents.xls"tooltip="Export Excel"/>... </ec:table>使用ExportPdfTag導出PDF。所有要做的就是指定fileName屬性和一些樣式屬性:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"/><ec:exportPdffileName="presidents.pdf"tooltip="Export PDF"headerColor="blue"headerBackgroundColor="red"headerTitle="Presidents"/>... </ec:table>使用ExportCsvTag導出CSV。當使用CSV導出是默認的分隔符為‘,’(comma)。你可以使用 delimiter屬性來指定為其他的符號。下面為指定‘|’(pipe)為CSV分隔符的示例:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"/><ec:exportCsvfileName="presidents.txt"tooltip="Export CSV"delimiter="|"/>... </ec:table>你可以通過指定view屬性來導出其他文件格式。eXtremeTable視圖實現View接口并是 可插接的。參閱View章了解更多信息。 7.2. 擴展屬性大多數標簽包含一系列的固定屬性,這樣那些已經實現的功能能夠被使用。然而,eXtremeTable具有一種更具彈性的架構, 你可以添加自己的標簽屬性實現更多的定制工作。此外,eXtremeTable提供了非常清晰的鉤子(hooks)允許你得到那些定制的 標簽屬性來做一些你需要的工作。通過addExtendedAttributes()方法將擴展屬性包含到eXtremeTable里:public void addExtendedAttributes(Export export);如果方法被覆蓋ExportTag將調用它。你需要做的就是擴展ExportTag,覆蓋addExtendedAttributes()方法,然后添加自己 的屬性到導出對象中。一個定制的ExportCsvTag示例如下:public class ExportCsvTag extends ExportTag {private String delimiter;public String getDelimiter() {return delimiter;}public void setDelimiter(String delimiter) {this.delimiter = delimiter;}public void addExtendedAttributes(Export export) {String view = export.getView();if (StringUtils.isBlank(view)) {export.setView(TableConstants.VIEW_CSV);export.setImageName(TableConstants.VIEW_CSV);}export.addAttribute(CsvView.DELIMITER, getDelimiter());} }現在你添加了屬性值到Export對象,下面是CsvView實現的一部分:public class CsvView implements View {public void body(TableModel model, Column column) {Export export = model.getExportHandler().getCurrentExport();} }另外,你也可以定制自己的標簽和自己的TLD文件。你不需要修改extremecomponents.tld文件。 你能象使用eXtremeTable里的標簽一樣使用自己的標簽,除了使用你自己標簽的參照。假如你的標簽參照為mycompany 并且標簽為customExport,你可以像下面一樣使用他們:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/public/demo/presidents.jsp"title="Presidents"><mycompany:customExport fileName="presidents.txt" delimiter="|"/>... </ec:table>Chapter 8. Callbacks 8.1. 引言Callbacks被用于重新得到(retrieve)、過濾和排序行數據。eXtremeTable為每個callback提供了一個定制實現。 首先,載入所有的元數據,元數據為所有eXtremeTable標簽的所有屬性;接著在eXtremeTable的model中調用 execute方法。eXtremeTable使用execute方法決定如何通過調用每個callback的接口來重新得到、過濾和排序行數據。 這三個callback的接口是:RetrieveRowsCallback、FilterRowsCallback和SortRowsCallback。callbacks為singleton并且不是線程安全的,因此不要定義任何類變量。 8.2. RetrieveRowsCallbackRetrieveRowsCallback的默認實現在servlet范圍內尋找具有名稱和TableTag 的items屬性設置相同的Beans集合。為了使用定制的callback,只要實現RetrieveRowsCallback接口, 然后使用retrieveRowsCallback屬性來指定實現類的全路徑:<ec:tablevar="pres"action="${pageContext.request.contextPath}/presidents.run"retrieveRowsCallback="com.mycompany.callback.MyCustomCallback"/>RetrieveRowsCallback接口如下所示:public interface RetrieveRowsCallback {public Collection retrieveRows(TableModel model) throws Exception; }只有一個方法需要實現,傳入TableModel并返回一個集合,集合為Beans或Maps集合。 通過得到TableModel,就擁有了TableTag的所有元數據并能訪問Context。能夠訪問Context非常重要, 這意味著你訪問web容器的任何東西。 8.3. FilterRowsCallbackFilterRowsCallback的默認實現得到Beans集合,通過實現jakarta Predicate接口進行過濾, 過濾值從eXtremeTable的filter輸入框中取得。為了使用定制的callback,只要實現FilterRowsCallback接口, 然后使用filterRowsCallback屬性來指定實現類的全路徑:<ec:tablevar="pres"action="${pageContext.request.contextPath}/presidents.run"filterRowsCallback="com.mycompany.callback.MyCustomCallback"/>FilterRowsCallback接口如下所示:public interface FilterRowsCallback {public Collection filterRows(TableModel model, Collection rows) throws Exception; }只有一個方法需要實現,傳入TableModel并返回一個集合。你只需像eXtremeTable對 每個callback的默認實現一樣來定制自己的callback。 8.4. SortRowsCallbackSortRowsCallback的默認實現得到Beans集合,使用jakarta BeanComparator進行排序, 排序值當用戶點擊列頭時取得。為了使用定制的callback,只要實現SortRowsCallback接口, 然后使用sortRowsCallback屬性來指定實現類的全路徑:<ec:tablevar="pres"action="${pageContext.request.contextPath}/presidents.run"sortRowsCallback="com.mycompany.callback.MyCustomCallback"/>SortRowsCallback接口如下所示:public interface SortRowsCallback {public Collection sortRows(TableModel model, Collection rows) throws Exception; }只有一個方法需要實現,傳入TableModel并返回一個集合。你只需像eXtremeTable對 每個callback的默認實現一樣來定制自己的callback。 Chapter 9. 視圖 9.1. 引言eXtremeTable里視圖是可插接的,這意味著html很容易改變,或者一類新的導出能夠被實現。 所有需要做的就是實現View接口并在TableTag或ExportTag中設置view屬性。首先,讓我們看一下View接口:public interface View {public void beforeBody(TableModel model);public void body(TableModel model, Column column);public Object afterBody(TableModel model); }實現View接口的類有三次插入內容的機會。beforeBody()方法會被立刻調用; body()方法在每一行的每一列處理的時候調用;afterBody()方法是被eXtremeTable調用的 最后方法,它將返回代表視圖的一個對象,通常它是一個字符串。例如:在HTML視圖類中為的html 標簽(markup),當然它可以是任何東西。最主要的原因是定制導出時,你應該返回一些其他的對象。 9.2. 表視圖eXtremeTable的所有標簽(markup)在兩個地方生成:View或Cell。 組合使用他們, 能為你提供一種可插接的表示內容的解決方案。為了使用定制的View, 只需要使用TableTag的view屬性來指定實現View接口的實現類的 全路徑:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"view="com.mycompany.view.MyCustomView">... </ec:table>9.3. 導出視圖與表視圖不同,export的所有標簽都在View中生成。為了使用定制的View, 只需要使用ExportTag的view屬性來指定實現View接口的實現類的 全路徑:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"><ec:exportfileName="custom.file"tooltip="Export Custom"view="com.mycompany.view.MyCustomExportView"/>... </ec:table>Chapter 10. Preferences 10.1. 引言為了替代硬編碼eXtremeTable使用的默認屬性值,我在屬性文件中配置所有用到的屬性。 如果你需要覆蓋任何默認的設置,你可以創建自己的extremecomponents.properties文件 并設置你想改變的值。為了設置屬性文件,你應該如下例所示在/WEB-INF/web.xml文件中聲明一個context-param,并 指定你的屬性文件的路徑:<context-param><param-name>extremecomponentsPreferencesLocation</param-name><param-value>/org/extremesite/resource/extremecomponents.properties</param-value> </context-param>你可以認為屬性文件為你提供了一個對所有的eXtremeTables聲明全局設置的一個方法。 創建屬性文件的最大好處就是避免在標簽中復制、粘貼相同的屬性。典型的extremecomponents.properties文件如下所示:table.imagePath=/extremesite/images/*.gif table.rowsDisplayed=12 column.parse.date=yyyy-MM-dd column.format.date=MM/dd/yyyy column.format.currency=$###,###,##0.0010.2. TableTag在屬性文件定義的TableTag使用最多的兩個屬性是:imagePath和rowsDisplayed。如果你不在屬性文件中聲明 這些屬性,你需要在每個eXtremeTable中添加他們。典型的表如下所示:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"imagePath="${pageContext.request.contextPath}/images/*.gif"rowsDisplayed="12"title="Presidents">... </ec:table>如果在屬性文件聲明imagePath和rowsDisplayed,則表如下所示:<ec:tableitems="presidents"action="${pageContext.request.contextPath}/presidents.run"title="Presidents">... </ec:table>正如你所見,屬性文件避免了重復編碼。 10.3. ColumnTag在屬性文件定義的ColumnTag使用最多的兩個屬性是:parse和format。如果你不在屬性文件中聲明 這些屬性,你需要在每個eXtremeTable中添加他們。典型的列使用日期cell如下所示:<ec:column property="dateOfBirth" cell=”date” parse=”yyyy-MM-dd” format=”MM/dd/yyyy”/> 如果在屬性文件聲明parse和format,則列如下所示:<ec:column property="dateOfBirth" cell=”date”/> 當然你仍然可以定義parse和format屬性來覆蓋全局設置,但是大多數工程對于日期使用一致的parse 和format。需要注意屬性文件中parse.date和format.date的聲明語法。下例為使用貨幣cell的典型列:<ec:column property="salary" cell=”currency” format=”$###,###,##0.00”/> 如果在屬性文件聲明format,則列如下所示:<ec:column property="salary" cell=”currency”/> 另外,你可以聲明一個定制的format并在列中通過使用列的basis來使用它,我把這想象為named屬性。因此如果你的 extremecomponents.properties文件如下所示:table.format.myCustomDate=yy-MM-dd那么列可以如下使用定制的format:<ec:column property="dateOfBirth" cell="date" format=”myCustomDate”>10.4. Advanced Techniques使用named屬性是我定義其他不同屬性默認值時經常使用的方法。你可能對我 使用cell="date"來指定日期cell、使用cell="currency"來指定貨幣cell或使用view="xls."來指定xls導出感到疑惑。 如果我給你展示extremetable.properties文件的一些片斷,這些就將非常清晰了。 extremetable.properties是eXtremeTable聲明默認設置的屬性文件,你可以通過使用 extremecomponents.properties文件來覆蓋它。column.cell.date=org.extremecomponents.table.cell.DateCell column.cell.currency=org.extremecomponents.table.cell.NumberCell column.filterCell.droplist=org.extremecomponents.table.cell.FilterDroplistCell table.view.xls=org.extremecomponents.table.view.XlsView當你在列上定義cell="date"時,eXtremeTable尋找到column.cell. 屬性并將你定義的cell屬性值拼接上。 換句話說cell="date"關聯到column.cell.date=org.extremecomponents.table.cell.DateCell這條屬性。使用屬性文件 真正強大的地方在于你能夠在extremecomponents.properties文件中聲明一個定制的cell,并在ColumnTag中通過 名稱來使用它。再使用一個實例來闡明這一點,是否記得ColumnTag章Cell節中如何調用一個名為MyCell的定制cell:<ec:column property="firstName" cell="com.mycompany.cell.MyCell"/>cell使用的更好方式是在屬性文件中聲明并通過名稱使用它。首先,更新extremecomponents.properties文件:table.imagePath=/extremesite/images/*.gif table.rowsDisplayed=12 table.cellspacing=2 column.parse.date=yyyy-MM-dd column.format.date=MM/dd/yyyy column.format.currency=$###,###,##0.00 column.cell.myCell=com.mycompany.cell.MyCell現在可以通過名稱調用MyCell:<ec:column property="firstName" cell="myCell"/>正如你所見的這能幫助保持代碼清潔,并且這些都在一個地方定義。如果你的定制cell聲明 需要改變你只需要修改屬性文件。 Chapter 11. Messages 11.1. 資源綁定為了設置資源綁定,你應該如下例所示在/WEB-INF/web.xml文件中聲明一個context-param,并 指定你的資源文件的路徑:<context-param><param-name>extremecomponentsMessagesLocation</param-name><param-value>org/extremesite/resource/extremecomponentsResourceBundle</param-value> </context-param>本示例中資源文件為extremecomponentsResourceBundle,它可以為任何名或者使用已經存在的資源文件。如果你不指定locale,則它將根據你的servlet request來決定使用哪個資源文件。 在eXtremeTable中可以通過使用TableTag的locale屬性來設置它。<ec:tableitems="presidents"action="${pageContext.request.contextPath}/public/demo/locale.jsp"title="table.title.president"locale="de_DE">... </ec:table>在這里eXtremeTable將尋找德文資源文件。 11.2. 全局資源eXtremeTable使用一些全局的keys來與用戶交互,包括:狀態欄的文本信息,Rows Displayed droplist和不同的tooltips。如果你足夠幸運,eXtremeTable已經提供了相應的語言支持 的話,那么你什么也不用擔心。否則的話,你需要申明下列keys:statusbar.resultsFound={0} results found, displaying {1} to {2} statusbar.noResultsFound=There were no results found.toolbar.firstPageTooltip=First Page toolbar.lastPageTooltip=Last Page toolbar.prevPageTooltip=Previous Page toolbar.nextPageTooltip=Next Page toolbar.filterTooltip=Filter toolbar.clearTooltip=Cleartoolbar.clearText=Clear toolbar.firstPageText=First toolbar.lastPageText=Last toolbar.nextPageText=Next toolbar.prevPageText=Prev toolbar.filterText=Filtercolumn.headercell.sortTooltip=Sort Bycolumn.calc.total=Total column.calc.average=Average現在僅支持英語和德語。如果你使用其他語言的話,并能提供相應的翻譯的話我將不勝感激。你可以通過 extremecomponents@gmail.com發送給我。譯者注:我已經提供了中文和日文的資源文件。 11.3. TableTagTableTag屬性中能夠使用locale方式指定的是:imagePath和title。在eXtremeTable中,imagePath屬性有一個特定的key:table.imagePath。你可以在你的資源文件中 設置這個key為特定語言的目錄結構。例如:德文圖片可能放在de文件夾下,那么你可以在相應的資源文件中 進行如下設置:table.imagePath=/extremesite/images/table/de/*.giftitle有一點不同,如果你指定的title屬性值包含dot (.)并且你定義了一個資源文件,那么 eXtremeTable將尋找匹配的key。例如,如果你像下例一樣在表中指定屬性title="table.title.president":<ec:tableitems="presidents"action="${pageContext.request.contextPath}/public/demo/locale.jsp"title="table.title.president">... </ec:table>那么eXtremeTable將在屬性文件中尋找匹配的key:table.title.president=US Pr?sidenten11.4. ColumnTagColumnTag屬性中能夠使用locale方式指定的是:format和title。在eXtremeTable中,format屬性有一個特定的key:table.fomat.type。參考屬性文件的討論 來了解更多的細節,他們具有同樣的概念。日期和貨幣的format類型定義可能如下所示:column.format.date=MM/dd/yyyy column.format.currency=$###,###,##0.00title有一點不同,如果你指定的title屬性值包含dot (.)并且你定義了一個資源文件,那么 eXtremeTable將尋找匹配的key。例如,如果你像下例一樣在列中指定屬性title="table.column.nickName":<ec:tableitems="presidents"action="${pageContext.request.contextPath}/public/demo/locale.jsp"title="table.title.president"><ec:row><ec:column property="nickName" title="table.column.nickName" /></ec:row> </ec:table>那么eXtremeTable將在屬性文件中尋找匹配的key:table.column.nickName=SpitznameChapter 12. Limit 12.1. Limit指南默認的情況下eXtremeTable取得所有的結果集然后處理Beans集合,這樣的好處是 你可以隨意進行排序、過濾和分頁操作。你只需要組裝Beans集合并讓eXtremeTable知道如何 引用它。這樣的操作對于小到中等數據量的結果集非常有效,當結果集很大時這將非常糟糕。 這是一個判斷,但我更喜歡描述如何做出我的技術決定。如果您認為在性能上有問題, 那么最好是使用一個profiler工具記錄并查看它。有許多開源和商業的profiler工具可以幫助 你做出最好的判斷。因此,假設我們發現了性能上存在問題,需要我們自己來處理分頁。手動處理分頁意味著你一次只想取得一頁顯示需要的結果集。同時,你需要自己處理排序、過濾和分頁。 下面的討論是基于我假設你從數據庫中取得集合,當然同樣的原理能應用到任何地方。這是一個重要的部分。為了得到較小的結果集,你可以創建一個普通的查詢語句,但是limit你得到的結果集。 在Sybase和SQLServer中你可以使用rowcount命令,在MySql中你可以使用limit命令。 我不知道其他數據庫怎么使用,但我確信每個數據庫都有相似的功能。 也就是說當用戶瀏覽第一頁是得到第一頁需要的 結果集,當用戶瀏覽下一頁時,再得到下一頁需要的結果集。使用Sybase的開發人員可能會說:rowcount命令總是從第一條開始,那么當我到第二頁時我也必須 從第一條數據開始。 是的,你現在得到的是兩頁的結果集,而不需要得到所有的結果集。當你到第三頁時,你只需要得到三頁的結果集。。。。。。 其他數據庫比如MySQL,允許你精確地得到你想要的那段數據,這樣你就可以只得到當前頁面顯示需要的結果集。為了知道用戶想如何排序和過濾,他們想瀏覽哪一頁,一頁需要顯示幾條結果,eXtremeTable有一個使用LimitFactory 創建的名為Limit的簡便接口: 12.2. 創建Limit首先你需要通過LimitFactory得到一個Limit實例:Context context = new HttpServletRequestContext(request); LimitFactory limitFactory = new TableLimitFactory(context, tableId); Limit limit = new TableLimit(limitFactory);Limit對象定義了limit結果集的所有方法。TableLimitFactory具有另外一個構造函數,如果沒有指定tableId的話默認的tableId將為ec。Context context = new HttpServletRequestContext(request); LimitFactory limitFactory = new TableLimitFactory(context); Limit limit = new TableLimit(limitFactory);12.3. Filter和Sort屬性當你對Limit實例化時,實例化對象包含兩個對象:FilterSet和Sort。private FilterSet filterSet; private Sort sort;FilterSet包含一個過濾動作(Action)和一個過濾器對象數組。 動作為TableConstants.FILTER_ACTION或TableConstants.CLEAR_ACTION。 一個過濾器包含一個property和這個過濾器的值。private final String action; private final Filter[] filters;Sort對象包含property和sortOrder。sortOrder為 TableConstants.SORT_ASC或TableConstants.SORT_DESC:private Sort sort;12.4. 設置頁和行屬性設置行屬性:limit.setRowAttributes(totalRows, DEFAULT_ROWS_DISPLAYED);下面是設置行屬性可能用到的信息:private int rowStart; private int rowEnd; private int currentRowsDisplayed; private int page; private int totalRows;每個變量都有一個getter方法,我將不深入講解屬性的細節。 12.5. Setup在你完成所有的定制工作:排序、過濾.....定制的Controller(Spring)或者Action(Struts)或者其他類似的框架后, 另外你需要創建一個callback,eXtremeTable已經提供了一個名為LimitCallback的實現。為了使用你只需要設置表 屬性:retrieveRowsCallback、filterRowsCallback和sortRowsCallback:<ec:tableitems="presidents"retrieveRowsCallback="limit"filterRowsCallback="limit"sortRowsCallback="limit"action="${pageContext.request.contextPath}/limit.run"title="Presidents"><ec:row><ec:column property="fullName" title="Name"/><ec:column property="nickName" /><ec:column property="term" /><ec:column property="born" cell="date"/><ec:column property="died" cell="date"/><ec:column property="career" /></ec:row></ec:table>使用callback需要做的唯一事情是傳輸集合到request,同時傳輸totalRows屬性。 totalRows表示總行數,使用PaginationCallback.TOTAL_ROWS靜態變量將易于維護。 如果JSP頁面使用了兩個(以上)eXtremeTable的話你可以利用tableId分別傳輸totalRows。 例如如果tableId名為pres,你可以如下處理:request.setAttribute("pres", presidents); request.setAttribute("pres_totalRows", new Integer(""+totalRows));譯者注:關于limit使用的更詳細信息,請參考《Limit指南》。 Chapter 13. AutoGenerateColumns 13.1. 引言大多數情況下你按照你需要的列來設計數據庫表。但是,有時候需要運行時動態生成一些列。 為了實現這點,eXtremeTable需要使用ColumnsTag并設置autoGenerateColumns屬性。AutoGenerateColumns為singleton并且不是線程安全的,因此不要定義任何類變量。 13.2. ColumnsTagColumnsTag只有autoGenerateColumns這一個屬性。所有你必須做的就是實現AutoGenerateColumns接口, 并設置autoGenerateColumns屬性為類的全路徑。<ec:tableitems="presidents"action="${pageContext.request.contextPath}/autoGenerateColumns.run"title="Presidents"><ec:columns autoGenerateColumns="org.extremesite.controller.AutoGenerateColumnsImpl"/> </ec:table>AutoGenerateColumns接口只有一個方法:public void addColumns(TableModel model);你需要做的就是添加列(columns)到model里。最簡單的示例如下:public class AutoGenerateColumnsImpl implements AutoGenerateColumns {public void addColumns(TableModel model) {Iterator iterator = columnsToAdd().iterator();while (iterator.hasNext()) {Map columnToAdd = (Map) iterator.next();Column column = new Column(model);column.setProperty((String) columnToAdd.get(PROPERTY));column.setCell((String) columnToAdd.get(CELL));model.getColumnHandler().addAutoGenerateColumn(column);}} }示例中columnsToAdd()方法簡單返回一個包含生成列(columns)需要的所有信息的集合。 作為參考,下面是我在eXtremeComponents網站實例中使用的columnsToAdd()方法:private List columnsToAdd() {List columns = new ArrayList();columns.add(columnToAdd("fullName", "display"));columns.add(columnToAdd("nickName", "display"));columns.add(columnToAdd("term", "display"));columns.add(columnToAdd("born", "date"));columns.add(columnToAdd("died", "date"));columns.add(columnToAdd("career", "display"));return columns; }private Map columnToAdd(String property, String cell) {Map column = new HashMap();column.put(Column.PROPERTY, property);column.put(Column.CELL, cell);return column; }另外,我想聲明的是只創建列一次。eXtremeTable為了高效,不會每行創建一列, 而是通過循環持續插入新列值到已經存在的列。記住TableModel能夠訪問Context,因此 你可以在Controller(Spring)或Action(Struts)中定義樣式(look like)并通過request傳輸集合。 所以你得AutoGenerateColumns實現只需要構建列(Columns)并添加到model.columns里。 Chapter 14. Utilities 14.1. 引言eXtremeTable包含許多Utility類。在這里我只簡單地討論一些,你可以通過javadocs 得到更多的信息。 14.2. HtmlBuilder封裝了所有html語法的類。這個簡單類的使你能夠寫出更干凈的html代碼,而不用擔心null或空字符串。 一個span標簽的示例代碼如下:HtmlBuilder html = new HtmlBuilder(); html.span().styleClass(FORM_BUTTONS).close(); html.append(formButtons); html.spanEnd(); return html.toString();Chapter 15. 1.0.1-M4升級說明 15.1. 變更概述下面的特性已經被更改:HtmlView基于原來代碼的實現已經deprecatedCell接口更簡單增加RowTagAutoGenerateColumns變為singleton,更易添加列屬性Extended Attributes方法名變更TableTag的collection屬性被刪除BaseModel更名為TableModelProperties和ResourceBundle現在為Preferences和MessagespageContext被Context接口代替Limit和LimitFactory的語法變更,更易于使用TableTag的saveFilterSort屬性被state屬性代替ColumnTag的showTotal屬性被calc屬性代替search圖片的名稱變為filterFormTag/InputTag為deprecatedRetrieveRowsCallbacks、FilterRowsCallback、SortRowsCallback都變為singletons15.1.1. HtmlView我把和舊的view相關的代碼:原始的view、cell和相關代碼放到deprecated文件夾。 原因是新的view代碼非常成功,所以沒有必要使用舊的代碼。使用新代碼構建定制view請參考 view包中的HtmlView或CompactView。 15.1.2. CellCell接口已經改變,原因是想結束混亂以提高靈活性。以前對于如何處理區分html和export顯示值 不是十分明顯。現在Column值設置html,Column的propertyValue設置export。另外因為Column值和 propertyValue值被重寫。現在他們在view中是不可見的。cell現在是singleton并且不再線程安全,因此不要定義任何類變量。改變的原因是為 了Cell接口能更簡單地被使用。init()和destroy()方法作為singleton更靈活但是處于一種混亂的狀態。Cell接口如下:public interface Cell {/*** The display that will be used for the exports.*/public String getExportDisplay(TableModel model, Column column);/*** The html that will be displayed in the table.*/public String getHtmlDisplay(TableModel model, Column column); }現在得到導出和html顯示存在明顯的區別。更重要的,需要返回字符串。列值和屬性值不再 需要設置。另一個細微的區別是:BaseModel已經被TableModel取代。這種改變是的不再需要一個 基礎包(base package),這意味著不再需要BaseModel。cell變為singleton不會導致使用復雜,如果你定義了任何類變量只需要把他們放到正確的 方法那么他們就能被任何其他方法使用。BaseCell被刪除因為不再需要添加任何值。替代的是AbstractCell,虛擬方法 getCellValue被用來返回cell的值。這種方法非常容易使用并不需要關心markup。查看 AbstractCell也是有意義的,你會發現這代碼實現的多么簡單。然而,很多時候需要做的僅僅是 實現Cell接口:DisplayCell:public class DisplayCell extends AbstractCell {public String getExportDisplay(TableModel model, Column column) {return column.getPropertyValueAsString();}protected String getCellValue(TableModel model, Column column) {return column.getValueAsString();} }AbstractCell:public abstract class AbstractCell implements Cell {public String getExportDisplay(TableModel model, Column column) {return getCellValue(model, column);}public String getHtmlDisplay(TableModel model, Column column) {HtmlBuilder html = new HtmlBuilder();CellBuilder.tdStart(html, column);CellBuilder.tdBody(html, getCellValue(model, column));CellBuilder.tdEnd(html);return html.toString();}/*** A convenience method to get the display value.*/protected abstract String getCellValue(TableModel model, Column column); }15.1.3. RowTagRowTag<ec:row> 現在被需要,它被用來替代columns。 現在看來它一直被需要。它不知道表中到底有多少列,最近重構的時候我通過 Table -> Row -> Column使結構固定來合并得到更好的靈活性。將來我可能提供更多的 特性,因為我知道eXtremeTable有著清晰的架構。典型的eXtremeTable如下:<ec:tableitems="presidents"var="pres"action="${pageContext.request.contextPath}/presidents.run"><ec:row><ec:column property="name"/><ec:column property="term"/></ec:row> </ec:table>15.1.4. AutoGenerateColumnsAutoGenerateColumns得到了很大的提高,現在你只需要設置你需要的屬性。 當你添加列到ColumnHandler使,defaults將別自動調用。AutoGenerateColumns為singleton并且不是線程安全的,因此不要定義任何類變量。現在它的實現可能如下:public class AutoGenerateColumnsImpl implements AutoGenerateColumns {public void addColumns(TableModel model) {Iterator iterator = columnsToAdd().iterator();while (iterator.hasNext()) {Map columnToAdd = (Map) iterator.next();Column column = new Column(model);column.setProperty((String) columnToAdd.get(PROPERTY));column.setCell((String) columnToAdd.get(CELL));model.getColumnHandler().addAutoGenerateColumn(column);}} }15.1.5. Extended AttributesaddExtendedAttributes方法重命名使得如何使用這個特性更清晰。 因此RowTag的addExtendedAttributes現在變為addRowAttributes,ColumnTag變 為addColumnAttributes,TableTag變為addTableAttributes,ExportTag變 為addExportAttributes。另外你參考正確的model bean(它的實現更清晰), 將知道如何添加屬性到你的cell、view.....使用ExportCsvTag的示例如下:public void addExportAttributes(Export export) {String view = export.getView();if (StringUtils.isBlank(view)) {export.setView(TableConstants.CSV);export.setImageName(TableConstants.CSV);}export.addAttribute(CsvView.DELIMITER, getDelimiter()); }為了得到delimiter屬性值你只需要從Export bean中get它:Export export = model.getExportHandler().getCurrentExport(); String delimiter = export.getAttributeAsString(DELIMITER);現在你需要在ExportTag中覆蓋它,你只需要調用setter方法。如果是新的屬性,那么使用 可以和前一版一樣使用addAttribute()方法。為了得到值,首先從ExportHandler得到Export, 然后調用需要的getter方法。這和使用其它tags一樣。在RowTag和ColumnTag中增加了兩個新的callback方法:modifyRowAttributes和 modifyColumnAttributes,因此你可以在rows/columns被處理時改變屬性值。 15.1.6. TableTag的collection屬性TableTag的collection屬性被刪除,現在變為三個新屬性:tableId、items和var。 因為我按照標準的JSTL命名,你應該能夠根據這些名稱知道他們的作用。tableId屬性 被用來作為表的唯一標識,items屬性用來表示從各種servlet的scopes里取得的集合, var屬性表示你將使用EL編寫腳本的名稱。依賴你的需要來決定如何使用新的屬性,tableId用來唯一標識表。如果你的頁面上只使用了 一個eXtremeTable并且不使用Limit特性,那么你根本不需要定義它。默認的表示名為'ec';如果使用 Limit特性你也可以使用'ec'這個名稱。然而,如果的一個JSP頁面上同時使用兩個eXtremeTables你就 需要使用tableId來唯一標識他們。var屬性被用來你將使用EL編寫腳本的名稱。items屬性用來表示從 各種servlet的scopes里取得的集合,而且現在非常健壯。你現在能nest集合到另外的對象,或者nest你想的 深度。取得集合的語法如下:<ec:table items="command.myObject.myCol" />本示例將從命令對象(command object)取得myCol集合。<ec:table items="myCol" />本示例中將根據名稱自動取得集合,就像以前版本的collection屬性一樣。 15.1.7. BaseModelBaseModel被重命名為TableModel,這是因為已經不需要一個基礎包(base package)了,這也 意味著不再需要BaseModel了。 15.1.8. Properties和ResourceBundleweb.xml文件中使用extremecomponentsPreferencesLocation屬性取代extremecomponentsPropertiesLocation屬性, properties現在被Preferences接口控制。在以后的版本,我將提供可選的xml文件配置。eXtremeTable不再默認在頂層類路徑(top level classpath)尋找 extremecomponents.properties文件。你應該在web.xml中使用設置context-param屬性的 值為extremecomponentsPreferencesLocation,這將更為通用。web.xml文件中使用extremecomponentsMessagesLocation屬性取代extremecomponentsResourceBundleLocation屬性, internationalization現在被Messages接口控制。Properties和ResourceBundle屬性根據table、row、column、export和filterare區分開。 在以前版本中每個屬性都以'table'開頭,現在每個屬性關聯到被使用的標簽。另外poperty不再需要使用奇怪的下劃線語法, 而是使用dot來強調。下面為properties文件的示例:table.imagePath=/extremesite/images/*.gif table.rowsDisplayed=12 column.parse.date=yyyy-MM-dd column.format.date=MM/dd/yyyy column.format.currency=$###,###,##0.00[英文的屬性文件示例如下:]statusbar.resultsFound={0} results found, displaying {1} to {2} statusbar.noResultsFound=There were no results found.toolbar.firstPageTooltip=First Page toolbar.lastPageTooltip=Last Page toolbar.prevPageTooltip=Previous Page toolbar.nextPageTooltip=Next Page toolbar.filterTooltip=Filter toolbar.clearTooltip=Cleartoolbar.clearText=Clear toolbar.firstPageText=First toolbar.lastPageText=Last toolbar.nextPageText=Next toolbar.prevPageText=Prev toolbar.filterText=Filtercolumn.headercell.sortTooltip=Sort Bycolumn.calc.total=Total column.calc.average=Average15.1.9. pageContextTableModel (以前的BaseModel)不再直接訪問pageContext,取而代之的是使用Context接口, 默認的被pageContext支持。直接訪問pageContext是一個不好的實現,Context提供你需要從不同servlet scopes中 取得需要屬性值的所有方法。然而,如果你需要直接訪問背后的對象,可以使用getContextObject()方法。 15.1.10. Limit和LimitFactoryLimit和LimitFactory現在都是接口,以前版本的實現不如我想象的簡單。然而, Limit對象的方法命名和以前版本的一樣,因此你以前的代碼也能很好的工作。我兩個Limit實現重構為一個,但是仍有兩個LimitFactory實現, 從coding的觀點用戶只要使用一個 實現,但是它必須兼容以前的版本。現在只有一個Limit實現我重命名為TableLimit。同時,因為Limit特性 依賴Context而不是request,我重命名工廠類(TableLimitFactory)來reflect它。Limit在導出時正確地顯示行信息,Limit具有一個isExported()方法。使用Limit和LimitFactory的示例如下:Context context = new HttpServletRequestContext(request); LimitFactory limitFactory = new TableLimitFactory(context, tableId); Limit limit = new TableLimit(limitFactory);設置row屬性,僅設置totalRows和默認的行顯示:limit.setRowAttributes(totalRows, DEFAULT_ROWS_DISPLAYED);RequestLimitFactory具有另一個如果沒有指定tableId將設置為ec的構造函數:Context context = new HttpServletRequestContext(request); LimitFactory limitFactory = new TableLimitFactory(context);15.1.11. TableTag的saveFilterSort屬性saveFilterSort屬性被state屬性取代,state屬性參照State接口并能插接不通的關于 如何保存表狀態的實現。State接口如下:public interface State {public void saveParameters(TableModel model, Map parameters);public Map getParameters(TableModel model); }表新增了兩個屬性:state和stateAttr。state屬性使用預設的四種 狀態(default、notifyToDefault、persist和notifyToPersist)之一, 你也可以插接自己的實現。default狀態不維持任何狀態;persist狀態沒有任何參數傳入,將一直維持表的狀態; notifyToDefault狀態將一直維持表的狀態直到你傳入參數告訴它回到default狀態;notifyToPersist狀態 將一直維持當前狀態直到你傳入參數告訴它維持persisted狀態。stateAttr為指定參數提供了一條途徑,你 也可以使用屬性文件在全局范圍內指定它。為了向后兼容,默認參數一直為useSessionFilterSort。如果你想state按照不同方式工作你只要實現State接口,然后使用TableTag的state屬性來指定實現類的 全路徑。 15.1.12. ColumnTag的showTotal屬性列新增了兩個屬性:calc和calcTitle:<ec:column property="data" calc="total" calcTitle="Total:" />calc屬性實現具有唯一方法的Calc接口:public interface Calc {public Number getCalcResult(TableModel model, Column column); }它傳入model和column,并返回一個Number型的值。默認的實現為總計和平均值。為了使用定制的Calc,只需要使用ColumnTag的calc屬性來指定實現Calc接口的實現類的 全路徑。Calc為singleton并且不是線程安全的,因此不要定義任何類變量。showTotal因為不再適用在新版中被刪除,我也刪除了表中的totalTitle。 15.1.13. Image名search圖片名從search變為filter。 15.1.14. FormTag / InputTag DeprecatedFormTag和InputTag現在為deprecated。他們在新的html視圖(view)中不再被使用。 15.1.15. RetrieveRowsCallbacks、FilterRowsCallback、SortRowsCallbackCallbacks為singleton并且不是線程安全的,因此不要定義任何類變量。 Chapter 16. Tag Attributes 16.1. TableTagTable 16.1. Name Description action The URI that will be called when the filter, sort and pagination is used. autoIncludeParameters Specify whether or not to automatically include the parameters, as hidden inputs, passed into the JSP. border The table border attribute. The default is 0. cellpadding The table cellpadding attribute. The default is 0. cellspacing The table cellspacing attribute. The default is 0. filterable Specify whether or not the table is filterable. Boolean value with the default being true. filterRowsCallback A fully qualified class name to a custom FilterRowsCallback implementation. Could also be a named type in the preferences. Used to filter the Collection of Beans or Collection of Maps. form The reference to a surrounding form element. imagePath The path to find the images. For example imagePath=/extremesite/images/*.png is saying look in the image directory for the .png images. intercept A fully qualified class name to a custom InterceptTable implementation. Could also be a named type in the preferences. Used to add table attributes. items Reference the collection that will be retrieved. locale The locale for this table. For example fr_FR is used for the French translation. method Used to invoke the table action using a POST or GET. onsubmit The javascript onsubmit action for the table. retrieveRowsCallback A fully qualified class name to a custom RetrieveRowsCallback implementation. Could also be a named type in the preferences. Used to retrieve the Collection of Beans or Collection of Maps. rowsDisplayed The number of rows to display in the table. scope The scope (page, request, session, or application) to find the Collection of beans or Collection of Maps defined by the collection attribute. showPagination Specify whether or not the table should use pagination. Boolean value with the default being true. showExports Specify whether or not the table should use the exports. Boolean value with the default being true. showStatusBar Specify whether or not the table should use the status bar. Boolean value with the default being true. showTooltips Specify whether or not to show the tooltips. Boolean value with the default being true. sortRowsCallback A fully qualified class name to a custom SortRowsCallback implementation. Could also be a named type in the preferences. Used to sort the Collection of Beans or Collection of Maps. sortable Specify whether or not the table is sortable. Boolean value with the default being true. state The table state to use when returning to a table. Acceptable values are default, notifyToDefault, persist, notifyToPersist. stateAttr The table attribute used to invoke the state change of the table. style The css inline style sheet. styleClass The css class style sheet. tableId The unique identifier for the table. theme The theme to style the table. The default is eXtremeTable. title The title of the table. The title will display above the table. var The name of the variable to hold the current row bean. view Generates the output. The default is the HtmlView to generate the HTML. Also used by the exports to generate XLS-FO, POI, and CSV. width Width of the table. 16.2. RowTagTable 16.2. Name Description highlightClass The css class style sheet when highlighting rows. highlightRow Used to turn the highlight feature on and off. Acceptable values are true or false. The default is false. intercept A fully qualified class name to a custom InterceptRow implementation. Could also be a named type in the preferences. Used to add or modify row attributes. onclick The javascript onclick action onmouseout The javascript onmouseout action onmouseover The javascript onmouseover action style The css inline style sheet. styleClass The css class style sheet. 16.3. ColumnTagTable 16.3. Name Description alias Used to uniquely identify the column when the same property is used for more than one column. calc A fully qualified class name to a custom Calc implementation. Could also be a named type in the preferences. Used to do math on a column. calcTitle The title of the calc. cell Display for the column. The valid values are display, currency, rowCount, and date. The default value is display. The cell can also be a fully qualified class name to a custom Cell. Be sure to implement the Cell interface or extend AbstractCell if making a custom cell. escapeAutoFormat Specify whether auto format of value will be skipped. False by default, and is only effective if autoformatting is implement in the view. filterable Specify whether or not the column should be filterable. Acceptable values are true or false. The default is to use the value for the table filterable attribute. filterCell Displays the filter column. The valid values are filter and droplist. The default is filter. The cell can also be a fully qualified class name to a custom cell. filterClass The css class style sheet used to define what the table filter column looks like. filterStyle The css class style sheet to use for the filter column. format The format to use for the cell. For instance if used with a date cell then the format can be MM/dd/yyyy. headerCell Display for the header column. The default is header. The cell can also be a fully qualified class name to a custom cell. headerClass The css class style sheet used to define what the table header column looks like. headerStyle The css class style sheet to use for the header column. intercept A fully qualified class name to a custom InterceptColumn implementation. Could also be a named type in the preferences. Used to add or modify column attributes. parse Used if the format needs to be interpreted. For instance, a date needs to be parsed in the specific format, such as MM-dd-yyyy. property The bean attribute to use for the column. sortable Specify whether or not the column should be sortable. The acceptable values are true or false. The default is to use the value for the table sortable attribute. style The css inline style sheet. styleClass The css class style sheet. title The display for the table column header. If the title is not specified then it will default to the name of the property, changing the camelcase syntax to separate words. value The value for the column. If the value attribute is not specifed then it will be retrieved automatically using the property attribute. The value can also be defined within the column body. viewsAllowed The comma separated list of views that this column will be used in. viewsDenied The comma separated list of views that this column will not be used in. width Specify the column width. 16.4. ExportTagTable 16.4. Name Description fileName The name of the export file. imageName The image name. intercept A fully qualified class name to a custom InterceptExport implementation. Could also be a named type in the preferences. Used to add or modify export attributes. view A fully qualified class name to a custom View implementation. Could also be a named type in the preferences. Default types are pdf, xls, or csv. viewResolver A fully qualified class name to a custom ViewResolver implementation. Could also be a named type in the preferences. Default types are pdf, xls, or csv. text The text for the export view. tooltip The tooltip that shows up when you mouseover the export image. 16.5. ExportXlsTagTable 16.5. Name Description fileName The name of the export file. imageName The image name. intercept A fully qualified class name to a custom InterceptExport implementation. Could also be a named type in the preferences. Used to add or modify export attributes. view A fully qualified class name to a custom View implementation. Could also be a named type in the preferences. Default types are pdf, xls, or csv. viewResolver A fully qualified class name to a custom ViewResolver implementation. Could also be a named type in the preferences. Default types are pdf, xls, or csv. text The text for the export view. tooltip The tooltip that shows up when you mouseover the export image. 16.6. ExportCsvTagTable 16.6. Name Description delimiter What to use as the file delimiter. The default is a comma. fileName The name of the export file. imageName The image name. intercept A fully qualified class name to a custom InterceptExport implementation. Could also be a named type in the preferences. Used to add or modify export attributes. view A fully qualified class name to a custom View implementation. Could also be a named type in the preferences. Default types are pdf, xls, or csv. viewResolver A fully qualified class name to a custom ViewResolver implementation. Could also be a named type in the preferences. Default types are pdf, xls, or csv. text The text for the export view. tooltip The tooltip that shows up when you mouseover the export image. 16.7. ExportPdfTagTable 16.7. Name Description headerBackgroundColor The background color on the header column. headerColor The font color for the header column. headerTitle The title displayed at the top of the page. fileName The name of the export file. imageName The image name. intercept A fully qualified class name to a custom InterceptExport implementation. Could also be a named type in the preferences. Used to add or modify export attributes. view A fully qualified class name to a custom View implementation. Could also be a named type in the preferences. Default types are pdf, xls, or csv. viewResolver A fully qualified class name to a custom ViewResolver implementation. Could also be a named type in the preferences. Default types are pdf, xls, or csv. text The text for the export view. tooltip The tooltip that shows up when you mouseover the export image. 16.8. ColumnsTagTable 16.8. Name Description autoGenerateColumns A fully qualified class name to a custom AutoGenerateColumns implementation. Could also be a named type in the preferences. Used to generate columns on the fly. 16.9. ParameterTag

總結

以上是生活随笔為你收集整理的eXtremeComponents 使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

深爱开心激情网 | 色综合中文字幕 | 91人人射 | 色婷婷色 | 免费看一及片 | avove黑丝| 欧美专区国产专区 | 日日干夜夜草 | 一区二区三区精品在线 | 午夜免费视频网站 | 免费的黄色av | 黄色网址av| 一本—道久久a久久精品蜜桃 | 热久在线| 婷婷伊人五月 | 色午夜| 亚洲视频精选 | 一级国产视频 | 久久久男人的天堂 | 一区二区在线不卡 | 亚洲黄色免费在线 | 亚洲欧洲av在线 | 最近中文字幕在线 | 色偷偷88888欧美精品久久 | 麻豆传媒在线免费看 | 丁香5月婷婷 | 免费视频久久久久久久 | 亚洲影音先锋 | 中国成人一区 | 免费看成人片 | 久久国内精品 | 欧美与欧洲交xxxx免费观看 | 一区 二区 精品 | 亚洲最大在线视频 | 日韩在线观看第一页 | 国产99在线播放 | 天天av在线播放 | 精品一区二区在线免费观看 | 美女网站色免费 | 亚洲精品乱码久久久久v最新版 | 亚洲成av人影院 | 91精品久久久久久综合乱菊 | 九九视频精品免费 | 最新久久久 | 91高清免费在线观看 | 国产精品美女久久久久久2018 | 日本精品久久久久中文字幕5 | 国产日韩在线播放 | 久久欧美视频 | 不卡av在线免费观看 | 免费在线观看成人av | 涩涩网站在线看 | 国产精品中文字幕在线播放 | 揉bbb玩bbb少妇bbb | 91av手机在线 | 午夜黄网 | 最新久久免费视频 | 色婷婷激情 | 婷婷亚洲最大 | 日韩特级黄色片 | 在线免费色 | 激情综合站 | 日韩激情视频 | 福利网在线 | 久久精品视频3 | 午夜精品电影 | 色婷婷午夜 | 久久www免费视频 | 免费高清无人区完整版 | 中国一级片免费看 | 国产69精品久久99不卡的观看体验 | 天天色天天操综合网 | 91麻豆精品91久久久久同性 | 免费看的黄网站 | 91黄视频在线观看 | 丁香激情视频 | 欧亚日韩精品一区二区在线 | 久久夜色精品国产欧美一区麻豆 | 99精品视频免费在线观看 | 免费看片网站91 | 在线免费色视频 | 99精品视频免费看 | 亚洲日韩中文字幕 | 狠狠色狠狠色综合日日92 | 亚洲一区视频在线播放 | www免费视频com━ | 成年人在线观看网站 | 国产精品自产拍在线观看蜜 | 国产裸体视频bbbbb | 欧美日韩后 | 日韩网站在线 | 香蕉在线视频播放网站 | 热久久99这里有精品 | 91黄色免费看 | 国产一区二区免费 | 区一区二在线 | 亚洲区另类春色综合小说校园片 | 国产91免费看 | 丝袜美腿在线播放 | 国产精品久久久久久久久久白浆 | 精品欧美一区二区三区久久久 | 51久久夜色精品国产麻豆 | 五月天亚洲精品 | 久久久这里有精品 | 色五月色开心色婷婷色丁香 | 欧美日韩精品国产 | 久久尤物电影视频在线观看 | 久久精品99视频 | 婷婷色综合色 | 天天操天天色天天 | 亚洲精品久久久久999中文字幕 | 五月婷婷中文 | 国产手机视频在线 | 综合视频在线 | 免费黄色在线播放 | 国产午夜精品一区二区三区四区 | 国内精品久久久久影院优 | 亚洲国产无 | 欧美性久久久久久 | 日本久久久久久久久久 | 麻豆视频一区 | 日韩99热| 欧美性色黄大片在线观看 | 久久99国产精品久久99 | 日韩三级中文字幕 | 欧美日产在线观看 | 亚洲午夜小视频 | 欧美亚洲xxx | 91完整版在线观看 | 久久久久久久久久久网 | 免费在线观看黄网站 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产精品自在欧美一区 | av夜夜操 | 亚洲免费黄色 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 成人一级黄色片 | 丁香色婷| 国产精品久久久av | 精品一区二区三区四区在线 | 国产精品永久久久久久久www | 99久久精品免费看国产免费软件 | 国产精品第一页在线观看 | 一区二区三区免费在线观看视频 | 911香蕉 | 国产精品区二区三区日本 | 国产精品视频永久免费播放 | 久久精品一 | 日韩网站在线观看 | 一性一交视频 | 成年人免费看 | 91香蕉视频在线下载 | 久久免费看 | 天天搞夜夜骑 | 国产精品一区二区久久 | 国产在线观看av | 欧美一二三区在线播放 | 中文字幕亚洲在线观看 | 超碰在线97国产 | 天天综合网天天综合色 | 在线精品视频免费播放 | 人人dvd| 久久免费a | 在线免费日韩 | 亚洲精品男女 | 亚洲乱亚洲乱亚洲 | 免费看的黄色网 | 国产精品亚洲视频 | 欧美看片| 国产分类视频 | 国产精品一区二区三区四区在线观看 | 日批视频在线观看免费 | 97电影手机 | 在线免费试看 | 国内精品久久久久影院一蜜桃 | 97香蕉久久国产在线观看 | 最新在线你懂的 | 久久96国产精品久久99漫画 | 亚洲韩国一区二区三区 | 国产精品久久久久av免费 | 免费在线观看成人 | 国产婷婷vvvv激情久 | 韩国一区二区三区在线观看 | 91综合色 | 99re久久资源最新地址 | 91精品视频一区二区三区 | 伊人狠狠操 | 亚洲成人国产精品 | 国产精品免费看久久久8精臀av | 国语精品久久 | 综合黄色网 | 久久激情婷婷 | 欧美一区二区三区在线视频观看 | 美女久久久 | 中文字幕中文字幕中文字幕 | 久久久www成人免费毛片麻豆 | 久久精品男人的天堂 | 中文字幕亚洲字幕 | 国产精品一区二区久久国产 | 亚洲国产精品99久久久久久久久 | 最近中文字幕在线中文高清版 | 麻豆极品 | 国产精品手机在线 | avlulu久久精品 | 丝袜av网站 | 天堂网一区| 国产视频日韩视频欧美视频 | 久久综合色婷婷 | 亚洲精品免费播放 | 久久国产电影院 | 狠狠色丁香婷婷综合 | 精品亚洲免a | 国产精品视频app | 欧美日韩xx| 亚洲国产中文在线观看 | 成人在线观看日韩 | 久久精品欧美一区 | 成人免费视频在线观看 | 国产精品久久久久久久久久白浆 | 国产分类视频 | 黄色在线成人 | 顶级欧美色妇4khd | 亚洲欧美日韩国产一区二区三区 | 天天躁日日躁狠狠躁av麻豆 | 很黄很黄的网站免费的 | 午夜精品一区二区三区在线播放 | 丁香久久激情 | 国产精品第十页 | www.色午夜.com| 欧美91成人网 | 国产在线国偷精品产拍 | 亚洲欧洲精品一区 | 欧美日韩国产在线一区 | 欧美做受高潮 | 精品伦理一区二区三区 | 免费久久精品视频 | 婷婷久久精品 | 色婷婷色| 美女视频久久黄 | www.黄色片.com| 在线观看免费黄视频 | 黄色三级久久 | 超级碰碰碰碰 | 国产aaa大片 | 91字幕 | 91精品天码美女少妇 | 91av电影在线 | 欧美色图另类 | 国产精品精品国产色婷婷 | 久草在线中文888 | 国产午夜精品av一区二区 | 国产精品毛片完整版 | 亚洲最新精品 | 99精品视频在线观看播放 | 日韩免费三区 | 高清一区二区三区 | 久久精品99国产 | 伊人影院av | 麻豆免费视频 | a电影免费看 | 国产精品一区二区三区观看 | 超碰人人舔 | 五月天久久久久久 | 狠狠88综合久久久久综合网 | 久久观看免费视频 | 日韩高清观看 | 日韩特黄一级欧美毛片特黄 | va视频在线观看 | 国产精品私人影院 | 欧美另类z0zx | 女人高潮特级毛片 | 99这里有精品 | 日韩精品在线一区 | 成人电影毛片 | 久久96国产精品久久99软件 | 亚洲免费在线观看视频 | 一区二区不卡 | 欧美成人黄色片 | 99久久99久久精品国产片果冰 | 成人91免费视频 | 在线观看免费91 | 色婷婷导航 | 91毛片在线观看 | 日批在线看 | 国产精品18久久久久久vr | 亚洲综合日韩在线 | 久草在线久草在线2 | 日韩电影在线视频 | 亚洲 中文字幕av | 成人av视屏 | 欧美在线视频一区二区三区 | 国产麻豆电影 | 久久69av | 午夜精品久久久久久久久久久 | 在线视频观看91 | 天天射天天操天天干 | 久久久久久国产精品亚洲78 | 久久a国产 | www.狠狠操 | 欧美日韩国产亚洲乱码字幕 | 国产一级二级在线 | 日本中文字幕网站 | 亚洲激情六月 | 久久精品之 | 菠萝菠萝蜜在线播放 | 久久综合精品国产一区二区三区 | 伊人网av | 天海冀一区二区三区 | 激情一区二区三区欧美 | 天天操人人要 | 日韩3区 | 免费在线观看视频一区 | 国产日产欧美在线观看 | 久久久久久久看片 | 午夜精品一区二区三区在线视频 | 日韩激情网 | 婷婷天天色| 国产午夜不卡 | 国产精品久久久久久99 | 成人在线一区二区三区 | www日| 国产精品不卡av | 日日碰狠狠躁久久躁综合网 | 国产91在线播放 | 91九色在线视频 | 免费h视频 | 国产精品v a免费视频 | 久久久久观看 | 日韩视频中文字幕在线观看 | 国产精品一区专区欧美日韩 | 在线观看爱爱视频 | 少妇超碰在线 | aaaaaa毛片| 久久艹欧美 | 欧美一级久久久 | 免费视频成人 | 欧美日韩国产精品一区二区亚洲 | 久草免费手机视频 | 91最新中文字幕 | 日日干 天天干 | 五月婷婷色综合 | 日韩三级中文字幕 | 色综合天天综合在线视频 | 免费a网址 | 国产精品刺激对白麻豆99 | 国产破处精品 | 中文字幕美女免费在线 | 久久无码av一区二区三区电影网 | 国产精品久久久久久影院 | 国产精品男女视频 | 国产精品久久久久影院 | 久久久亚洲精华液 | 久久久久久久久影院 | 色视频在线看 | 日产乱码一二三区别在线 | 久久在线电影 | 久久99亚洲精品 | 91最新在线观看 | 日韩欧美在线第一页 | 成人午夜电影在线 | 在线免费黄色 | 国内成人综合 | 日韩一区二区三区视频在线 | 久久久久久久免费看 | 日本精品视频在线播放 | av网站手机在线观看 | 狠狠色狠狠色综合系列 | 亚洲亚洲精品在线观看 | 欧美在线你懂的 | 国产视频黄 | 日韩网站一区 | 欧美成人69av| 激情五月婷婷 | 久久图 | 91亚洲狠狠婷婷综合久久久 | 欧美黄色特级片 | 日韩精品欧美专区 | 亚洲精品视频网址 | 精品视频久久久 | 精品视频在线免费观看 | 黄色片网站大全 | 久久看片网站 | 国产精品永久免费在线 | 亚洲精品视频在线播放 | 国产99久久精品一区二区300 | 美女网站色在线观看 | 亚洲六月丁香色婷婷综合久久 | 五月综合久久 | 久久成人精品电影 | freejavvideo日本免费 | 国产精品久久久久久久久久三级 | 国产综合久久 | 91一区啪爱嗯打偷拍欧美 | 亚洲精品黄色片 | 欧美极品久久 | 亚洲国产中文字幕 | 国产精品99久久久久久久久久久久 | 亚洲视频每日更新 | 久久久久久综合 | www.久久久.cum| 国产老妇av| 亚洲激情在线观看 | 欧美一区二视频在线免费观看 | 国产在线a| 国产网站av| 国产视频97 | 精油按摩av | 国产免费片 | av免费网站 | 久久人人爽爽人人爽人人片av | 最新免费中文字幕 | 欧美一级黄大片 | 天天操天天吃 | 91精品啪在线观看国产81旧版 | 久久夜夜夜 | 亚洲精品国产免费 | 成人在线免费视频 | 99精品视频在线播放免费 | 五月婷婷色丁香 | 久久视影| 91视频电影| 伊人永久在线 | 国产免费一区二区三区最新 | 国产精品久久久久久久久久久杏吧 | 在线观看av麻豆 | 91精品一 | 韩日电影在线观看 | 婷婷综合久久 | 丁香综合 | 韩国一区二区三区视频 | 久久免费视频1 | 色在线视频 | 人人要人人澡人人爽人人dvd | 91精品国产乱码在线观看 | 精品久久久久久久久久久院品网 | 亚洲精品国产综合99久久夜夜嗨 | 91免费的视频在线播放 | 久久老司机精品视频 | 国产日韩欧美视频在线观看 | 狠狠色丁香 | 久久婷婷综合激情 | 中午字幕在线观看 | 久草在线视频精品 | 亚洲精品在线观看视频 | 天天玩天天操天天射 | 国产精品第一页在线观看 | 一级黄色网址 | 日韩高清激情 | 丁香婷婷色综合亚洲电影 | 国产传媒一区在线 | 五月天电影免费在线观看一区 | 亚州精品在线视频 | 嫩嫩影院理论片 | 成人 亚洲 欧美 | 久久亚洲日本 | 亚洲精品免费在线观看 | 久久精品看片 | 夜又临在线观看 | 97精品国自产拍在线观看 | 国产97视频 | 色婷婷a | 天堂av官网 | 成 人 免费 黄 色 视频 | 国产18精品乱码免费看 | 在线日韩视频 | 国产精品a久久 | 91色在线观看视频 | 福利二区视频 | 日韩综合精品 | 92精品国产成人观看免费 | 欧美午夜视频在线 | 99久久久久久 | 四虎国产永久在线精品 | 24小时日本在线www免费的 | 久久国产精品影片 | 国产特级毛片aaaaaa毛片 | 天天摸天天干天天操天天射 | 天天色棕合合合合合合 | 日韩av电影免费在线观看 | 91电影福利 | 免费视频久久久久久久 | 青春草免费在线视频 | 女人18精品一区二区三区 | 欧美日韩国产精品久久 | 91成人天堂久久成人 | 国产黄色片在线 | 日本三级在线观看中文字 | 国产精品网红福利 | 久久久毛片 | 奇米影视四色8888 | 一区二区三区中文字幕在线观看 | 免费av网站在线看 | 国外成人在线视频网站 | 在线观看精品国产 | 久久久久99精品成人片三人毛片 | 最新av免费在线观看 | 麻豆免费视频网站 | 91禁在线看 | 国产精品一区二区中文字幕 | 午夜12点| 日韩精品最新在线观看 | 午夜成人影视 | 日本99精品 | 亚洲片在线资源 | 亚洲精品视频在 | 99久久精品国产观看 | 亚洲国产网站 | 午夜av一区| 日韩伦理片hd | 玖玖精品在线 | 最新av中文字幕 | 美女久久视频 | 正在播放 久久 | 精品一区二区在线免费观看 | 午夜精品久久久久久久99 | 美女网站在线观看 | 欧美日韩精品综合 | av不卡在线看 | 国产综合香蕉五月婷在线 | 2019天天干天天色 | 黄色小说网站在线 | 日日夜夜婷婷 | 国产成人av网址 | 国产视频一区二区在线 | 久久激情五月丁香伊人 | 欧美精品做受xxx性少妇 | 99精品在线 | 中文字幕.av.在线 | 伊人激情网 | 欧洲黄色片 | 91精品国自产在线 | 色在线免费 | 综合伊人av | 手机色在线 | 欧美日韩视频精品 | 四虎影视成人永久免费观看视频 | 精品婷婷 | 国产一区二区高清视频 | 久久精品高清 | 亚洲国产成人久久 | 欧美国产一区在线 | 国产精品久久久久久久99 | 黄色片免费电影 | 啪啪免费观看网站 | 波多野结衣在线中文字幕 | 亚洲一区视频在线播放 | 日日夜夜天天综合 | 久久精品一二区 | 日韩欧美一区视频 | 中文字幕在线播放日韩 | 日韩一区二区三免费高清在线观看 | 激情久久久久 | 免费在线视频一区二区 | 免费观看丰满少妇做爰 | 黄色片网站免费 | 欧美久久九九 | 激情视频一区二区 | 亚洲欧洲在线视频 | 精品久久国产精品 | 中文av在线免费观看 | 国产亚洲综合在线 | 欧美亚洲国产日韩 | 亚洲aⅴ免费在线观看 | 国产剧情一区二区 | 九九热在线播放 | 成人免费在线观看av | 久久图 | 91网址在线| 777奇米四色 | 国产精品视频app | 天天鲁一鲁摸一摸爽一爽 | 亚洲精品久久久久中文字幕二区 | 婷婷精品国产欧美精品亚洲人人爽 | 国产a国产| 日韩欧美精品在线 | 91日韩精品一区 | 久久婷婷五月综合色丁香 | 欧美激情亚洲综合 | 亚洲码国产日韩欧美高潮在线播放 | 菠萝菠萝蜜在线播放 | 久久精选视频 | 久久综合婷婷国产二区高清 | 欧美日韩另类在线观看 | 亚洲黄色成人 | 亚洲欧洲成人精品av97 | 91免费看黄色 | 久久国内视频 | 91人人爽久久涩噜噜噜 | 国产偷在线| 亚洲免费在线观看视频 | 在线不卡中文字幕播放 | 国产小视频在线免费观看 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 欧美一区二区日韩一区二区 | 在线观看韩国av | 亚洲欧洲日韩在线观看 | 中文字幕电影网 | 高清一区二区三区av | 99久热在线精品视频观看 | 婷婷久久五月天 | 一级黄色片在线免费观看 | 亚洲美女精品区人人人人 | 国产精品久久久久久久av大片 | 91精品推荐 | 国产原厂视频在线观看 | 日本69hd| 欧美精品免费在线观看 | 国产成人在线看 | 一区二区三区高清不卡 | 在线国产黄色 | 国产成人精品免高潮在线观看 | 99精品在线视频播放 | 午夜在线免费视频 | 久久久久久久网 | 色综合久久88色综合天天6 | 夜又临在线观看 | 一区二区欧美日韩 | 日韩欧美精品一区二区 | 69视频在线播放 | 成年人电影免费在线观看 | 韩日电影在线观看 | 六月激情网 | 黄色资源在线观看 | 亚洲精品免费在线观看 | 日本精品视频在线观看 | 91视频高清 | 麻豆网站免费观看 | 久久草在线视频国产 | 韩日精品在线 | 毛片在线播放网址 | 美女精品久久久 | 日韩精品首页 | 天天舔天天搞 | 狠狠狠狠狠色综合 | 天天色综合三 | 91精品1区2区| 日日爱夜夜爱 | 精品xxx| 婷婷成人综合 | 欧美日韩3p| av网在线观看 | 亚洲国产三级在线观看 | 中文字幕一区二区三区久久 | 欧美 日韩 性 | 久久蜜桃av | 欧美 激情 国产 91 在线 | 一级免费观看 | av黄色av| 国产免费不卡 | 91传媒激情理伦片 | 天堂网av 在线 | 国产精品一区在线 | 中国美女一级看片 | 国产高清不卡在线 | 亚洲最大成人免费网站 | 久久久久久久久久毛片 | 国产免费观看高清完整版 | 日本不卡视频 | 日韩精品一区二区在线视频 | 99久e精品热线免费 99国产精品久久久久久久久久 | 午夜久久福利影院 | 视频成人免费 | 欧美一区二区在线 | 91日韩精品 | 久久久久久久久综合 | 爱射综合 | 人人插人人草 | 亚洲一级黄色大片 | 久久午夜网 | 午夜精品视频免费在线观看 | 国产一区二区高清不卡 | 久久日本视频 | 狠狠色伊人亚洲综合网站色 | 久久久久久毛片精品免费不卡 | a黄色一级| 亚洲在线高清 | 五月天婷亚洲天综合网鲁鲁鲁 | av电影中文字幕在线观看 | 国产精品久久久电影 | 伊人资源视频在线 | 免费91在线观看 | 国产精品久久久久久久久免费 | 人人澡人人澡人人 | 丁香伊人网 | 国产韩国精品一区二区三区 | 人人干人人干人人干 | 黄色片网站大全 | 96av视频| 久热爱| 91九色成人蝌蚪首页 | 日本中出在线观看 | 久久久精品在线观看 | 特级aaa毛片 | 欧美激情精品久久久久久 | 99久久精品久久久久久清纯 | 久久99热精品这里久久精品 | 亚洲国产wwwccc36天堂 | av免费黄色 | 色婷婷一| 免费成人看片 | 99久久精品国产欧美主题曲 | 99精品99| 九九热1 | 国产一区二区三区免费在线观看 | 天天爽综合网 | 99精品欧美一区二区三区 | 国产精品va | 黄免费在线观看 | 国产亚洲高清视频 | 久久xx视频 | 亚洲另类视频 | 黄色亚洲在线 | 99久久精品国产一区二区三区 | 91精品视频网站 | 久久不射网站 | av在线看片 | av观看在线观看 | 在线观看视频一区二区三区 | 欧美狠狠色 | 国产一区私人高清影院 | 亚洲精品456在线播放 | 五月婷久久 | 福利视频精品 | 最近字幕在线观看第一季 | 国产女人18毛片水真多18精品 | 日本精品视频免费观看 | 在线播放 一区 | 久久久久久久电影 | 99精品国产兔费观看久久99 | 丁香五月缴情综合网 | 天天爽人人爽 | 久草在线视频网站 | 在线观看爱爱视频 | 在线播放日韩av | 国产69久久久 | 日韩精品中文字幕久久臀 | 日韩视频免费在线观看 | av高清在线 | 国产精品成人自产拍在线观看 | 韩日电影在线免费看 | 亚洲精品乱码久久久久v最新版 | 九九视频这里只有精品 | 天天操天天草 | 久久精品中文视频 | 一本一道久久a久久综合蜜桃 | 97碰视频| 伊人久在线 | 91精品国产91久久久久福利 | 国产黄在线 | 中文字幕国产一区二区 | 正在播放久久 | 在线观看香蕉视频 | 欧美日韩伦理在线 | 中文国产字幕 | 久操中文字幕在线观看 | 亚洲理论在线 | 在线精品一区二区 | 在线日本看片免费人成视久网 | 国产精品mv | 亚洲一二三在线 | 亚洲一级二级三级 | 麻豆传媒视频在线免费观看 | 高清视频一区 | 96亚洲精品久久 | 一区二区三区免费在线观看视频 | 成人国产精品免费观看 | 午夜av剧场| 久久综合丁香 | 国产高清福利在线 | 亚洲免费永久精品国产 | 中文av影院 | www.色五月.com | 狠狠色丁香婷婷综合最新地址 | 国产五十路毛片 | 国产成人免费网站 | 狠狠操91| 97色婷婷人人爽人人 | 久久影视一区二区 | 国产精品综合久久久久久 | 黄色影院在线播放 | 99国产精品免费网站 | 色狠狠综合天天综合综合 | 久久免费在线观看 | 久久夜靖品 | 日韩色中色| 手机在线看永久av片免费 | 97在线观看视频免费 | 国产黄色一级大片 | 97在线播放 | 成人在线观看资源 | 亚洲精品国产精品久久99 | 麻豆一级视频 | 亚洲精品福利在线 | www操操操 | 激情丁香久久 | 日韩电影中文 | 久久亚洲人 | 精品一区久久 | www黄在线 | 韩国一区视频 | 国产一区二区三区免费观看视频 | 中文字幕一区二区三区精华液 | 最新中文在线视频 | 久久一区二区三区国产精品 | 色吧久久 | 69久久夜色精品国产69 | av综合av| 免费一级片观看 | 国产精品一区二区av影院萌芽 | 五月综合色 | 久久综合之合合综合久久 | 中文成人字幕 | 国产精品久久久久久久久毛片 | 可以免费看av | av中文在线影视 | 国产一区欧美在线 | 人人干,人人爽 | 中文字幕不卡在线88 | 韩日精品在线观看 | 免费开视频 | 一区二区三区在线影院 | 国产精品亚洲精品 | 国产成人一区二区三区久久精品 | 一区二区三区国产精品 | 欧美日韩性 | 婷婷日 | 黄色毛片视频免费 | 精品久久久久久亚洲综合网站 | 精品国产一区二区三区噜噜噜 | 最新国产中文字幕 | 久久精品资源 | 色综合网| 国产区 在线 | 日韩精品视频免费专区在线播放 | 久草在线观看 | 午夜精品久久久久99热app | 久久久免费精品视频 | 亚洲综合激情小说 | 婷婷六月天综合 | 欧美一区二区免费在线观看 | 午夜影院一区 | 色偷偷888欧美精品久久久 | 4438全国亚洲精品在线观看视频 | 黄色在线免费观看网站 | 亚洲精品系列 | 91视频在线观看免费 | 久久综合五月天 | 亚洲,国产成人av | 亚洲精品一区二区三区在线观看 | 精品在线亚洲视频 | 欧美性网站| 黄色小说18 | 伊人激情网 | 婷婷六月天综合 | 麻豆视频91 | 中文字幕在线观看视频一区二区三区 | 在线观看va | 久久好看免费视频 | av专区在线 | 激情 婷婷| 国产精品久久久久久电影 | ,午夜性刺激免费看视频 | 97在线观视频免费观看 | 国产自产在线视频 | 97免费公开视频 | 成人在线视频在线观看 | 久久久久久久久久久电影 | 亚洲国产欧美一区二区三区丁香婷 | 在线中文字幕播放 | 99久久久久久| 欧美精品一级视频 | 国产成人免费高清 | 粉嫩av一区二区三区四区在线观看 | 免费在线播放av电影 | 成人在线视频一区 | 成+人+色综合 | 日本不卡视频 | 婷婷精品国产一区二区三区日韩 | 日韩欧美在线中文字幕 | 在线观看色网 | 久视频在线播放 | 久久国产精品久久精品国产演员表 | 一本一本久久a久久精品综合小说 | 中日韩三级视频 | www.黄色片.com | 国产视频一区在线免费观看 | aaaaaa毛片| 久久狠狠干 | 91高清不卡| 91超碰免费在线 | 久久手机在线视频 | 午夜精品久久久久久久久久久久久久 | 五月婷婷另类国产 | 亚洲欧美日韩一二三区 | 国产v在线 | 中文字幕观看av | 国产剧情在线一区 | 久久国产精品一区二区三区 | 一区二区三区日韩精品 | 成人免费影院 | 天天操综合 | 久久久久国产精品厨房 | 亚洲精品国产免费 | 99热精品视 | 日韩久久激情 | 久久久久久久久久亚洲精品 | 久久影视中文字幕 | 狠狠的干狠狠的操 | 日韩精品中文字幕av | 精品你懂的 | 婷婷色在线 | 色是在线视频 | 日韩在线中文字幕 | 久久久久亚洲天堂 | 国产一二区在线观看 | 欧美精品久久久久久久久久 | 99久久精品国产一区二区三区 | 五月婷婷中文字幕 | 国产精品成人久久久久久久 | 超碰97中文| 久久免费视频网 | 一级性视频 | 亚洲精品影院在线观看 | 3d黄动漫免费看 | 欧美日韩调教 | 综合久色| 久久久精品欧美 | 国产不卡在线看 | 日韩高清片| 超碰人人草人人 | 天天摸天天舔天天操 | 免费日韩电影 | 久久99久久99精品免费看小说 | 在线亚洲人成电影网站色www | 欧美日韩在线免费视频 | 国产精品毛片一区二区三区 | 在线观看免费高清视频大全追剧 | 日韩视频一区二区 | 亚洲婷婷综合色高清在线 | 狠狠干综合 | 激情综合网天天干 | 99精品国产在热久久下载 | 日日精品 | 亚洲午夜精品一区二区三区电影院 | 亚洲欧美日韩一区二区三区在线观看 | 国产黄色高清 | 久久久久成 | 4438全国亚洲精品观看视频 | 人人爽人人乐 | 国内精品久久久久久久影视麻豆 | 黄色电影在线免费观看 | 国产v亚洲v| 久久人人爽| 日韩成人精品一区二区 | 西西444www大胆高清视频 | 国产小视频在线免费观看 | 国产一级在线视频 | 国产精品大片免费观看 | 日韩av在线小说 | 99热在线精品观看 | 国产亚洲免费的视频看 | 五月婷婷六月丁香在线观看 | 99riav1国产精品视频 | av一本久道久久波多野结衣 | 在线观看视频国产一区 | 久久黄色美女 | 精品久久福利 | 狠狠躁18三区二区一区ai明星 | 天天干天天干 | av在线之家电影网站 | 国产又黄又猛又粗 | 欧美 国产 视频 | 伊人久久av| 精品久久久久久久久久久久久久久久 | 日韩欧美在线综合网 | 亚洲精品资源在线观看 | 国产中文自拍 | 四虎免费在线观看视频 | 青青草华人在线视频 | 黄网站色 | 久久精品一 | 久久电影国产免费久久电影 | 成人午夜电影在线 | 国产成人91 | 久草在线观看资源 | 国产伦精品一区二区三区无广告 | 日本精品视频网站 | 国产一级片观看 | 中文字幕在线资源 | 国产精品av在线免费观看 | 久久成人高清视频 | 久久久综合电影 | 国产中文字幕在线看 | 久草久草在线 | 午夜影视一区 | 波多野结衣精品视频 | 国产黄色成人 | 亚洲精品美女久久 |