Chapter 15. 1.0.1-M4升級(jí)說(shuō)明(1)
下面的特性已經(jīng)被更改:
-
HtmlView基于原來(lái)代碼的實(shí)現(xiàn)已經(jīng)deprecated
-
Cell接口更簡(jiǎn)單
-
增加RowTag
-
AutoGenerateColumns變?yōu)閟ingleton,更易添加列屬性
-
Extended Attributes方法名變更
-
TableTag的collection屬性被刪除
-
BaseModel更名為TableModel
-
Properties和ResourceBundle現(xiàn)在為Preferences和Messages
-
pageContext被Context接口代替
-
Limit和LimitFactory的語(yǔ)法變更,更易于使用
-
TableTag的saveFilterSort屬性被state屬性代替
-
ColumnTag的showTotal屬性被calc屬性代替
-
search圖片的名稱變?yōu)閒ilter
-
FormTag/InputTag為deprecated
-
RetrieveRowsCallbacks、FilterRowsCallback、SortRowsCallback都變?yōu)閟ingletons
我把和舊的view相關(guān)的代碼:原始的view、cell和相關(guān)代碼放到deprecated文件夾。 原因是新的view代碼非常成功,所以沒(méi)有必要使用舊的代碼。使用新代碼構(gòu)建定制view請(qǐng)參考 view包中的HtmlView或CompactView。
Cell接口已經(jīng)改變,原因是想結(jié)束混亂以提高靈活性。以前對(duì)于如何處理區(qū)分html和export顯示值 不是十分明顯。現(xiàn)在Column值設(shè)置html,Column的propertyValue設(shè)置export。另外因?yàn)镃olumn值和 propertyValue值被重寫。現(xiàn)在他們?cè)趘iew中是不可見(jiàn)的。
cell現(xiàn)在是singleton并且不再線程安全,因此不要定義任何類變量。改變的原因是為 了Cell接口能更簡(jiǎn)單地被使用。init()和destroy()方法作為singleton更靈活但是處于一種混亂的狀態(tài)。
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);
}
現(xiàn)在得到導(dǎo)出和html顯示存在明顯的區(qū)別。更重要的,需要返回字符串。列值和屬性值不再 需要設(shè)置。另一個(gè)細(xì)微的區(qū)別是:BaseModel已經(jīng)被TableModel取代。這種改變是的不再需要一個(gè) 基礎(chǔ)包(base package),這意味著不再需要BaseModel。
cell變?yōu)閟ingleton不會(huì)導(dǎo)致使用復(fù)雜,如果你定義了任何類變量只需要把他們放到正確的 方法那么他們就能被任何其他方法使用。
BaseCell被刪除因?yàn)椴辉傩枰砑尤魏沃怠L娲氖茿bstractCell,虛擬方法 getCellValue被用來(lái)返回cell的值。這種方法非常容易使用并不需要關(guān)心markup。查看 AbstractCell也是有意義的,你會(huì)發(fā)現(xiàn)這代碼實(shí)現(xiàn)的多么簡(jiǎn)單。然而,很多時(shí)候需要做的僅僅是 實(shí)現(xiàn)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> 現(xiàn)在被需要,它被用來(lái)替代columns。 現(xiàn)在看來(lái)它一直被需要。它不知道表中到底有多少列,最近重構(gòu)的時(shí)候我通過(guò) Table -> Row -> Column使結(jié)構(gòu)固定來(lái)合并得到更好的靈活性。將來(lái)我可能提供更多的 特性,因?yàn)槲抑纄XtremeTable有著清晰的架構(gòu)。
典型的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>
AutoGenerateColumns得到了很大的提高,現(xiàn)在你只需要設(shè)置你需要的屬性。 當(dāng)你添加列到ColumnHandler使,defaults將別自動(dòng)調(diào)用。
AutoGenerateColumns為singleton并且不是線程安全的,因此不要定義任何類變量。
現(xiàn)在它的實(shí)現(xiàn)可能如下:
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);
}
}
}
addExtendedAttributes方法重命名使得如何使用這個(gè)特性更清晰。 因此RowTag的addExtendedAttributes現(xiàn)在變?yōu)閍ddRowAttributes,ColumnTag變 為addColumnAttributes,TableTag變?yōu)閍ddTableAttributes,ExportTag變 為addExportAttributes。另外你參考正確的model bean(它的實(shí)現(xiàn)更清晰), 將知道如何添加屬性到你的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中g(shù)et它:
Export export = model.getExportHandler().getCurrentExport();
String delimiter = export.getAttributeAsString(DELIMITER);
現(xiàn)在你需要在ExportTag中覆蓋它,你只需要調(diào)用setter方法。如果是新的屬性,那么使用 可以和前一版一樣使用addAttribute()方法。為了得到值,首先從ExportHandler得到Export, 然后調(diào)用需要的getter方法。這和使用其它tags一樣。
在RowTag和ColumnTag中增加了兩個(gè)新的callback方法:modifyRowAttributes和 modifyColumnAttributes,因此你可以在rows/columns被處理時(shí)改變屬性值。
posted on 2006-03-02 13:14 Lucky 閱讀(614) 評(píng)論(0) 編輯 收藏 所屬分類: extremeComponents