幸せのちから

平凡的世界
看似平常实崎岖
成如容易却艰辛

Chapter 15. 1.0.1-M4升级说明(1)

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被处理时改变属性值。

posted on 2006-03-02 13:14 Lucky 阅读(601) 评论(0)  编辑  收藏 所属分类: extremeComponents


只有注册用户登录后才能发表评论。


网站导航:
 
<2006年3月>
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

随笔分类(125)

文章分类(5)

日本語

搜索

积分与排名

最新随笔

最新评论