﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-seasun-随笔分类-1.9 displaytag</title><link>http://www.blogjava.net/shiwenfeng/category/42493.html</link><description>在不断模仿、思考、总结中一步一步进步！</description><language>zh-cn</language><lastBuildDate>Fri, 30 Oct 2009 04:26:58 GMT</lastBuildDate><pubDate>Fri, 30 Oct 2009 04:26:58 GMT</pubDate><ttl>60</ttl><item><title>DisplayTag应用指南</title><link>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300317.html</link><dc:creator>shiwf</dc:creator><author>shiwf</author><pubDate>Fri, 30 Oct 2009 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300317.html</guid><wfw:comment>http://www.blogjava.net/shiwenfeng/comments/300317.html</wfw:comment><comments>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shiwenfeng/comments/commentRss/300317.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shiwenfeng/services/trackbacks/300317.html</trackback:ping><description><![CDATA[<span class="hilite1"><span style="color: #993300">转载：<a style="color: #993300" href="http://www.javaeye.com/topic/24869">http://www.javaeye.com/topic/24869</a></span><br />
DisplayTag</span>是一个非常好用的表格显示标签，适合MVC模式，其主页在http://<span class="hilite1">displaytag</span>.sourceforge.net/&nbsp; <br />
一、最简单的情况，未使用&lt;display:column/&gt;标签 <br />
&nbsp; &lt;%request.setAttribute( "test", new ReportList(6) );%&gt; <br />
&nbsp; &lt;display:table name="test" /&gt; <br />
&nbsp; 标签遍历List里的每一个对象，并将对象里的所有属性显示出来。一般用于开发的时候检查对象数据的完整性。 <br />
&nbsp; <br />
二、使用&lt;display:column/&gt;标签的情况 <br />
&lt;display:table name="test"&gt; <br />
&nbsp; &lt;display:column property="id" title="ID" /&gt; <br />
&nbsp; &lt;display:column property="name" /&gt; <br />
&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp; &lt;display:column property="status" /&gt; <br />
&nbsp; &lt;display:column property="description" title="Comments"/&gt; <br />
&lt;/display:table&gt; <br />
&nbsp;&nbsp; property对应List里对象的属性（用getXXX()方法取得），title则对应表格表头里的列名。定义列有两种方式： <br />
&nbsp;&nbsp; A、&lt;display:column property="email" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用&lt;display:column/&gt;标签里的property属性来定义 <br />
&nbsp;&nbsp; B、&lt;display:column title="email"&gt;email@it.com&lt;/display:column&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在&lt;display:column/&gt;标签体里增加内容，可以是常量，也可以用其他标签等等 <br />
&nbsp;&nbsp; 两种方式比较，用property属性来定义更加快速和利于排序。 <br />
&nbsp;&nbsp; <br />
三、表格显示样式的定义 <br />
&nbsp; A、在&lt;display:table/&gt;和&lt;display:column/&gt;标签里指定标准的html属性，烦琐 <br />
&nbsp; B、修改样式表 <br />
&lt;display:table name="test" class="mars"&gt; <br />
&nbsp; &lt;display:column property="id" title="ID" class="idcol"/&gt; <br />
&nbsp; &lt;display:column property="name" /&gt; <br />
&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp; &lt;display:column property="status" class="tableCellError" /&gt; <br />
&nbsp; &lt;display:column property="description" title="Comments"/&gt; <br />
&lt;/display:table&gt; <br />
&nbsp;&nbsp; 通过class属性来指定所要应用的样式。可以在其默认样式表里（./css/screen.css）直接修改 <br />
&nbsp;&nbsp; <br />
四、标签取得数据的数据源 <br />
&nbsp; 有四种范围 <br />
&nbsp;&nbsp; pageScope <br />
&nbsp;&nbsp; requestScope (默认)&nbsp; &lt;display:table name="test2" &gt; <br />
&nbsp;&nbsp; sessionScope&nbsp; &lt;display:table name="sessionScope.holder.list" &gt; 注意，这里要指定范围，非默认 <br />
&nbsp;&nbsp; applicationScope <br />
&nbsp;&nbsp; <br />
五、通过增加id属性创建隐含的对象 <br />
&lt;display:table name="test" id="testit"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column property="id" title="ID" /&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column property="name" /&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column title="static value"&gt;static&lt;/display:column&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column title="row number (testit_rowNum)"&gt;&lt;%=pageContext.getAttribute("testit_rowNum")%&gt;&lt;/display:column&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column title="((ListObject)testit).getMoney()"&gt;&lt;%=((ListObject)pageContext.getAttribute("testit")).getMoney()%&gt;&lt;/display:column&gt; <br />
&lt;/display:table&gt; <br />
&nbsp;&nbsp; 注意到在&lt;display:table/&gt;里增加了id属性，这时就在page context里创建了一个隐含对象，指向List里的当前对象， <br />
&nbsp;&nbsp; 可以通过(ListObject)pageContext.getAttribute("id")来捕获这个对象。同时还创建了一个id_rowNum对象，同样，可 <br />
&nbsp;&nbsp; 通过pageContext.getAttribute("testit_rowNum")来捕获，它仅仅代表当前行的行数。 <br />
&nbsp;&nbsp; 有了这两个隐含对象，就可以通过其他标签来访问，例如Jstl: <br />
&nbsp; &lt;display:table id="row" name="mylist"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column title="row number" &gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:out value="${row_rowNum}"/&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/display:column&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column title="name" &gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:out value="${row.first_name}"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:out value="${row.last_name}"/&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/display:column&gt; <br />
&nbsp; &lt;/display:table&gt; <br />
&nbsp; <br />
六、显示部分数据 <br />
&nbsp;&nbsp; 显示开始五条数据：通过设定length属性 <br />
&lt;display:table name="test" length="5"&gt; <br />
&nbsp; &lt;display:column property="id" title="ID" /&gt; <br />
&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp; &lt;display:column property="status" /&gt; <br />
&lt;/display:table&gt; <br />
&nbsp;&nbsp; 显示第三到第八条数据：通过设定offset和length属性 <br />
&lt;display:table name="test" offset="3" length="5"&gt; <br />
&nbsp; &lt;display:column property="id" title="ID" /&gt; <br />
&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp; &lt;display:column property="status" /&gt; <br />
&lt;/display:table&gt;&nbsp; <br />
<br />
七、对email和url地址的直接连接 <br />
&lt;display:table name="test" &gt; <br />
&nbsp; &lt;display:column property="id" title="ID" /&gt; <br />
&nbsp; &lt;display:column property="email" autolink="true" /&gt; <br />
&nbsp; &lt;display:column property="url" autolink="true" /&gt; <br />
&lt;/display:table&gt; <br />
如果要显示的对象里包含email和url地址，则可以在display:column里直接设定autolink="true"来直接连接 <br />
<br />
八、使用装饰模式转换数据显示（写自己的 decorator ） <br />
&nbsp; A、对整个表格应用decorator <br />
&nbsp; &lt;display:table name="test" decorator="org.<span class="hilite1">displaytag</span>.sample.Wrapper" &gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display:column property="id" title="ID" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display:column property="status" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display:column property="date" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display:column property="money" /&gt; <br />
&nbsp; &lt;/display:table&gt; <br />
&nbsp;&nbsp;&nbsp; org.<span class="hilite1">displaytag</span>.sample.Wrapper即自己写的decorator，它要继承TableDecorator类，看看它的一个方法： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getMoney() <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.moneyFormat.format(((ListObject) this.getCurrentRowObject()).getMoney()); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; 很明显，它通过父类的getCurrentRowObject()方法获得当前对象，然后对其getMoney()方法进行&#8216;油漆&#8217; <br />
&nbsp; B、对单独的column应用decorator <br />
&nbsp; &lt;display:table name="test"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;display:column property="id" title="ID" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;display:column property="status" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;display:column property="date" decorator="org.<span class="hilite1">displaytag</span>.sample.LongDateWrapper" /&gt; <br />
&nbsp; &lt;/display:table&gt; <br />
&nbsp;&nbsp;&nbsp; org.<span class="hilite1">displaytag</span>.sample.LongDateWrapper要实现ColumnDecorator接口，它的方法： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public final String decorate(Object columnValue) <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date date = (Date) columnValue; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.dateFormat.format(date); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; 显然，它获得不了当前对象（因为它实现的是接口），仅仅是获得该对象的columnValue，然后&#8216;油漆&#8217; <br />
&nbsp;&nbsp;&nbsp; <br />
九、创建动态连接 <br />
&nbsp;&nbsp; 有两种方法创建动态连接： <br />
&nbsp;&nbsp; A、在&lt;display:column/&gt;里通过增加href、paramId、paramName、paramScope、paramProperty属性 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; href&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本的URL 地址 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加在URL 地址后的参数名称 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据bean的名称，一般为null（即使用当前List里的对象） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramScope&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据bean的范围，一般为null <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paramProperty&nbsp;&nbsp;&nbsp; 数据bean的属性名称，用来填充URL 地址后的参数值 <br />
&lt;display:table name="sessionScope.details"&gt; <br />
&nbsp; &lt;display:column property="id" title="ID" href="details.jsp" paramId="id" /&gt; <br />
&nbsp; &lt;display:column property="email" href="details.jsp" paramId="action" paramName="testparam" paramScope="request" /&gt; <br />
&nbsp; &lt;display:column property="status" href="details.jsp" paramId="id" paramProperty="id" /&gt; <br />
&lt;/display:table&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 这种方法简便直接，但缺点是无法产生类似details.jsp?id=xx&amp;action=xx的复合URL <br />
&nbsp;&nbsp; B、应用decorator 创建动态连接： <br />
&lt;display:table name="sessionScope.details" decorator="org.<span class="hilite1">displaytag</span>.sample.Wrapper" &gt; <br />
&nbsp; &lt;display:column property="link1" title="ID" /&gt; <br />
&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp; &lt;display:column property="link2" title="Actions" /&gt; <br />
&lt;/display:table&gt; <br />
&nbsp;&nbsp; org.<span class="hilite1">displaytag</span>.sample.Wrapper里的方法： <br />
&nbsp;&nbsp;&nbsp; public String getLink1() <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListObject lObject= (ListObject)getCurrentRowObject(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lIndex= getListIndex(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "&lt;a href=\"details.jsp?index=" + lIndex + "\"&gt;" + lObject.getId() + "&lt;/a&gt;"; <br />
&nbsp;&nbsp;&nbsp; } <br />
<br />
<br />
&nbsp;&nbsp;&nbsp; public String getLink2() <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListObject lObject= (ListObject)getCurrentRowObject(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lId= lObject.getId(); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "&lt;a href=\"details.jsp?id=" + lId <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&amp;action=view\"&gt;View&lt;/a&gt; | " <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&lt;a href=\"details.jsp?id=" + lId <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&amp;action=edit\"&gt;Edit&lt;/a&gt; | " <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&lt;a href=\"details.jsp?id=" + lId <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&amp;action=delete\"&gt;Delete&lt;/a&gt;"; <br />
&nbsp;&nbsp;&nbsp; } <br />
<br />
十、分页 <br />
&nbsp;&nbsp; 实现分页非常的简单，增加一个pagesize属性指定一次想显示的行数即可 <br />
&lt;display:table name="sessionScope.test" pagesize="10"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column property="id" title="ID" /&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column property="name" /&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;display:column property="status" /&gt; <br />
&lt;/display:table&gt; <br />
<br />
十一、排序 <br />
&nbsp;&nbsp; 排序实现也是很简单，在需要排序的column里增加sortable="true"属性，headerClass="sortable"仅仅是 <br />
&nbsp;&nbsp; 指定显示的样式。column里的属性对象要实现Comparable接口，如果没有的话可以应用decorator <br />
&nbsp;&nbsp; defaultsort="1"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认第一个column排序 <br />
&nbsp;&nbsp; defaultorder="descending"&nbsp;&nbsp;&nbsp; 默认递减排序 <br />
&lt;display:table name="sessionScope.stest" defaultsort="1" defaultorder="descending"&gt; <br />
&nbsp; &lt;display:column property="id" title="ID" sortable="true" headerClass="sortable" /&gt; <br />
&nbsp; &lt;display:column property="name" sortable="true" headerClass="sortable"/&gt; <br />
&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp; &lt;display:column property="status" sortable="true" headerClass="sortable"/&gt; <br />
&lt;/display:table&gt; <br />
&nbsp; 注意的是，当同时存在分页时如果不指定sort=list,则排序仅仅针对的是当前页面，而不是整个List都进行排序 <br />
&nbsp; <br />
十二、column 分组 <br />
&nbsp;&nbsp; 分组只是需要在column里增加group属性 <br />
&lt;display:table name="test" class="simple"&gt; <br />
&nbsp; &lt;display:column property="city" title="CITY" group="1"/&gt; <br />
&nbsp; &lt;display:column property="project" title="PROJECT" group="2"/&gt; <br />
&nbsp; &lt;display:column property="amount" title="HOURS"/&gt; <br />
&nbsp; &lt;display:column property="task" title="TASK"/&gt; <br />
&lt;/display:table&gt; <br />
<br />
十三、导出数据到其他格式（页面溢出filter??） <br />
&nbsp;&nbsp; 在&lt;display:table/&gt;里设定export="true" <br />
&nbsp;&nbsp; 在&lt;display:column/&gt;里设定media="csv excel xml pdf" 决定该字段在导出到其他格式时被包不包含，不设定则都包含 <br />
&nbsp;&nbsp; &lt;display:setProperty name="export.csv" value="false" /&gt; <br />
&nbsp;&nbsp; 决定该种格式能不能在页面中导出 <br />
&lt;display:table name="test" export="true" id="currentRowObject"&gt; <br />
&nbsp; &lt;display:column property="id" title="ID"/&gt; <br />
&nbsp; &lt;display:column property="email" /&gt; <br />
&nbsp; &lt;display:column property="status" /&gt; <br />
&nbsp; &lt;display:column property="longDescription" media="csv excel xml pdf" title="Not On HTML"/&gt; <br />
&nbsp; &lt;display:column media="csv excel" title="URL" property="url"/&gt; <br />
&nbsp; &lt;display:setProperty name="export.pdf" value="true" /&gt; <br />
&nbsp; &lt;display:setProperty name="export.csv" value="false" /&gt; <br />
&lt;/display:table&gt; <br />
<br />
十四、配置属性，覆盖默认 <br />
&nbsp; 两种方法： <br />
&nbsp; A、在程序classpath下新建<span class="hilite1">displaytag</span>.properties文件 <br />
&nbsp; B、对于单个表格，应用&lt;display:setProperty&gt;标签 <br />
&nbsp; 具体可配置的属性：http://<span class="hilite1">displaytag</span>.sourceforge.net/configuration.html <br />
&nbsp; <br />
十五、一个完整的例子 <br />
&lt;display:table name="test" export="true" sort="list" pagesize="8"&gt; <br />
&nbsp; &lt;display:column property="city" title="CITY" group="1" sortable="true" headerClass="sortable"/&gt; <br />
&nbsp; &lt;display:column property="project" title="PROJECT" group="2" sortable="true" headerClass="sortable"/&gt; <br />
&nbsp; &lt;display:column property="amount" title="HOURS"/&gt; <br />
&nbsp; &lt;display:column property="task" title="TASK"/&gt; <br />
&lt;/display:table&gt; <br />
&nbsp;&nbsp; sort="list" 对整个list进行排序 <br />
&nbsp;&nbsp; 导出数据到其他格式时，group无效 <br />
<br />
<br />
<img src ="http://www.blogjava.net/shiwenfeng/aggbug/300317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shiwenfeng/" target="_blank">shiwf</a> 2009-10-30 11:38 <a href="http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DisplayTag导出Excel的处理过程</title><link>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300315.html</link><dc:creator>shiwf</dc:creator><author>shiwf</author><pubDate>Fri, 30 Oct 2009 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300315.html</guid><wfw:comment>http://www.blogjava.net/shiwenfeng/comments/300315.html</wfw:comment><comments>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shiwenfeng/comments/commentRss/300315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shiwenfeng/services/trackbacks/300315.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;项目中需要将查询结果导出成Excel，由于使用了DisplayTag，知道这个标签库具有导出Excel的功能，不过之前一直没有使用过，刚好今天体验一把。<br />
使用实在是太Easy了，只需要在display:table标签上设置一下参数，export="true"，就可以在表格下边看到导出Excel的链接了，其他什么都不用做！<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;对他的实现方式有点好奇，遂查看一下这个导出功能的链接，乖乖，那是相当简洁啊，就是把我这个页面的全部参数添加到URL里，然后附加上了几个奇怪数字组成的参数，估计就是DisplayTag用来识别我要做导出操作的了。从这个链接来看，做导出操作时还是要到我这个Action去进行逻辑处理，但我这个Action输出的内容可是一个完整的HTML，而不是Excel啊，他是怎么实现的呢？带着个大大的问号，开始去挖源代码。顺便提一下，m2eclipse确实方便，不但帮我管理了项目的依赖，还能帮我把源代码拽下来关联到相应的jar，所以我直接在项目依赖里面找到displaytag.jar，就可以查看源代码了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;代码其实很简单，其实是利用了ServletRsponse的缓存机制，当我们调用response.getWriter().print()方法时，打印的内容是不会立即发送到客户端的，在发送到客户端之前，还可以对其进行操作，哈哈，有点明白了吧？DisplayTag就是利用了这个原理，在TableTag这个类中，导出Excel时，趁ServletResponse还没有提交到客户端，先执行了一下response.reset()和pageContext.getOut().clearBuffer()，这样就把前面jsp里面输出的所有内容都清除掉了~然后再使用response.setContentType()重新设置文件类型，输出表格内容，完事了再返回Tag.SKIP_PAGE，这样JSP里面剩下的内容也不会再输出了，客户端得到的就完全是在DisplayTag控制下的内容了，牛吧！<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;其实这个response.reset以前也见过，读servlet API文档时也看过方法的解释，但如果不是今天看这个Display的源代码，还真不会想到这样子来应用，看来这就是理论和实践的差距呀！！！<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;PS:上面这种方法，只适用于输出文本内容。DisplayTag自带的Excel导出工具其实就是输出了一个csv文件，把扩展名改成xls了而已。如果要输出真正的xls文件获者PDF这样的二进制文件，使用上面的方法在某些中间件上就会有问题了。因为原则上response.getOutputStream方法是只能被调用一次的，这在进入jsp处理时就被调用了，而输出PDF文件这样二进制流时又必须使用这个方法，那就出错了。DisplayTag很巧妙的提供了一个Filter，对标准的ServletRepsonse做了一个包装(Wrap)，在执行Export导出时，如果是jsp等其他请求执行的response.getOutputStream，就返回自己的一个缓存的OutputStream，而不是真正去调用容器的这个方法。直到执行Export时，才去调用容器的方法，保证这个response.getOutputStream只执行一次。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;DisplayTag的地址：http://displaytag.sourceforge.net/1.2/index.html，很简单，很强大，强烈推荐，可以少写N多表格和分页标签<br />
<br />
<br />
<br />
 <img src ="http://www.blogjava.net/shiwenfeng/aggbug/300315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shiwenfeng/" target="_blank">shiwf</a> 2009-10-30 11:29 <a href="http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>displaytag.properties 文件的详细说明</title><link>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300314.html</link><dc:creator>shiwf</dc:creator><author>shiwf</author><pubDate>Fri, 30 Oct 2009 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300314.html</guid><wfw:comment>http://www.blogjava.net/shiwenfeng/comments/300314.html</wfw:comment><comments>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shiwenfeng/comments/commentRss/300314.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shiwenfeng/services/trackbacks/300314.html</trackback:ping><description><![CDATA[<p>displaytag.properties文件位于displaytag-1.x.jar中的org.displaytag.properties下<br />
<br />
打开这个文件，复制一份并作相应修改保存到classes目录下，就可以对View中的表格显示形式做相应的设置<br />
Java代码 <br />
basic.empty.showtable=false #设置当数据为空时，是不是显示表格 true表示显示表格&nbsp;&nbsp; <br />
basic.show.header=true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #设置当数据为空时，显示的表格是否有表头 true表示显示&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp; <br />
# page | list 设置排序的数据量 相当于jsp页面中display标签中的page属性&nbsp;&nbsp; <br />
sort.amount=page&nbsp;&nbsp; <br />
&nbsp; <br />
export.amount=list&nbsp; #导出的数据量&nbsp;&nbsp; <br />
export.decorated=true&nbsp; <br />
&nbsp; <br />
paging.banner.group_size=8&nbsp; #前台显示的最多页数 8 表示最多显示8页&nbsp;&nbsp; <br />
paging.banner.placement=top&nbsp; #前台显示中"上一页/下一页"文字的位置 top表示上面 bottom表示下面&nbsp;&nbsp; <br />
&nbsp; <br />
css.tr.even=even #偶数行的css标识 就是偶数行的css类 下面几个也是设置相应的css&nbsp; class&nbsp; <br />
css.tr.odd=odd&nbsp;&nbsp; <br />
css.th.sorted=sorted&nbsp;&nbsp; <br />
css.th.ascending=order1&nbsp;&nbsp; <br />
css.th.descending=order2&nbsp;&nbsp; <br />
css.table=&nbsp;&nbsp; <br />
css.th.sortable=sortable&nbsp;&nbsp; <br />
&nbsp; <br />
# factory classes for extensions&nbsp;&nbsp; <br />
factory.requestHelper=org.displaytag.util.DefaultRequestHelperFactory&nbsp;&nbsp; <br />
&nbsp; <br />
# factory class for decorators&nbsp;&nbsp; <br />
factory.decorator=org.displaytag.decorator.DefaultDecoratorFactory&nbsp;&nbsp; <br />
&nbsp; <br />
# locale provider (Jstl provider by default)&nbsp;&nbsp; <br />
locale.provider=org.displaytag.localization.I18nJstlAdapter&nbsp;&nbsp; <br />
&nbsp; <br />
# locale.resolver (nothing by default, simply use locale from request)&nbsp;&nbsp; <br />
#locale.resolver=&nbsp;&nbsp; <br />
&nbsp; <br />
export.types=csv excel xml pdf&nbsp;&nbsp; <br />
&nbsp; <br />
export.csv.class=org.displaytag.export.CsvView&nbsp;&nbsp; <br />
export.excel.class=org.displaytag.export.ExcelView&nbsp;&nbsp; <br />
export.xml.class=org.displaytag.export.XmlView&nbsp;&nbsp; <br />
export.pdf.class=org.displaytag.export.PdfView&nbsp;&nbsp; <br />
#export.***设置为true表示显示这种导出方式 false为不采用&nbsp;&nbsp; <br />
export.csv=true&nbsp; <br />
export.csv.label=&lt;span class="export csv"&gt;CSV &lt;/span&gt;&nbsp;&nbsp; <br />
export.csv.include_header=false&nbsp; <br />
export.csv.filename=&nbsp;&nbsp; <br />
&nbsp; <br />
export.excel=true&nbsp; <br />
export.excel.label=&lt;span class="export excel"&gt;Excel &lt;/span&gt;&nbsp;&nbsp; <br />
export.excel.include_header=true&nbsp; <br />
export.excel.filename=&nbsp;&nbsp; <br />
&nbsp; <br />
export.xml=true&nbsp; <br />
export.xml.label=&lt;span class="export xml"&gt;XML &lt;/span&gt;&nbsp;&nbsp; <br />
export.xml.filename=&nbsp;&nbsp; <br />
&nbsp; <br />
export.pdf=false&nbsp; <br />
export.pdf.label=&lt;span class="export pdf"&gt;PDF &lt;/span&gt;&nbsp;&nbsp; <br />
export.pdf.include_header=true&nbsp; <br />
export.pdf.filename=&nbsp;&nbsp; <br />
&nbsp; <br />
export.rtf=false&nbsp; <br />
export.rtf.label=&lt;span class="export rtf"&gt;RTF &lt;/span&gt;&nbsp;&nbsp; <br />
export.rtf.include_header=true&nbsp; <br />
export.rtf.filename=&nbsp;&nbsp; <br />
&nbsp; <br />
# messages&nbsp;&nbsp; <br />
#相应的显示信息 包括空数据时候显示的 下两个显示的位置不一样 一个是在table中&nbsp; 一个是在下面&nbsp;&nbsp; <br />
basic.msg.empty_list=Nothing found to display.&nbsp;&nbsp;&nbsp;&nbsp; <br />
basic.msg.empty_list_row=&lt;tr class="empty"&gt;&lt;td colspan="{0}"&gt;Nothing found to display.&lt;/td&gt;&lt;/tr&gt;&nbsp;&nbsp; <br />
error.msg.invalid_page=invalid page&nbsp;&nbsp; <br />
&nbsp; <br />
export.banner=&lt;div class="exportlinks"&gt;Export options: {0}&lt;/div&gt;#导出处的提示文字&nbsp;&nbsp; <br />
export.banner.sepchar= | #导出处的提示文字分隔符&nbsp;&nbsp; <br />
&nbsp; <br />
paging.banner.item_name=item&nbsp;&nbsp;&nbsp; <br />
paging.banner.items_name=items&nbsp;&nbsp; <br />
&nbsp; <br />
paging.banner.no_items_found=&lt;span class="pagebanner"&gt;No {0} found.&lt;/span&gt;&nbsp;&nbsp; <br />
paging.banner.one_item_found=&lt;span class="pagebanner"&gt;One {0} found.&lt;/span&gt;&nbsp;&nbsp; <br />
paging.banner.all_items_found=&lt;span class="pagebanner"&gt;{0} {1} found, displaying all {2}.&lt;/span&gt;&nbsp;&nbsp; <br />
paging.banner.some_items_found=&lt;span class="pagebanner"&gt;{0} {1} found, displaying {2} to {3}.&lt;/span&gt;&nbsp;&nbsp; <br />
&nbsp; <br />
paging.banner.full=&lt;span class="pagelinks"&gt;[&lt;a href="{1}"&gt;First&lt;/a&gt;/&lt;a href="{2}"&gt;Prev&lt;/a&gt;] {0} [&lt;a href="{3}"&gt;Next&lt;/a&gt;/&lt;a href="{4}"&gt;Last&lt;/a&gt;]&lt;/span&gt;&nbsp;&nbsp; <br />
paging.banner.first=&lt;span class="pagelinks"&gt;[First/Prev] {0} [&lt;a href="{3}"&gt;Next&lt;/a&gt;/&lt;a href="{4}"&gt;Last&lt;/a&gt;]&lt;/span&gt;&nbsp;&nbsp; <br />
paging.banner.last=&lt;span class="pagelinks"&gt;[&lt;a href="{1}"&gt;First&lt;/a&gt;/&lt;a href="{2}"&gt;Prev&lt;/a&gt;] {0} [Next/Last]&lt;/span&gt;&nbsp;&nbsp; <br />
paging.banner.onepage=&lt;span class="pagelinks"&gt;{0}&lt;/span&gt;&nbsp;&nbsp; <br />
&nbsp; <br />
paging.banner.page.selected=&lt;strong&gt;{0}&lt;/strong&gt;&nbsp;&nbsp; <br />
paging.banner.page.link=&lt;a href="{1}" title="Go to page {0}"&gt;{0}&lt;/a&gt;&nbsp;&nbsp; <br />
paging.banner.page.separator=, \&nbsp;&nbsp; <br />
&nbsp; <br />
# external sort and pagination&nbsp;&nbsp; <br />
pagination.sort.param=sort&nbsp;&nbsp; <br />
pagination.sortdirection.param=dir&nbsp;&nbsp; <br />
pagination.pagenumber.param=page&nbsp;&nbsp; <br />
pagination.searchid.param=searchid&nbsp;&nbsp; <br />
pagination.sort.asc.value=asc&nbsp;&nbsp; <br />
pagination.sort.desc.value=desc&nbsp;&nbsp; <br />
pagination.sort.skippagenumber=true&nbsp; <br />
&nbsp; <br />
# unused&nbsp;&nbsp; <br />
save.excel.banner=&lt;a href="{0}" rel="external"&gt;save ({1} bytes)&lt;/a&gt;&nbsp;&nbsp; <br />
save.excel.filename=export.xls&nbsp; <br />
basic.empty.showtable=false #设置当数据为空时，是不是显示表格 true表示显示表格<br />
basic.show.header=true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #设置当数据为空时，显示的表格是否有表头 true表示显示</p>
<p># page | list 设置排序的数据量 相当于jsp页面中display标签中的page属性<br />
sort.amount=page<br />
export.amount=list&nbsp; #导出的数据量<br />
export.decorated=true<br />
paging.banner.group_size=8&nbsp; #前台显示的最多页数 8 表示最多显示8页<br />
paging.banner.placement=top&nbsp; #前台显示中"上一页/下一页"文字的位置 top表示上面 bottom表示下面<br />
css.tr.even=even #偶数行的css标识 就是偶数行的css类 下面几个也是设置相应的css&nbsp; class<br />
css.tr.odd=odd<br />
css.th.sorted=sorted<br />
css.th.ascending=order1<br />
css.th.descending=order2<br />
css.table=<br />
css.th.sortable=sortable<br />
# factory classes for extensions<br />
factory.requestHelper=org.displaytag.util.DefaultRequestHelperFactory<br />
# factory class for decorators<br />
factory.decorator=org.displaytag.decorator.DefaultDecoratorFactory<br />
# locale provider (Jstl provider by default)<br />
locale.provider=org.displaytag.localization.I18nJstlAdapter<br />
# locale.resolver (nothing by default, simply use locale from request)<br />
#locale.resolver=<br />
export.types=csv excel xml pdf<br />
export.csv.class=org.displaytag.export.CsvView<br />
export.excel.class=org.displaytag.export.ExcelView<br />
export.xml.class=org.displaytag.export.XmlView<br />
export.pdf.class=org.displaytag.export.PdfView<br />
#export.***设置为true表示显示这种导出方式 false为不采用<br />
export.csv=true<br />
export.csv.label=&lt;span csv"&gt;CSV &lt;/span&gt;<br />
export.csv.include_header=false<br />
export.csv.filename=<br />
export.excel=true<br />
export.excel.label=&lt;span excel"&gt;Excel &lt;/span&gt;<br />
export.excel.include_header=true<br />
export.excel.filename=<br />
export.xml=true<br />
export.xml.label=&lt;span xml"&gt;XML &lt;/span&gt;<br />
export.xml.filename=<br />
export.pdf=false<br />
export.pdf.label=&lt;span pdf"&gt;PDF &lt;/span&gt;<br />
export.pdf.include_header=true<br />
export.pdf.filename=<br />
export.rtf=false<br />
export.rtf.label=&lt;span rtf"&gt;RTF &lt;/span&gt;<br />
export.rtf.include_header=true<br />
export.rtf.filename=<br />
# messages<br />
#相应的显示信息 包括空数据时候显示的 下两个显示的位置不一样 一个是在table中&nbsp; 一个是在下面<br />
basic.msg.empty_list=Nothing found to display.&nbsp; <br />
basic.msg.empty_list_row=&lt;tr &gt;&lt;td colspan="{0}"&gt;Nothing found to display.&lt;/td&gt;&lt;/tr&gt;<br />
error.msg.invalid_page=invalid page<br />
export.banner=&lt;div &gt;Export options: {0}&lt;/div&gt;#导出处的提示文字<br />
export.banner.sepchar= | #导出处的提示文字分隔符<br />
paging.banner.item_name=item <br />
paging.banner.items_name=items<br />
paging.banner.no_items_found=&lt;span &gt;No {0} found.&lt;/span&gt;<br />
paging.banner.one_item_found=&lt;span &gt;One {0} found.&lt;/span&gt;<br />
paging.banner.all_items_found=&lt;span &gt;{0} {1} found, displaying all {2}.&lt;/span&gt;<br />
paging.banner.some_items_found=&lt;span &gt;{0} {1} found, displaying {2} to {3}.&lt;/span&gt;<br />
paging.banner.full=&lt;span &gt;[&lt;a href="{1}"&gt;First&lt;/a&gt;/&lt;a href="{2}"&gt;Prev&lt;/a&gt;] {0} [&lt;a href="{3}"&gt;Next&lt;/a&gt;/&lt;a href="{4}"&gt;Last&lt;/a&gt;]&lt;/span&gt;<br />
paging.banner.first=&lt;span &gt;[First/Prev] {0} [&lt;a href="{3}"&gt;Next&lt;/a&gt;/&lt;a href="{4}"&gt;Last&lt;/a&gt;]&lt;/span&gt;<br />
paging.banner.last=&lt;span &gt;[&lt;a href="{1}"&gt;First&lt;/a&gt;/&lt;a href="{2}"&gt;Prev&lt;/a&gt;] {0} [Next/Last]&lt;/span&gt;<br />
paging.banner.onepage=&lt;span &gt;{0}&lt;/span&gt;<br />
paging.banner.page.selected=&lt;strong&gt;{0}&lt;/strong&gt;<br />
paging.banner.page.link=&lt;a href="{1}" title="Go to page {0}"&gt;{0}&lt;/a&gt;<br />
paging.banner.page.separator=, \<br />
# external sort and pagination<br />
pagination.sort.param=sort<br />
pagination.sortdirection.param=dir<br />
pagination.pagenumber.param=page<br />
pagination.searchid.param=searchid<br />
pagination.sort.asc.value=asc<br />
pagination.sort.desc.value=desc<br />
pagination.sort.skippagenumber=true<br />
# unused<br />
save.excel.banner=&lt;a href="{0}" rel="external"&gt;save ({1} bytes)&lt;/a&gt;<br />
save.excel.filename=export.xls</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/ZHOUJIAOSHOU/archive/2009/06/17/4277400.aspx</p>
<img src ="http://www.blogjava.net/shiwenfeng/aggbug/300314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shiwenfeng/" target="_blank">shiwf</a> 2009-10-30 11:28 <a href="http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Display Tag使用</title><link>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300313.html</link><dc:creator>shiwf</dc:creator><author>shiwf</author><pubDate>Fri, 30 Oct 2009 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300313.html</guid><wfw:comment>http://www.blogjava.net/shiwenfeng/comments/300313.html</wfw:comment><comments>http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shiwenfeng/comments/commentRss/300313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shiwenfeng/services/trackbacks/300313.html</trackback:ping><description><![CDATA[Display Tag Lib是一个标签库，用来处理jsp网页上的Table，功能非常强，可以对的Table进行分页、数据导出、分组、对列排序等等，反正我在做项目时需要的功能它都给我提供了，而且使用起来非常的方便。能够大大减少代码量。<br />
&nbsp;&nbsp;&nbsp; 介个是Display Tag的官方网站<br />
<br />
&nbsp;&nbsp;&nbsp; 首先当然是要下载它的jar包了，这里可以下载到最新的版本。将jar包放到WEB-INF的lib文件夹下。另外还需要两个辅助包：apache的commons-lang和standard包，更多的辅助包可以在这里下载。<br />
<br />
&nbsp;&nbsp;&nbsp; 在web.xml下添加一个filter<br />
&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;exportFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;org.displaytag.filter.ResponseOverrideFilter&lt;/filter-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/filter&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 在jsp页面做一个引用：<br />
&lt;%@ taglib uri="http://displaytag.sf.net/el" prefix="display" %&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 首先我们定义一个list<br />
&lt;% <br />
&nbsp;List test = new ArrayList( 6 );<br />
&nbsp;test.add( "Test String 1" );<br />
&nbsp;test.add( "Test String 2" );<br />
&nbsp;test.add( "Test String 3" );<br />
&nbsp;test.add( "Test String 4" );<br />
&nbsp;test.add( "Test String 5" );<br />
&nbsp;test.add( "Test String 6" );<br />
&nbsp;request.setAttribute( "test", test ); <br />
%&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 当我们想在jsp页面上显示这个list时，我们只需要写一句话<br />
&nbsp;&nbsp;&nbsp; &lt;display:table name="test" /&gt;<br />
&nbsp;&nbsp;&nbsp; display tag会自动生成一个table<br />
<br />
&nbsp;&nbsp;&nbsp; 如果list是从控制层抛出来的，name可使用EL表达式表示<br />
&nbsp;&nbsp;&nbsp; &lt;display:table name="$" /&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 这是最简单的display tag的使用，我们可以给它加上样式等，也可以定义显示的列，下面的table显示复杂一些<br />
&lt;display:table name="test" styleClass="list" cellspacing="0" cellpadding="0"&gt;<br />
&nbsp; &lt;display:column property="id" title="ID" class="idcol"/&gt;<br />
&nbsp; &lt;display:column property="name" /&gt;<br />
&nbsp; &lt;display:column property="email" /&gt;<br />
&nbsp; &lt;display:column property="description" title="Comments"/&gt;<br />
&lt;/display:table&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 如果想要给它加个链接也很简单,下面的代码给name加了连接，并附带id参数，email也自动连接到mailto:XXX<br />
&lt;display:table name="test" styleClass="list" cellspacing="0" cellpadding="0"&gt;<br />
&nbsp; &lt;display:column property="id" title="ID" class="idcol"/&gt;<br />
&nbsp; &lt;display:column property="name" url="detail.jsp" paramId="id" paramProperty="id"/&gt;<br />
&nbsp; &lt;display:column property="email" autolink="true"/&gt;<br />
&nbsp; &lt;display:column property="description" title="Comments"/&gt;<br />
&lt;/display:table&gt;
<p>下面介绍几个Display最常用的功能，更多功能请参考<a href="http://displaytag.homeip.net/displaytag-examples-1.1/">http://displaytag.homeip.net/displaytag-examples-1.1/</a>。<br />
1. 分页<br />
&nbsp;&nbsp;&nbsp; 如果想对代码分页，只需在display:table标签中添加一项pagesize="每页显示行数"，如<br />
&lt;display:table name="test" pagesize="10"/&gt;</p>
<p>2. 对列排序<br />
&nbsp;&nbsp;&nbsp; display tag可对列进行排序，就是点击列名，对该列的数据进行排序。你只需对想要排序的列添加 sort="true" 就OK，如下面的代码可对前三列进行排序。在display:table中添加defaultsort="列数"，可默认对指定的列排序。<br />
&lt;display:table name="test" styleClass="list" cellspacing="0" cellpadding="0" defaultsort="1"&gt;<br />
&nbsp; &lt;display:column property="id" title="ID" class="idcol" sort="true"/&gt;<br />
&nbsp; &lt;display:column property="name" url="detail.jsp" paramId="id" paramProperty="id" sort="true"/&gt;<br />
&nbsp; &lt;display:column property="email" autolink="true" sort="true"/&gt;<br />
&nbsp; &lt;display:column property="description" title="Comments"/&gt;<br />
&lt;/display:table&gt;<br />
&nbsp;&nbsp; 如果table有分页，Display Tag默认只对当前页进行排序，如果想对整个list排序，可以在display:table之间添加一段代码：<br />
&lt;display:setProperty name="sort.amount" value="list"/&gt;<br />
<br />
3. 导出数据<br />
&nbsp;&nbsp;&nbsp; 在display:table中添加export="true"，看看会出现什么！Display Tag默认会提供三种数据导出方式：CSV、Excel、XML 。<br />
&nbsp;&nbsp;&nbsp; 另外Display Tag还可以导出为PDF格式，在http://prdownloads.sourceforge.net/itext/下载一个辅助包iText.jar，copy到lib目录下，然后在display:table之间添加一段代码：<br />
&lt;display:setProperty name="export.pdf" value="true"/&gt;，大功告成。</p>
<p>4. Display Tag的属性设置<br />
&nbsp;&nbsp;&nbsp; 前面所说的display:setProperty&nbsp;是一种改变Display Tag属性的方法，但是在每个jsp中都要写太麻烦了。<br />
&nbsp;&nbsp;&nbsp; Display Tag中设置了很多默认的属性，它有一个专门的属性文件，是在它的jar包中的displaytag/properties/TableTag.properties<br />
&nbsp;&nbsp;&nbsp; 想要改变它的默认属性，我们可以在WEB-INFclasses下新建一个文件displaytag.properties，仿照TableTag.properties中属性的格式设置需要修改的属性。<br />
&nbsp;&nbsp;&nbsp; TableTag.properties中的# messages中设置的是显示在页面上的提示信息。默认是英文的，我们可以把它改为中文的。不过这里只能使用unicode，就是说中文字符必须转换为unicode码，这个可以使用jdk自带的native2ascii.exe进行转换。</p>
<p>5. 其它功能<br />
&nbsp;&nbsp;&nbsp; DisplayTag还有一些很实用的小功能，这里提两个。一个是对数据的Format，这是1.1版本添加的新功能，可以使用标签的方式格式化时间、数字、字符串。比如日期，在需要格式化的column标签中添加format=""，第一个参数为格式化的数据序号，第二个参数是数据类型，数字为number，第三个参数为数据格式。<br />
&nbsp;&nbsp;&nbsp; 另外一个功能是对table数据的合计功能。在table标签中添加 decorator="org.displaytag.decorator.TotalTableDecorator"，然后在想要进行合计的数据列的column标签中添加 total="true"，该列就可以被计算总数了。但这个功能有个缺点，不能用在有分页的时候，它只能合计第一页的数据。<br />
<br />
<strong>DisplayTag的不足<br />
</strong>&nbsp;&nbsp;&nbsp; 初次使用DisplayTag的人可能会觉得惊喜，但是用久了会发现很多问题，最大的问题是对中文的支持不好，比如如果查询条件中有中文，就无法翻页，无法对中文排序，将中文导出为指定文件时出现乱码等等。这些问题有时候会让人很郁闷，有时候逼得你要去修改它的源代码。下面是对以上几个问题的解决方法：<br />
&nbsp;&nbsp;&nbsp; 1. 对于中文无法翻页、排序，最简单的办法是修改Tomcat下的server.xml文件。找到HTTP的Connector标签，在里面添加一项URIEncoding="..."，引号里面的内容取决于你的页面编码，比如可以是GBK，UTF8等。这样上面两个问题就可以解决了。<br />
&nbsp;&nbsp;&nbsp; 2. 导出为文件：其实这个功能除了中文支持外还有很多其它问题，比如它会将Html标签一起导出、只导出显示的内容，但如果对table进行了decorator，decorator后的内容无法导出。如果想要将中文正确导出，需要修改DisplayTag源代码。<br />
&nbsp;&nbsp;&nbsp; 下载相同版本的源代码，在org.displaytag.export.ExcelView.java文件中找到getMimeType()方法，将此方法修改为 return "application/vnd.ms-excel;charset=GB2312";，修改后导出数据的速度会慢很多，不过将就吧。<br />
&nbsp;&nbsp;&nbsp; 3. 新版的DisplayTag1.1添加了对一次取部分数据的支持，相关的标签包括partialList和size，需要设置partialList="true"和size的大小。具体怎么用偶还没研究。</p>
<img src ="http://www.blogjava.net/shiwenfeng/aggbug/300313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shiwenfeng/" target="_blank">shiwf</a> 2009-10-30 11:25 <a href="http://www.blogjava.net/shiwenfeng/archive/2009/10/30/300313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>