这几天捣鼓了一下struts-layout这个TagLib,当然,因为应用的关系,只适用了其collection列表相关的部分,总体来说感觉是不错的,比如对分页和排序都提供了比较不错的解决方案,虽然现在对于sortType的支持还很局限。
但是,却依然也存在一些缺陷,让你不得不“重写一些方法,甚至覆盖一个完整的类来完善”,当然,这本身也是TagLib机制本身的缺陷之一,至少JSP TagLib的扩展机制不够良好。
Struts-Layout虽然支持整个列表的styleClass和collectionItem到styleClass的样式设置,但唯独缺少了对TR(每行)的样式设置。—— 这种缺陷是很严重了,特别是对于国内web应用来说,实现隔行换色、选行着色之类的应用,要大打折扣了。
正如刚刚所说的那样,TagLib的机制是“限制型”的,属性一旦申明是不可扩展的;其次,Struts-Layout在实现过程中,对于行为,也没有提供比较好的“接口化扩展”。比如对于某一行的渲染,其代码是写死在BasicCollection类中的,而没有任何其他可以“Plugin”的接口或途径。
为了让Struts-Layout的Collection Tag能够支持设置TR的渲染样式,我不得不做了如下的操作:
(1)重新写了一个类XXXCollectionTag extends CollectionTag,重新申明了一个styleClassTR的属性;
(2)重写了XXXBasicCollection extends BasicCollection,重写写一个doStartItem这个方法。
(3)修改struts-layout.tld文件,增加一个collection tag的属性描述。
(4)修改了Struts-Layout.properties配置文件,如下:
# implementor of the CollectionInterface to use collection.class = fr.improve.struts.taglib.layout.util.BasicCollection |