A8是eXtremeComponents正式Relese前的最后一个开发者版,现在eXtremeComponents的code工作已经全部结束,在Release之前的工作是完善eXtremeComponents的文档、指南和javadocs。所以请广大网友协助测试一下我前篇“eXtremeComponents导出时的中文文件名问题”中提到的中文文件名的问题,以便我能尽快提交,使得能够随着正式版一起Release。
开发快照版
extremecomponents-1.0.1-M5-A8(下载) 是正式版发行前的最后开发快照版。这个build版所使用的代码将被下一个release版沿用。
1.0.1-M5-A8
我决定发布一个新的里程碑(milestone)版是因为我对视图(view)的代码做了一些调整,现在eXtremeTable将能够支持AJAX(而不是局部build)。 在确认release候选版前,这些增加的大的特性能够完美地工作。
下面列出的是eXtremeTable下一个里程碑(milestone)版特性和改进,我希望从上一个里程碑版升级到现在这版没有任何问
题(breakage)。
然而,在完成M4版视图实现后,我决定我必须做最后的更改...将静态builders变为具体的类。这将是唯一可能出现问题(breakage)并且
将只影响到定制视图(定制cells也一样,但是更多的是较平和的deprecated)。尽管那样,这些更改将很容易实现。
Html Builder类具体化
所有的视图builder类具体化,需要被实例化,这些只对开发者需要创建定制试图或cells有影响。
这是因为需要使得视图代码能够像他们需要的那样具有弹性。builder classes是静态的能够很好地工作,但是
将来没有机会来做一些有意义的事,并且创建定制试图更加麻烦。然而,现在这些方法和原来的一样,而仅仅是需要对它进行实例化。
为了使这种转变更容易CellBuilder仍然是静态的,但是现在为deprecated。新的(非静态)builder称为ColumnBuilder,通过这个名称我们能更确切地知道什么被构建了。
public String getHtmlDisplay(TableModel model, Column column) {
ColumnBuilder columnBuilder = new ColumnBuilder(column);
columnBuilder.tdStart();
columnBuilder.tdBody(getCellValue(model, column));
columnBuilder.tdEnd();
return columnBuilder.toString();
}
另一个例子,使用ColumnBuilder定制cells如下:
public String getHtmlDisplay(TableModel model, Column column) {
InputBuilder inputBuilder = new InputBuilder(column);
inputBuilder.tdStart();
try {
Object bean = model.getCurrentRowBean();
Integer id = new Integer(BeanUtils.getProperty(bean, "id"));
inputBuilder.tdBody(id);
} catch (Exception e) {}
inputBuilder.tdEnd();
return inputBuilder.toString();
}
private static class InputBuilder extends ColumnBuilder {
public InputBuilder(Column column) {
super(column);
}
public void tdBody(Integer id) {
getHtmlBuilder().input("radio").name("location.id").id("location.id").value(id.toString()).onclick("populateLocationFields(this.value)");
getHtmlBuilder().xclose();
}
}
}
这样更简洁,只需要扩展你关心的builder,并构建你定制的实现。
另外toolbar被完全重构,但是这个实现被隐藏在ToolbarBuilder类的背后,所以不会有影响。
最后,我探索性地增加了toolbar特性,这样可以在preferences配置表关联到不同的toolbars。
这个特性能够用来动态构造toolbar。这将使开发者很简单地通过preferences来定义一个定制的toolbar。
例如,一个toolbar当使用Limit定制不包含最后一页按钮,或者另一个toolbar不包含rows displayed...
如果你要定制的就是这些东西而不需要别的新的特性,你最好等待一两个星期直到我实现完成。
新的表的showTitle属性
TableTag新的showTitle属性用来确认是否现实title,这是一个boolean值默认为true。
Limit现在能使用State特性
Limit特性为了使用State特性,你需要使用TableLimitFactory的带有state的构造函数,当使用state 特性时,你应该提供唯一的tableId(本例为presidents),带有state的构造函数同时也需要这个tableId。
Context context = new HttpServletRequestContext(request);
LimitFactory limitFactory = new TableLimitFactory(context, presidents, TableConstants.STATE_PERSIST, null);
Limit limit = new TableLimit(limitFactory);
新的列的filterOptions属性/FilterOption接口
TableTag新的filterOptions属性,能够接受一个filter
options的集合,这个集合中的每个bean都实现FilterOption的
接口。被用来和filterCell=droplist结合,当使用Limit时使用定制droplist时非常有用。
导出EXCLE文件时的本地语言的支持
默认的XlsView使用UTF-16编码,这样能够支持对于双字节语言导出。如果要使用unicode,你可以设置 ExportTag的新的encoding属性,这个属性接受的值为:UTF和UNICODE。
删除Compact视图的title的style
当使用compact视图是我硬编码了表的title,这是一个bug。只需要通过CSS的titleRow属性style(或移走)title。
TableModel现在变为接口
TableModel现在变为接口,这只对TableAssembler产生影响。然而,正如下面提到的,使用Java代码来组装一个表将更容易。
TableAssembler整合到TableModel
当使用Java代码来组装一个表将更容易:
TableModel model = new TableModelImpl(context);
Table table = new Table(model);
table.setItems(presidents);
table.setAction("assembler.run");
table.setTitle("Presidents");
table.setShowTooltips(Boolean.FALSE);
model.addTable(table);
Row row = new Row(model);
row.setHighlightRow(Boolean.FALSE);
model.addRow(row);
Column columnName = new Column(model);
columnName.setProperty("fullName");
columnName.setIntercept((AssemblerIntercept.class).getName());
model.addColumn(columnName);
Column columnNickName = new Column(model);
columnNickName.setProperty("nickName");
model.addColumn(columnNickName);
Object view = model.assemble();
重命名FilterSet.getValue()方法
FilterSet.getValue()方法被Deprecated,重命名为FilterSet.getFilterValue()。
删除TableTag的onsubmit
onsubmit被删除,因为javascript被表的所有actions使用。
总计导出
PDF和XLS现在包含总计导出,你只需要和平常一样设置Calc特性。
导出错误-Response头修改
过滤器的response头应该能更好地适应不同环境,在response头后添加:
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
列标签autoGenerateColumns的Preferences
autoGenerateColumns属性现在可以在Preferences文件中配置,可以使用别名来避免全路径引用。
自动转换参数
Registry能够接受null、String、List或者Array作为参数,Registry将把这些转换成String[]。
表的bufferView属性
表的bufferView属性,默认为true将使用视图的默认buffer。如果不需要使用buffer可以设置为false。
eXtremeTable的AJAX特性
当使用eXtremeTable API来通过JAVA代码来创建表时,现在可以结合AJAX技术来生成视图。这意味着
当navigate(比如:翻页)时不需要刷新web页,这令人非常兴奋,关于这个特性的更多的文档将会出来。开发
者能够更好地测试并使用这个特性,这个特性的真正hook是表的onInvokeAction属性,它使得javascript方法
能够被invoked。AJAX整合一个最强大的地方是它不需要整合。下一步是使eXtremeTable有一个清晰并且易于使用的API,
这意味着你可以使用你感兴趣的AJAX技术因为eXtremeTable没有整合一个特定的技术。现在你可以通过CVS得到eXtremeSite代码,
它展示了一个使用AJAX的实例,它现在使用HSQL所以只需要下载并直接运行。请暂时不要向我询问更多的文档,我现在正在整理
并将尽可能快的发布出来。
表的items可以使用Map
表的Items可以使用Map(values),因此可以使用不使用Collection而使用一些key来快速构造。 这个特性正是一个eXtremeComponents使用者需要的。我想这将是一个有趣的特性所以决定在下一个release中发布!
可以定义超过一个显示的行数(rows displayed))
现在可以定义超过一个显示的行数(rows displayed)。这使得在eXtremeTable顶部和底部定义相同的工具条成为可能。
Parameter参数的更多变化
Parameter特性能更好地支持Arrays、Lists、String和其他一些具有toString()的java对象,具有toString()函数能够转换成一个String数组(array),例如:Number。
修正Export viewResolver属性没有被参照
修正Export viewResolver属性没有被真正使用的bug。这使得定制导出时不需要设置view和viewResolver为相同的命名,而可以给出ViewResolver的全路径或者在配置中配置它的别名。
修正在同一个form中使用两个eXtremeTables时导出的问题
修正在同一个form中使用两个eXtremeTables时导出的问题,现在他们能够互不干扰分别导出。我只是重新组织表实例
(instance)参数(现在命名ec_eti为导出表的id),这个参数需要被同一个form中的不同表共享,每次request时候被重新设置
(reset)。
如果form还包含其他的按钮(buttons)被条用,导出完毕后你需要调用resetExportParameters(form,
action),它包含在extremecomponents.js文件中。第一个参数是当前的form,第二个参数是form的action。这个是因
为导出使用javaScript进行调用,没有别的办法重新自动reset它。
resetExportParameters做的就是将导出表的id置为空(null),并且将form
action设置为原来的值。这很不幸,但是我想不出别的处理方法。
Note: 这个修正也关系到State特性。当使用State设置为persist时,导出也会出现问题。
table.imagePath配置(preference)添加上下文路径(contextPath )
如果table.imagePath的上下文路径(context
path)没有在配置文件(Preferences)中指定,那么将给它自动指定一个。然而,如果路径以表示绝对路径“/”开始,将只给它提供一个上下文
(context)而上下文(contextPath)并没有插入。
使用javascript设置form的method属性
当翻页、过滤、排序时将使用javascript来设置form的method属性。以前只是设置了form的action属性,为了完整性现在也设置了form的method属性。
Bullet Proof Limit feature
如果传入不正确的数据到LimitCallback时,Limit只记录(log)并显示一个警告(warning)。
Intercept被重命名为Interceptor
intercept特性被重命名为interceptor。因此我们现在的interceptors有:TableInterceptor、
RowInterceptor、ExportInterceptor和ColumnInterceptor。他们现在在interceptor包中。遍更
的原因是intercept不如interceptor能给大家提供一种表明他们作用更好的直觉。我不向提供一种我不喜欢的命名。然而,这些方法名都一样
所以能够将他们集中到一个正确的包中。
0
0