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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

eXtremeComponents文档

發布時間:2024/8/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 eXtremeComponents文档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.blogjava.net/lucky/archive/2010/01/19/33380.html

?

前言

1. 配置 1.1. 先決條件 1.2. 安裝 1.3. 導出過濾器(可選) 1.4. 安裝測試2. 概述 2.1. 引言3. TableTag 3.1. 引言 3.2. 顯示圖片 3.3. 過濾、排序和動作(Action) 3.4. 設定每頁顯示行數 3.5. 樣式 3.6. 保存表的狀態 3.7. 其他屬性 3.8. 擴展屬性4. RowTag 4.1. 引言 4.2. 高亮顯示行 4.3. 樣式 4.4. Javascript屬性 4.5. 擴展屬性5. ColumnTag 5.1. 引言 5.2. Cell 5.3. Filter Cell 5.4. Header Cell 5.5. 樣式 5.6. 解析和格式化 5.7. 過濾和排序 5.8. Calc 5.9. 允許和不允許視圖 5.10. 其他屬性 5.11. 擴展屬性6. ParameterTag 6.1. 引言7. ExportTag 7.1. 引言 7.2. 擴展屬性8. Callbacks 8.1. 引言 8.2. RetrieveRowsCallback 8.3. FilterRowsCallback 8.4. SortRowsCallback9. 視圖 9.1. 引言 9.2. 表視圖 9.3. 導出視圖10. Preferences 10.1. 引言 10.2. TableTag 10.3. ColumnTag 10.4. Advanced Techniques11. Messages 11.1. 資源綁定 11.2. 全局資源 11.3. TableTag 11.4. ColumnTag12. Limit 12.1. Limit指南 12.2. 創建Limit 12.3. Filter和Sort屬性 12.4. 設置頁和行屬性 12.5. Setup13. AutoGenerateColumns 13.1. 引言 13.2. ColumnsTag14. Utilities 14.1. 引言 14.2. HtmlBuilder15. 1.0.1-M4升級說明 15.1. 變更概述
15.1.1. HtmlView 15.1.2. Cell 15.1.3. RowTag 15.1.4. AutoGenerateColumns 15.1.5. Extended Attributes 15.1.6. TableTag的collection屬性 15.1.7. BaseModel 15.1.8. Properties和ResourceBundle 15.1.9. pageContext 15.1.10. Limit和LimitFactory 15.1.11. TableTag的saveFilterSort屬性 15.1.12. ColumnTag的showTotal屬性 15.1.13. Image名 15.1.14. FormTag / InputTag Deprecated 15.1.15. RetrieveRowsCallbacks、FilterRowsCallback、SortRowsCallback
16. Tag Attributes 16.1. TableTag 16.2. RowTag 16.3. ColumnTag 16.4. ExportTag 16.5. ExportXlsTag 16.6. ExportCsvTag 16.7. ExportPdfTag 16.8. ColumnsTag 16.9. ParameterTag

sourceforge 下載發行包。(http://sourceforge.net/projects/extremecomp/)

在壓縮文件里你能找到開始使用需要的所有東西:

  • extremecomponents.jar

  • extremecomponents.tld

  • extremecomponents.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"/>">

</ec:column>

</ec:row>

</ec:table>

切記bean中所有的屬性都是可訪問的,因此你甚至可以通過firstName屬性 來顯示下一頁。請注意firstName屬性是如何作為URL字符串傳輸的。

<ec:table

items="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:table

items="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 Cell

headerCell屬性控制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:column

width=""

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:table

items="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:table

items="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:table

items="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:table

items="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:table

items="presidents"

action="${pageContext.request.contextPath}/public/demo/presidents.jsp"

title="Presidents"

>

<ec:row>

<mycompany:customColumn

property="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:table

items="presidents"

action="${pageContext.request.contextPath}/presidents.run"

autoIncludeParameters=”false”

>

...

</ec:table>

甚至當表被鎖定時,你仍然可以通過簡單地使用parameter標簽來包含一些你想使用的參數。下例 包含了foo參數:

<ec:table

items="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:table

items="presidents"

action="${pageContext.request.contextPath}/presidents.run"

/>

<ec:exportXls

fileName="presidents.xls"

tooltip="Export Excel"/>

...

</ec:table>

使用ExportPdfTag導出PDF。所有要做的就是指定fileName屬性和一些樣式屬性:

<ec:table

items="presidents"

action="${pageContext.request.contextPath}/presidents.run"

/>

<ec:exportPdf

fileName="presidents.pdf"

tooltip="Export PDF"

headerColor="blue"

headerBackgroundColor="red"

headerTitle="Presidents"/>

...

</ec:table>

使用ExportCsvTag導出CSV。當使用CSV導出是默認的分隔符為‘,’(comma)。你可以使用 delimiter屬性來指定為其他的符號。下面為指定‘|’(pipe)為CSV分隔符的示例:

<ec:table

items="presidents"

action="${pageContext.request.contextPath}/presidents.run"

/>

<ec:exportCsv

fileName="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:table

items="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.?RetrieveRowsCallback

RetrieveRowsCallback的默認實現在servlet范圍內尋找具有名稱和TableTag 的items屬性設置相同的Beans集合。為了使用定制的callback,只要實現RetrieveRowsCallback接口, 然后使用retrieveRowsCallback屬性來指定實現類的全路徑:

<ec:table

var="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.?FilterRowsCallback

FilterRowsCallback的默認實現得到Beans集合,通過實現jakarta Predicate接口進行過濾, 過濾值從eXtremeTable的filter輸入框中取得。為了使用定制的callback,只要實現FilterRowsCallback接口, 然后使用filterRowsCallback屬性來指定實現類的全路徑:

<ec:table

var="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.?SortRowsCallback

SortRowsCallback的默認實現得到Beans集合,使用jakarta BeanComparator進行排序, 排序值當用戶點擊列頭時取得。為了使用定制的callback,只要實現SortRowsCallback接口, 然后使用sortRowsCallback屬性來指定實現類的全路徑:

<ec:table

var="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:table

items="presidents"

action="${pageContext.request.contextPath}/presidents.run"

view="com.mycompany.view.MyCustomView"

>

...

</ec:table>

9.3.?導出視圖

與表視圖不同,export的所有標簽都在View中生成。為了使用定制的View, 只需要使用ExportTag的view屬性來指定實現View接口的實現類的 全路徑:

<ec:table

items="presidents"

action="${pageContext.request.contextPath}/presidents.run"

>

<ec:export

fileName="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.00

10.2.?TableTag

在屬性文件定義的TableTag使用最多的兩個屬性是:imagePath和rowsDisplayed。如果你不在屬性文件中聲明 這些屬性,你需要在每個eXtremeTable中添加他們。典型的表如下所示:

<ec:table

items="presidents"

action="${pageContext.request.contextPath}/presidents.run"

imagePath="${pageContext.request.contextPath}/images/*.gif"

rowsDisplayed="12"

title="Presidents"

>

...

</ec:table>

如果在屬性文件聲明imagePath和rowsDisplayed,則表如下所示:

<ec:table

items="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:table

items="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=Clear

toolbar.clearText=Clear

toolbar.firstPageText=First

toolbar.lastPageText=Last

toolbar.nextPageText=Next

toolbar.prevPageText=Prev

toolbar.filterText=Filter

column.headercell.sortTooltip=Sort By

column.calc.total=Total

column.calc.average=Average

現在僅支持英語和德語。如果你使用其他語言的話,并能提供相應的翻譯的話我將不勝感激。你可以通過 extremecomponents@gmail.com發送給我。

譯者注:我已經提供了中文和日文的資源文件。

11.3.?TableTag

TableTag屬性中能夠使用locale方式指定的是:imagePath和title。

在eXtremeTable中,imagePath屬性有一個特定的key:table.imagePath。你可以在你的資源文件中 設置這個key為特定語言的目錄結構。例如:德文圖片可能放在de文件夾下,那么你可以在相應的資源文件中 進行如下設置:

table.imagePath=/extremesite/images/table/de/*.gif

title有一點不同,如果你指定的title屬性值包含dot (.)并且你定義了一個資源文件,那么 eXtremeTable將尋找匹配的key。例如,如果你像下例一樣在表中指定屬性title="table.title.president":

<ec:table

items="presidents"

action="${pageContext.request.contextPath}/public/demo/locale.jsp"

title="table.title.president"

>

...

</ec:table>

那么eXtremeTable將在屬性文件中尋找匹配的key:

table.title.president=US Pr?sidenten

11.4.?ColumnTag

ColumnTag屬性中能夠使用locale方式指定的是:format和title。

在eXtremeTable中,format屬性有一個特定的key:table.fomat.type。參考屬性文件的討論 來了解更多的細節,他們具有同樣的概念。日期和貨幣的format類型定義可能如下所示:

column.format.date=MM/dd/yyyy

column.format.currency=$###,###,##0.00

title有一點不同,如果你指定的title屬性值包含dot (.)并且你定義了一個資源文件,那么 eXtremeTable將尋找匹配的key。例如,如果你像下例一樣在列中指定屬性title="table.column.nickName":

<ec:table

items="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=Spitzname

Chapter?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:table

items="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.?ColumnsTag

ColumnsTag只有autoGenerateColumns這一個屬性。所有你必須做的就是實現AutoGenerateColumns接口, 并設置autoGenerateColumns屬性為類的全路徑。

<ec:table

items="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基于原來代碼的實現已經deprecated

  • Cell接口更簡單

  • 增加RowTag

  • AutoGenerateColumns變為singleton,更易添加列屬性

  • Extended Attributes方法名變更

  • TableTag的collection屬性被刪除

  • BaseModel更名為TableModel

  • Properties和ResourceBundle現在為Preferences和Messages

  • pageContext被Context接口代替

  • Limit和LimitFactory的語法變更,更易于使用

  • TableTag的saveFilterSort屬性被state屬性代替

  • ColumnTag的showTotal屬性被calc屬性代替

  • search圖片的名稱變為filter

  • FormTag/InputTag為deprecated

  • RetrieveRowsCallbacks、FilterRowsCallback、SortRowsCallback都變為singletons

15.1.1.?HtmlView

我把和舊的view相關的代碼:原始的view、cell和相關代碼放到deprecated文件夾。 原因是新的view代碼非常成功,所以沒有必要使用舊的代碼。使用新代碼構建定制view請參考 view包中的HtmlView或CompactView。

15.1.2.?Cell

Cell接口已經改變,原因是想結束混亂以提高靈活性。以前對于如何處理區分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.?RowTag

RowTag<ec:row> 現在被需要,它被用來替代columns。 現在看來它一直被需要。它不知道表中到底有多少列,最近重構的時候我通過 Table -> Row -> Column使結構固定來合并得到更好的靈活性。將來我可能提供更多的 特性,因為我知道eXtremeTable有著清晰的架構。

典型的eXtremeTable如下:

<ec:table

items="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.?AutoGenerateColumns

AutoGenerateColumns得到了很大的提高,現在你只需要設置你需要的屬性。 當你添加列到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 Attributes

addExtendedAttributes方法重命名使得如何使用這個特性更清晰。 因此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.?BaseModel

BaseModel被重命名為TableModel,這是因為已經不需要一個基礎包(base package)了,這也 意味著不再需要BaseModel了。

15.1.8.?Properties和ResourceBundle

web.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=Clear

toolbar.clearText=Clear

toolbar.firstPageText=First

toolbar.lastPageText=Last

toolbar.nextPageText=Next

toolbar.prevPageText=Prev

toolbar.filterText=Filter

column.headercell.sortTooltip=Sort By

column.calc.total=Total

column.calc.average=Average

15.1.9.?pageContext

TableModel (以前的BaseModel)不再直接訪問pageContext,取而代之的是使用Context接口, 默認的被pageContext支持。直接訪問pageContext是一個不好的實現,Context提供你需要從不同servlet scopes中 取得需要屬性值的所有方法。然而,如果你需要直接訪問背后的對象,可以使用getContextObject()方法。

15.1.10.?Limit和LimitFactory

Limit和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 Deprecated

FormTag和InputTag現在為deprecated。他們在新的html視圖(view)中不再被使用。

15.1.15.?RetrieveRowsCallbacks、FilterRowsCallback、SortRowsCallback

Callbacks為singleton并且不是線程安全的,因此不要定義任何類變量。

Chapter?16.?Tag Attributes

16.1.?TableTag

Table?16.1.?

NameDescription
actionThe URI that will be called when the filter, sort and pagination is used.
autoIncludeParametersSpecify whether or not to automatically include the parameters, as hidden inputs, passed into the JSP.
borderThe table border attribute. The default is 0.
cellpaddingThe table cellpadding attribute. The default is 0.
cellspacingThe table cellspacing attribute. The default is 0.
filterableSpecify whether or not the table is filterable. Boolean value with the default being true.
filterRowsCallbackA 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.
formThe reference to a surrounding form element.
imagePathThe path to find the images. For example imagePath=/extremesite/images/*.png is saying look in the image directory for the .png images.
interceptA fully qualified class name to a custom InterceptTable implementation. Could also be a named type in the preferences. Used to add table attributes.
itemsReference the collection that will be retrieved.
localeThe locale for this table. For example fr_FR is used for the French translation.
methodUsed to invoke the table action using a POST or GET.
onsubmitThe javascript onsubmit action for the table.
retrieveRowsCallbackA 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.
rowsDisplayedThe number of rows to display in the table.
scopeThe scope (page, request, session, or application) to find the Collection of beans or Collection of Maps defined by the collection attribute.
showPaginationSpecify whether or not the table should use pagination. Boolean value with the default being true.
showExportsSpecify whether or not the table should use the exports. Boolean value with the default being true.
showStatusBarSpecify whether or not the table should use the status bar. Boolean value with the default being true.
showTooltipsSpecify whether or not to show the tooltips. Boolean value with the default being true.
sortRowsCallbackA 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.
sortableSpecify whether or not the table is sortable. Boolean value with the default being true.
stateThe table state to use when returning to a table. Acceptable values are default, notifyToDefault, persist, notifyToPersist.
stateAttrThe table attribute used to invoke the state change of the table.
styleThe css inline style sheet.
styleClassThe css class style sheet.
tableIdThe unique identifier for the table.
themeThe theme to style the table. The default is eXtremeTable.
titleThe title of the table. The title will display above the table.
varThe name of the variable to hold the current row bean.
viewGenerates the output. The default is the HtmlView to generate the HTML. Also used by the exports to generate XLS-FO, POI, and CSV.
widthWidth of the table.

16.2.?RowTag

Table?16.2.?

NameDescription
highlightClassThe css class style sheet when highlighting rows.
highlightRowUsed to turn the highlight feature on and off. Acceptable values are true or false. The default is false.
interceptA 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.
onclickThe javascript onclick action
onmouseoutThe javascript onmouseout action
onmouseoverThe javascript onmouseover action
styleThe css inline style sheet.
styleClassThe css class style sheet.

16.3.?ColumnTag

Table?16.3.?

NameDescription
aliasUsed to uniquely identify the column when the same property is used for more than one column.
calcA 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.
calcTitleThe title of the calc.
cellDisplay 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.
escapeAutoFormatSpecify whether auto format of value will be skipped. False by default, and is only effective if autoformatting is implement in the view.
filterableSpecify 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.
filterCellDisplays 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.
filterClassThe css class style sheet used to define what the table filter column looks like.
filterStyleThe css class style sheet to use for the filter column.
formatThe format to use for the cell. For instance if used with a date cell then the format can be MM/dd/yyyy.
headerCellDisplay for the header column. The default is header. The cell can also be a fully qualified class name to a custom cell.
headerClassThe css class style sheet used to define what the table header column looks like.
headerStyleThe css class style sheet to use for the header column.
interceptA 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.
parseUsed if the format needs to be interpreted. For instance, a date needs to be parsed in the specific format, such as MM-dd-yyyy.
propertyThe bean attribute to use for the column.
sortableSpecify 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.
styleThe css inline style sheet.
styleClassThe css class style sheet.
titleThe 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.
valueThe 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.
viewsAllowedThe comma separated list of views that this column will be used in.
viewsDeniedThe comma separated list of views that this column will not be used in.
widthSpecify the column width.

16.4.?ExportTag

Table?16.4.?

NameDescription
fileNameThe name of the export file.
imageNameThe image name.
interceptA 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.
viewA 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.
viewResolverA 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.
textThe text for the export view.
tooltipThe tooltip that shows up when you mouseover the export image.

16.5.?ExportXlsTag

Table?16.5.?

NameDescription
fileNameThe name of the export file.
imageNameThe image name.
interceptA 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.
viewA 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.
viewResolverA 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.
textThe text for the export view.
tooltipThe tooltip that shows up when you mouseover the export image.

16.6.?ExportCsvTag

Table?16.6.?

NameDescription
delimiterWhat to use as the file delimiter. The default is a comma.
fileNameThe name of the export file.
imageNameThe image name.
interceptA 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.
viewA 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.
viewResolverA 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.
textThe text for the export view.
tooltipThe tooltip that shows up when you mouseover the export image.

16.7.?ExportPdfTag

Table?16.7.?

NameDescription
headerBackgroundColorThe background color on the header column.
headerColorThe font color for the header column.
headerTitleThe title displayed at the top of the page.
fileNameThe name of the export file.
imageNameThe image name.
interceptA 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.
viewA 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.
viewResolverA 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.
textThe text for the export view.
tooltipThe tooltip that shows up when you mouseover the export image.

16.8.?ColumnsTag

Table?16.8.?

NameDescription
autoGenerateColumnsA 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

Table?16.9.?

NameDescription
nameThe name of the parameter.
valueThe value of the parameter.

總結

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

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

国产91九色蝌蚪 | 久久视频在线观看免费 | 久久久久久国产精品 | 黄色在线免费观看网址 | 在线日本v二区不卡 | 国产91av视频在线观看 | 亚洲视频在线视频 | www.大网伊人 | 99久久精品费精品 | 国内精品久久久 | 国产99一区视频免费 | 91在线小视频 | 日韩欧美在线综合网 | 欧洲av在线| 激情影音先锋 | 日韩精品中文字幕在线观看 | 超碰在线天天 | 国产精品乱码久久久久久1区2区 | 免费看国产视频 | 国产亚洲精品久久久久久久久久久久 | 中文欧美字幕免费 | 久久久久国产精品免费网站 | 婷婷亚洲综合五月天小说 | 69av视频在线观看 | 91欧美视频网站 | bbw av| 日韩av片在线 | 日韩中文字幕免费视频 | 色av婷婷| 日韩av手机在线看 | 亚洲日本激情 | 美女网站视频免费黄 | 欧美日韩一区二区免费在线观看 | 不卡av免费在线观看 | 91精品1区| 日韩1页 | 欧美一区二区在线刺激视频 | 欧美一级黄色视屏 | 99精品视频免费观看 | 久久久久亚洲精品国产 | 久久精品网站视频 | 国内精品久久久久影院一蜜桃 | 久久久18 | 在线精品视频免费播放 | 成人午夜电影在线观看 | 91精品国产综合久久婷婷香蕉 | 国产精品一区二区免费 | 97在线成人 | 久久极品 | 日本久久99 | 久久久久激情视频 | 91在线永久 | www.天堂av| h动漫中文字幕 | 操夜夜操| 一二三精品视频 | 一区二区三区在线免费 | 国产高清小视频 | 天天射天天射天天 | 韩国av一区二区三区在线观看 | 人人插人人搞 | 五月婷婷黄色 | 免费看的黄网站软件 | 99热官网 | 欧美日韩不卡在线观看 | 午夜久久影视 | 亚洲激情网站免费观看 | 玖玖视频免费在线 | 久久午夜剧场 | 午夜视频色| 日本韩国在线不卡 | 91精品国产自产在线观看 | 97精品国产手机 | 久草在线视频网 | 日韩视频在线不卡 | 久久久久久久久久久久电影 | 日韩欧美观看 | 中文字幕免费 | 久草在线免费电影 | 开心丁香婷婷深爱五月 | 91av小视频| 99久久精品国产一区二区成人 | 免费在线观看av | 久草在线| 久草视频精品 | 中文字幕在线免费观看 | 一区二区激情 | 日本黄色大片儿 | 在线看国产 | 欧美一区免费在线观看 | 日韩av在线免费看 | 99精品福利| 夜夜嗨av色一区二区不卡 | 99一级片| 黄色小视频在线观看免费 | www国产亚洲精品久久麻豆 | av高清不卡 | 狠狠综合久久av | 久久综合中文色婷婷 | 日韩中文字幕免费看 | 午夜精品久久久久久99热明星 | 色多多污污 | 国产一区在线视频播放 | 在线 视频 亚洲 | 日韩在线观看不卡 | 国产在线观看中文字幕 | 久草免费在线视频观看 | 久久综合给合久久狠狠色 | 国产午夜精品av一区二区 | 日韩视频一区二区三区 | 国产精品久久久久久麻豆一区 | 国产亚洲亚洲 | 久久久久久久久久久网 | 在线国产一区二区 | 久久综合加勒比 | 日韩在线免费电影 | 国产中文字幕视频在线观看 | av免费在线网 | 久久夜色精品国产欧美乱极品 | 中文在线免费视频 | 欧美大片aaa| 亚洲黄色在线观看 | 成人综合日日夜夜 | 成人毛片网 | 免费麻豆网站 | 国产黄色片免费在线观看 | 日韩四虎 | 成人福利在线播放 | 在线观看黄污 | 六月丁香六月婷婷 | 91av视频播放 | 香蕉视频在线免费看 | 国产免费一区二区三区最新 | 91av中文字幕 | 97影视 | 91字幕| 成人黄色免费观看 | 美女视频黄的免费的 | 国产麻豆剧果冻传媒视频播放量 | 青青河边草手机免费 | 在线观看亚洲精品视频 | 日韩av一区二区三区 | 午夜精品电影一区二区在线 | 久久久久久久久影院 | 欧美贵妇性狂欢 | 亚洲精品在线免费看 | 国产精品免费久久久 | 亚洲国产精品99久久久久久久久 | 亚洲天天综合 | 欧美国产精品一区二区 | 久艹视频免费观看 | 91在线产啪 | 99久久婷婷国产一区二区三区 | 免费观看国产视频 | 国产 日韩 在线 亚洲 字幕 中文 | 久久免费在线观看 | 久久se视频| 狠狠色丁香婷婷 | 一区二区三区电影在线播 | 伊人在线视频 | av成人免费在线看 | 成人网页在线免费观看 | 丁香婷婷成人 | 99久久久久免费精品国产 | 久久国产精品久久国产精品 | 黄色三级免费片 | 国产精品久久久av | 亚洲精品色婷婷 | 人人狠狠综合久久亚洲 | 一区二区三区三区在线 | 在线国产视频观看 | 色中色亚洲| 久久国产二区 | 色噜噜日韩精品欧美一区二区 | 国产婷婷在线观看 | 久久艹久久 | 91在线看| 五月婷婷色 | 欧美色一色 | 麻豆传媒视频在线播放 | 国产99久久精品一区二区永久免费 | 久久高清国产视频 | 国模精品在线 | 五月天激情在线 | 欧美日韩在线观看视频 | 日本黄色免费观看 | 在线日本v二区不卡 | 国产精品久久久久aaaa | 九色视频网址 | 国产精品久久伊人 | 欧美性极品xxxx娇小 | 91麻豆精品国产91 | 久草电影免费在线观看 | 亚洲成av人影院 | 免费久久久久久久 | 日本久久电影 | 天天舔天天射天天操 | 蜜桃av久久久亚洲精品 | 久久久久久久毛片 | 69久久99精品久久久久婷婷 | 蜜臀91丨九色丨蝌蚪老版 | 亚洲综合色丁香婷婷六月图片 | 青青河边草手机免费 | 久久久久国产一区二区 | 九九久久成人 | 色www.| 99久久夜色精品国产亚洲96 | 超碰人人舔 | 最新av免费在线 | 日本黄色免费播放 | 99re久久资源最新地址 | 一区二区三区国 | 亚洲97在线| 黄色三级免费看 | 亚洲另类交 | 亚洲精品视频在线播放 | 欧美中文字幕久久 | 91视频在线看 | 国产69精品久久久久99尤 | 国产精品久久久久久久久久 | 国产视频每日更新 | 日韩视频免费播放 | 欧美精品久久99 | zzijzzij亚洲成熟少妇 | 91亚洲欧美激情 | 婷婷丁香色 | 高清一区二区三区 | www.人人草 | 91豆花在线 | 天天射天天干天天爽 | 成年人黄色免费看 | 99精品视频在线 | 国产手机在线观看视频 | 中文在线亚洲 | 中文字幕乱码视频 | 日韩成人免费在线 | 色黄www小说| 久草9视频 | 中文视频一区二区 | 日韩理论片中文字幕 | a视频在线观看免费 | av在线中文 | 亚洲精品乱码久久久久v最新版 | 啪啪激情网 | 亚洲伊人网在线观看 | 91亚洲精品国偷拍自产在线观看 | 岛国一区在线 | 久久精品久久精品久久39 | 亚洲男女精品 | 久久久久国产成人免费精品免费 | 成人免费网站视频 | 九九天堂| 中文字幕首页 | 91色在线观看 | 国产美女无遮挡永久免费 | 色噜噜狠狠狠狠色综合久不 | 中文字幕一区二区三区乱码不卡 | 黄色精品国产 | 中文不卡视频在线 | 一区二区在线不卡 | www.福利 | 亚洲精品午夜国产va久久成人 | 色偷偷人人澡久久超碰69 | 国产一二三四在线观看视频 | 亚洲国产欧美在线看片xxoo | 怡春院av| 丁香色婷婷 | 国产日韩精品一区二区三区 | 日韩在线免费不卡 | 国产真实精品久久二三区 | 婷婷深爱网 | 免费在线h| 日韩精品中文字幕av | 一区二区男女 | 中文字幕在线观看av | 日韩精品久久久久久久电影竹菊 | 亚洲人精品午夜 | 日韩高清dvd | 中国一级片免费看 | www国产在线| 国产一线二线三线性视频 | 韩国在线视频一区 | 五月天激情视频 | 午夜丁香视频在线观看 | 日韩av一区二区在线 | 福利一区二区 | 国产在线观看免费观看 | 婷婷丁香色 | 在线免费国产 | 黄色小说视频在线 | 人人干人人模 | 日本不卡一区二区三区在线观看 | 8x成人免费视频 | 精品国产乱码一区二 | 国产精品门事件 | 99久久久免费视频 | av中文字幕在线播放 | 精品一区二区视频 | 96久久久 | 视频一区在线免费观看 | 夜夜躁狠狠躁 | 久草在线 | 在线观看黄色大片 | 精品国模一区二区三区 | 在线99热 | www在线观看视频 | 婷婷激情综合五月天 | 91精品老司机久久一区啪 | 久久综合网色—综合色88 | 国产成人av片 | 久久a v电影| 亚洲精品视频在线观看网站 | 欧美日韩不卡一区二区三区 | 国产小视频福利在线 | 狠狠色丁香久久婷婷综合五月 | 日韩精品亚洲专区在线观看 | 超碰在线免费97 | 久久久久久免费视频 | 精品国产乱子伦一区二区 | 成人午夜电影免费在线观看 | 综合精品在线 | 91九色网站 | 超碰在线观看99 | 天天摸夜夜添 | 久精品在线观看 | 一级做a视频 | 手机看片国产 | 黄色福利网 | 精品在线视频播放 | 国产糖心vlog在线观看 | 友田真希av| 91一区二区三区久久久久国产乱 | 免费日韩在线 | 99超碰在线播放 | 免费碰碰| 色网站在线免费观看 | 久精品视频在线观看 | 国产精品 999 | www.久草.com| 狠狠色网 | 国产视频久久久 | 91精品国产欧美一区二区 | 丝袜足交在线 | 国产69精品久久app免费版 | 久久久久国产精品一区二区 | 久久精品久久综合 | 欧美在线资源 | 久久精品91久久久久久再现 | 丁香六月激情 | 欧美aaaxxxx做受视频 | 99精品视频网站 | 91视频免费网站 | 草在线| 最近日本字幕mv免费观看在线 | 九九热99视频 | 欧美成人a在线 | 精品一区二区在线免费观看 | 久久国产精品二国产精品中国洋人 | 国产亚洲情侣一区二区无 | 国产v在线观看 | 日韩精品久久久免费观看夜色 | 成人性生交大片免费观看网站 | 免费观看福利视频 | 色婷婷视频在线观看 | 天天操天天干天天综合网 | 国产中出在线观看 | 成人亚洲精品国产www | 五月婷婷影视 | 在线 精品 国产 | 天天爽综合网 | 亚洲无吗av | 国产h在线播放 | 99视频久久| 91亚·色| 在线视频精品播放 | 免费又黄又爽 | 亚洲高清久久久 | 美女视频黄网站 | 日韩视频一区二区 | 最近免费中文字幕mv在线视频3 | 99草视频在线观看 | 91高清一区 | 久久精品在线视频 | 久久a国产 | 亚洲免费黄色 | 国产一级做a爱片久久毛片a | 欧美综合色在线图区 | 91麻豆精品国产91久久久久 | 免费十分钟 | 欧美成人h版在线观看 | 国产一级视频在线观看 | 久久看片网 | 99这里只有精品视频 | 黄色av一区二区 | 日韩精品影视 | 亚洲国产一区二区精品专区 | 欧美久久久久 | 四虎国产精品成人免费4hu | 久久人人爽人人爽人人片av软件 | 成年人视频在线免费 | 黄污在线观看 | 国产电影黄色av | 成人国产综合 | 国产免费视频在线 | 天天色天天干天天 | 国产不卡一二三区 | 色婷婷狠狠五月综合天色拍 | 亚洲激情五月 | 国产精品日韩久久久久 | 久久久久人人 | 涩涩在线 | 精品国产成人av | 国产精品免费久久 | 色婷婷久久 | 国产精品高清免费在线观看 | 98精品国产自产在线观看 | 人人看看人人 | 日韩在线欧美在线 | 亚洲理论视频 | 国产精品电影一区 | 久久久久久久久亚洲精品 | 日韩激情精品 | 亚洲伦理精品 | 中文一区二区三区在线观看 | 91丨九色丨91啦蝌蚪老版 | 国产精品成人一区二区 | 麻豆视频免费网站 | 国产乱对白刺激视频不卡 | 99福利影院| 亚洲视频一级 | 亚洲国产成人久久 | www在线观看视频 | 国产精品大尺度 | 天堂麻豆 | 久久国产精品偷 | 月丁香婷婷 | 天天干 夜夜操 | 4438全国亚洲精品在线观看视频 | 精品久久久久久久久久久久久久久久 | 久久综合婷婷国产二区高清 | www.久久com | 久久久免费精品国产一区二区 | 久久婷婷综合激情 | 亚洲aaa级 | 亚洲视频精品在线 | 成人av网站在线播放 | 九草视频在线 | 午夜美女网站 | 久久婷婷色 | 黄色网在线播放 | 中文字幕一区二 | 日日干夜夜爱 | 天天操天天摸天天射 | 国产精品无 | 国产精品 欧美 日韩 | 伊人久久影视 | 亚洲欧美精品一区二区 | 日韩成人中文字幕 | 久久精品影视 | 波多野结衣在线中文字幕 | 怡春院av | 精品国产乱码久久久久久天美 | 亚州中文av | av综合av | 久久69精品久久久久久久电影好 | 91精品国产91久久久久久三级 | 国产一区二区三区免费观看视频 | 国产在线日韩 | 中国老女人日b | 婷婷九九 | 一区二区三区免费看 | 天天综合网 天天综合色 | 国产精品资源 | 亚洲精品国产自产拍在线观看 | 国产精品一区二区久久 | 不卡电影免费在线播放一区 | 国产视频不卡 | 久久大片网站 | 中文字幕黄色 | 婷婷激情欧美 | 在线免费av电影 | 国产成人av电影在线 | 国产丝袜在线 | 综合久久久久久 | 麻豆影视在线免费观看 | 欧美一级片播放 | 黄色av免费电影 | 色综合人人 | 在线观看亚洲专区 | 亚洲春色奇米影视 | 激情综合啪啪 | 91麻豆精品国产91 | 亚洲天天| 久久综合久久综合这里只有精品 | 日韩超碰| 日本黄色大片免费看 | 精品久久综合 | 97电影在线观看 | 国产99精品在线观看 | 中文字幕色在线视频 | 五月天久久婷 | 正在播放一区二区 | 国产精品视频永久免费播放 | 久久精品久久久精品美女 | 成人在线视频一区 | 亚洲91网站| 99久久影院 | 色就色,综合激情 | 国产色女人 | 国产高清专区 | 国产xvideos免费视频播放 | 久久99国产一区二区三区 | 久久免费的精品国产v∧ | 国内外成人在线 | 色美女在线 | a天堂最新版中文在线地址 久久99久久精品国产 | 国产精品久久久久久一区二区 | 永久免费毛片在线观看 | 欧美精品久久久久久久久免 | 久久大片 | 国产精品 美女 | 中文字幕在线播放av | 成人电影毛片 | 在线欧美a | 91视频久久久 | 92中文资源在线 | 天天婷婷| 69国产成人综合久久精品欧美 | 久草国产在线 | 色综合网 | 亚洲综合色播 | 亚洲日本成人 | 日本不卡123 | 涩涩网站在线看 | av成人免费观看 | 在线观看国产成人av片 | 一区二区精品 | 成人av亚洲 | 精品国产乱码久久久久久天美 | 超碰在线人人草 | 国产精品男女啪啪 | 伊人五月 | 亚洲婷婷丁香 | 成人久久综合 | 国产黄色精品在线观看 | 9999激情| 91新人在线观看 | 天天干天天综合 | 欧美视频18 | 亚州av免费 | 天天艹天天爽 | 成人av手机在线 | 狠狠色婷婷丁香六月 | 久草久视频 | 成人黄色小说网 | 蜜桃视频日本 | 在线精品一区二区 | 午夜精品福利一区二区三区蜜桃 | 婷婷五月情 | 精品美女久久久久 | 国产成人亚洲精品自产在线 | 国产精品福利在线 | 在线观看av黄色 | 五月天天av | 99久久精品免费看国产 | 黄色a在线观看 | 久久综合在线 | 91视频 - x99av| 国产无套精品久久久久久 | 99国产视频在线 | 欧美日韩有码 | 在线视频欧美日韩 | 久久亚洲热 | 色视频国产直接看 | 亚洲91精品在线观看 | 日韩精品一区二区三区免费视频观看 | 丁香九月婷婷综合 | www九九热| 精品久久久久久综合日本 | 国产精品入口a级 | 一二区精品 | 中文字幕日本在线观看 | av在线免费播放网站 | 国产亚洲精品中文字幕 | 99精品亚洲| www色网站| 精品一二三区视频 | 深爱五月网 | 视频成人 | 男女激情免费网站 | www.成人精品| 免费看的黄色的网站 | 91av手机在线| 精品视频资源站 | 国产成人一区三区 | 97精品电影院 | 国内精品久久久久久久久久久 | 国产美女精品视频 | 色国产精品一区在线观看 | 天天射射天天 | 久久国产亚洲 | 在线91色 | 国产一二三区在线观看 | 精品国产美女在线 | 中文字幕刺激在线 | 久久新视频 | 一级片免费观看 | 久久精品一二三区白丝高潮 | 国产一二三区av | av电影在线观看 | 超级碰碰视频 | av电影久久 | 色视频网站在线观看一=区 a视频免费在线观看 | 免费合欢视频成人app | 日韩久久一区二区 | 国产精品欧美激情在线观看 | 免费看三级网站 | av高清一区二区三区 | 免费日韩视频 | av在线永久免费观看 | 91亚洲精品久久久蜜桃网站 | 伊人天堂av | 久久久久久久久久电影 | 人人澡超碰碰97碰碰碰软件 | 久久综合精品国产一区二区三区 | 国产伦理久久精品久久久久_ | 91精品少妇偷拍99 | 天天色 天天 | 日日添夜夜添 | 国产高清免费视频 | 碰超在线 | 99热99re6国产在线播放 | 国产精品成人自产拍在线观看 | 一区二区激情 | 国产精品久久伊人 | 麻豆 91 在线 | 欧美人体xx | 在线色亚洲 | 日韩av看片| 日韩中文字幕在线 | 国产黄av | 国产不卡网站 | 午夜av一区 | 日韩免费电影网 | 色偷偷88欧美精品久久久 | 欧洲一区二区三区精品 | 亚洲精品国产片 | 精品视频一区在线观看 | 99热这里有| 97电影网手机版 | 欧美极品少妇xbxb性爽爽视频 | 成年人网站免费在线观看 | 久久久精品视频网站 | 午夜视频在线观看一区 | 天天色天天骑天天射 | 中文字幕在线精品 | 激情中文在线 | 中文字幕在线观看91 | 国产在线播放观看 | 欧美激情第一区 | 91亚色在线观看 | 国产综合91| av大全在线观看 | 一区免费视频 | 日日干精品| 草久热 | 国产黄色理论片 | 韩日精品在线观看 | 探花视频免费观看 | 日韩av电影中文字幕在线观看 | 在线观看黄网 | 一区av在线播放 | 亚洲精品福利在线 | 国产99久久九九精品免费 | 一区二区电影在线观看 | 草免费视频 | 日本三级国产 | 最新亚洲视频 | 久久精品第一页 | 伊人成人精品 | 国产99精品 | 亚洲精品乱码久久久久久9色 | 在线观看www91| 天天天插| 国产精品美女久久久网av | www.一区二区三区 | 国产精品丝袜久久久久久久不卡 | 国产精品美女网站 | 国产美女被啪进深处喷白浆视频 | 久久精品亚洲 | 在线观看 亚洲 | 在线观看视频福利 | 亚洲 综合 国产 精品 | 亚洲三级视频 | 狠狠躁日日躁夜夜躁av | 婷婷免费在线视频 | 天堂av免费观看 | 久久久久国产精品视频 | 成人福利av | 欧美久久久久久久久中文字幕 | 91在线播放国产 | 日韩精品一区在线观看 | 国产精品久久久久一区 | 国产精品观看在线亚洲人成网 | a午夜在线| 五月天伊人 | 国产黄色视 | 久久香蕉国产精品麻豆粉嫩av | 99精品视频在线播放观看 | 国产一区二区在线视频观看 | 国产中文在线视频 | 人人干人人干人人干 | 美州a亚洲一视本频v色道 | 久草电影在线观看 | 五月激情av | 在线黄色观看 | 久久99久国产精品黄毛片入口 | 亚洲综合在线一区二区三区 | 亚洲精品欧洲精品 | 97视频免费在线观看 | 黄色视屏免费在线观看 | 久草在线免费看视频 | 亚洲精品成人网 | 久久天堂网站 | 91av视频在线观看免费 | 国产精品免费在线观看视频 | av九九 | 国产精品福利午夜在线观看 | 久久久午夜电影 | 91在线中文 | 在线看片91 | 亚洲三级在线免费观看 | 久久污视频 | 中文字幕在线观看你懂的 | 六月丁香婷婷网 | 黄色影院在线免费观看 | 中文在线字幕免费观看 | 久久午夜电影 | 日韩a欧美| 又黄又爽免费视频 | 成人影视免费看 | 粉嫩一区二区三区粉嫩91 | 亚洲国产精彩中文乱码av | av网站在线观看免费 | 免费看v片 | 岛国av在线免费 | 免费一级片在线 | 欧美一级日韩三级 | 九色精品在线 | 中文国产成人精品久久一 | 91精品在线观看视频 | 97视频免费观看 | 国产精品久久在线 | 中文字幕在线观看一区二区三区 | 色网站在线看 | www在线免费观看 | 色99网| 国产视频在线免费观看 | 国产精品色婷婷视频 | 天天艹天天 | 久久精品视频免费 | 国产精品久久久久久久久久久久午夜片 | 国产精品12 | 久久avav| 日日夜夜天天人人 | 欧美天堂影院 | 在线小视频你懂得 | 久久伊人婷婷 | 人人爽影院 | 亚洲久草网 | 中文字幕久久久精品 | 欧美日韩高清免费 | 国外成人在线视频网站 | 99精品国自产在线 | 久久热亚洲| 美女久久久久久久 | 亚洲高清不卡av | 操操综合 | 成人av高清在线 | 日本激情动作片免费看 | 国产资源在线播放 | 久草在线综合 | 91麻豆操 | 99精品免费在线观看 | 久久久精品99 | 欧美精品在线视频观看 | 成 人 免费 黄 色 视频 | 一区二区国产精品 | 日本黄色黄网站 | 91av视频免费在线观看 | 午夜精品一区二区三区在线观看 | av中文资源在线 | 久久视频国产 | 国产精品久久久久一区 | 黄色三级免费观看 | 中文在线亚洲 | 日韩激情视频在线观看 | 中文字幕在线观看网 | av不卡在线看 | 三级黄色大片在线观看 | 成人一区不卡 | 国产美女精品在线 | 在线观看亚洲国产 | 91综合在线| www.黄色片网站 | 懂色av懂色av粉嫩av分享吧 | 成人国产电影在线观看 | 久久免费国产精品 | 日韩国产精品毛片 | 久久久久久久久久久免费 | 色综合久久久久综合体 | 久久久久国产精品www | 成人av影视观看 | 久久国产福利 | 亚洲免费在线视频 | www.91成人 | 国产亚洲精品美女久久 | 精品人妖videos欧美人妖 | 激情久久小说 | 国产黄在线免费观看 | 国产精品va在线观看入 | 超碰在线最新网址 | 精品视频免费久久久看 | 免费观看成人av | 国内精品久久久久国产 | 国产亚洲精品久久久久久久久久久久 | 久久97久久 | 国语对白少妇爽91 | 中文字幕在线观看资源 | 精品久久久久久一区二区里番 | 日韩成人免费在线电影 | 日韩欧美网站 | 五月婷婷中文 | 91成人免费视频 | 精品一区二区免费在线观看 | 97精品久久| 91在线影院 | 色综合久久五月 | 开心激情综合网 | 国产又粗又猛又黄 | 亚洲天天在线日亚洲洲精 | 色视频国产直接看 | 免费在线观看av不卡 | 国产美女精品视频 | 97精品电影院 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲粉嫩av| 麻豆高清免费国产一区 | 久久精品国产亚洲精品 | 一二区电影 | 婷婷在线网站 | 在线 视频 亚洲 | 97精品欧美91久久久久久 | 婷婷六月天丁香 | 国产成人三级在线播放 | 日韩欧美大片免费观看 | 日韩久久精品一区二区三区 | 中文在线√天堂 | 美女久久久久久久 | 国产香蕉97碰碰碰视频在线观看 | 婷婷久久丁香 | 在线免费观看涩涩 | 日韩网站一区二区 | 久草在线免费看视频 | 国产做a爱一级久久 | 成 人 黄 色 视频免费播放 | 日韩欧美一区二区三区在线 | 成人a视频 | 亚洲精品777 | 久久人人干 | 国产123区在线观看 国产精品麻豆91 | 国产资源精品 | 午夜视频福利 | 亚洲aⅴ在线 | 国产精品久久久av | av在线之家电影网站 | 色综合中文综合网 | 色综合久久88色综合天天6 | 最近字幕在线观看第一季 | 九色视频自拍 | 91九色丨porny丨丰满6 | 国产精品一区二区三区久久 | 91精品专区| 国产精品免费在线播放 | 日韩免费av在线 | 国产精品九九九九九 | 久久久久久高潮国产精品视 | 国产一级视频在线观看 | 日本精品久久久久影院 | 五月激情久久久 | 男女拍拍免费视频 | a级国产乱理论片在线观看 特级毛片在线观看 | www.国产视频 | 天天插综合 | 一区二区三区免费在线 | 欧美日韩1区2区 | 国产玖玖在线 | 在线观看免费日韩 | 亚洲欧洲成人精品av97 | 91在线免费播放视频 | 国产精品一区一区三区 | 国产91免费看 | 色成人亚洲网 | 国产裸体永久免费视频网站 | 91中文在线视频 | 17婷婷久久www | 婷婷成人亚洲综合国产xv88 | 狠狠操导航 | 欧美日韩二区三区 | 天天人人 | 国产成人亚洲精品自产在线 | 在线小视频 | 狠狠夜夜 | 成人夜晚看av | 黄色大片日本免费大片 | 97超碰影视 | 99久久久久久久久久 | 天天综合操 | 青青草久草在线 | av中文字幕电影 | 国产精品美女久久久久久久 | 欧美日韩一区二区免费在线观看 | 91伊人影院| 人人干在线观看 | 亚洲国产成人精品在线 | 最新av观看| 丁香激情综合久久伊人久久 | 欧美色图视频一区 | 日本久久电影网 | 日韩视频在线不卡 | 九色最新网址 | 久久精品国产v日韩v亚洲 | 国产网站在线免费观看 | 亚洲成aⅴ人片久久青草影院 | 亚洲视频999 | 91精品国产一区二区在线观看 | 黄色国产在线观看 | 欧美黄色高清 | 麻豆系列在线观看 | 精品国产日本 | 日日夜夜天天久久 | 中国黄色一级大片 | 7777xxxx| 91精品久久久久久综合五月天 | 色婷婷国产精品 | 久久久久久久99精品免费观看 | 9999毛片| 久久精品女人毛片国产 | 日韩高清免费观看 | 国产小视频免费观看 | 青青草久草在线 | 欧美一级黄色视屏 | 91在线精品观看 | 亚洲爱爱视频 | 91尤物在线播放 | 少妇搡bbbb搡bbb搡aa | 日韩精品中文字幕在线播放 | 深爱婷婷 | 最近中文字幕视频网 | 91在线视频导航 | 欧美大码xxxx | 国产午夜精品一区二区三区四区 | 久久久99精品免费观看乱色 | 国产精品黑丝在线观看 | 韩国中文三级 | av在线电影免费观看 | 天天操天天综合网 | 丁香五月缴情综合网 | 黄色a在线 | 91av免费在线观看 | 视频一区二区在线观看 | 精品视频www| 中文字幕在线一区观看 | 91成人在线视频观看 | 奇米影视777四色米奇影院 | 国产精品日韩在线播放 | av字幕在线| 手机av电影在线观看 | 国产午夜麻豆影院在线观看 | 亚洲综合导航 | 国产亚洲欧美一区 | 久久久久久毛片精品免费不卡 | 亚洲国产三级在线观看 | 国产性天天综合网 | 玖玖爱国产在线 | 视频福利在线观看 | 色婷婷色 | 亚洲精品小区久久久久久 | 在线国产中文字幕 | 黄色成人av| 中文字幕在线观看第二页 | 黄色毛片视频免费观看中文 | 亚洲精品在线免费 | av一级一片 | 国产成人l区 | 97超碰在线久草超碰在线观看 | 九九爱免费视频在线观看 | 久久草av |