近日使用了一下Apache的开源项目-DisplayTag,在这里希望和大家一起讨论一下这个tag的使用范围与优缺点。
DisplayTag是一个非常好用的表格显示标签,适合MVC模式,其主页(下载地址)在http://displaytag.sourceforge.net 。
使用起来非常简单:下文
<%request.setAttribute( "test", new ReportList(6) );%>
<display:table name="test" style="width:1000px" class="report" requestURI="" pagesize="20" export="true" >
<display:column property="" title="Enquiry Type" style="width:100px" sortable="true" /><!-- headerClass="" -->
<display:column property="" style="width:90px" title="" />
<display:column property="" style="width:90px" title="" />
<display:column property="" style="width:80px" title="" />
<display:column decorator="" property="" style="width:80px" title="Date"/>
<display:column property="" style="width:100px" title="" sortable="true" />
<display:column property="" style="width:80px" title="" />
<display:column property="" style="width:400px" title="Remarks" />
<display:setProperty name="export.csv" value="true" />
<display:setProperty name="export.pdf" value="true" />
<display:setProperty name="export.xml" value="false" />
</display:table>
name="test",这个test是request中的一个属性,其类型为List,List中可以是一个Map,封装了所有从数据库中Load出来的数据。
<display:setProperty name="export.xml" value="false" />指定导出的格式,其属性value,为true代表使用其导出格式,为false代表不使用其导出格式。
通过增加id属性创建隐含的对象
<display:table name="test" id="testit">
<display:column property="id" title="ID" />
<display:column property="name" />
<display:column title="static value">static</display:column>
<display:column title="row number (testit_rowNum)"><%=pageContext.
getAttribute("testit_rowNum")%></display:column>
<display:column title="((ListObject)testit).getMoney()">
<%=((ListObject)pageContext.
getAttribute("testit")).getMoney()%></display:column>
</display:table>
显示开始五条数据:通过设定length属性
<display:table name="test" length="5">
显示第三到第八条数据:通过设定offset和length属性
<display:table name="test" offset="3" length="5">
对email和url地址的直接连接
<display:table name="test" >
<display:column property="id" title="ID" />
<display:column property="email" autolink="true" />
<display:column property="url" autolink="true" />
</display:table>
排序
排序实现也是很简单,在需要排序的column里增加sortable="true"属性,headerClass="sortable"仅仅是
指定显示的样式。
column 分组
分组只是需要在column里增加group属性
<display:table name="test" class="simple">
<display:column property="city" title="CITY" group="1"/>
<display:column property="project" title="PROJECT" group="2"/>
<display:column property="amount" title="HOURS"/>
<display:column property="task" title="TASK"/>
</display:table>
配置属性,覆盖默认
两种方法:
A、在程序classpath下新建displaytag.properties文件
B、对于单个表格,应用<display:setProperty>标签
DisplayTag七宗罪 Display Tag Lib是一个标签库,主要用来处理jsp网页上的Table,功能非常强,可以对的Table进行分页、数据导出、分组、对列排序等等,而且使用起来非常的方便,能够大大减少代码量. 记得有N多朋友问过分页问题如何可以更加方便、快速的处理,我的回答好象每次都是"DisplayTag",然后步骤相同的向朋友讲它有什么功能、能减少多少编码量、发文档、如何看war例子.以至于当时都想把操作过程录下来,来降低我的口水消耗量. 俗话说得好"路遥知马力",经过不断的使用,感觉DisplayTag"肾虚"了,问题与缺陷来越多.现在还在使用它的朋友,如果已经放弃不用,那么就别浪费时间看这个了;如果还在使用的朋友,最好能看看我总结的DisplayTag罪状,倒能弥补些缺陷,不至于问题出现时记恨在下.呵呵. 1.中文翻页、排序问题:对于中文无法翻页、排序,最简单的办法是修改Tomcat下的server.xml文件.找到HTTP的Connector标签,在里面添加一项URIEncoding="...",引号里面的内容取决于你的页面编码,比如可以是GBK,UTF-8等. 2.分页数据加载问题:DisplayTag的分页机制是这样的,它把所有的数据放入集合中,然后再进行分页处理.这样在数据量比较大的情况下,很容易造成性能下降或者内存超支等问题.目前解决方法有两个,一是在<displaytag>中增加两个属性:partialList="true"size="resultSize",每次只加再当前页数据.还有就是实现 org.displaytag.pagination.PaginatedList接口,自定义分页算法.个人推荐第二种,详细的实现方法可参考DisplayTag 1.1所带的例子. 3.导出中文Excel问题:当导出中文列表名和中文表格数据Excel时,会产生乱码现象. old: new: 还有一种通过修改编码方式来支持中文的方法,那就是将org.displaytag.export.ExcelView.java中的getMimeType()方法内容修改为return "application/vnd.ms-excel;charset=GB2312";但是这样修改后,导出速度将会非常慢,呵呵. 4.decorator内容无法导出问题和Html标签导出问题:如果对table进行了decorator,那么decorator后的内容将无法导出.目前此问题无法解决.所以最好不用decorator.如果显示的内容使用了html标签进行了修饰,那么它会将html标签一起导出.也是没有什么好的解决方法. 5.导出Excel兼容性问题:有时会出现兼容性问题,导出的Excel在Office 2003下打不开. 6.同页面使用多个displayTag翻页问题.DisplayTag翻页时,页面上所有的displayTag元素都翻页.解决办法:对页面中的每个表格,先判断它的记录是否为0,如果为0则不使用DisplayTag. 7.未知Bug比较多:正式发布版本总是存在很多Bug.在1.1版本发布时,居然分页算法出现了明显Bug, |
但是,此控件个人建议适合小型项目使用。
在1.1版本上做了不少更新,大家可以参考以下其帮助文档。