下面的特性已經被更改:
-
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
我把和舊的view相關的代碼:原始的view、cell和相關代碼放到deprecated文件夾。
原因是新的view代碼非常成功,所以沒有必要使用舊的代碼。使用新代碼構建定制view請參考
view包中的HtmlView或CompactView。
Cell接口已經改變,原因是想結束混亂以提高靈活性。以前對于如何處理區分html和export顯示值
不是十分明顯?,F在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);
}
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被處理時改變屬性值。