Display <display:column property="name" url="detail.jsp" paramId="id" paramProperty="id"/> <display:column property="email" autolink="true"/> <display:column property="description" title="Comments"/> </display:table> 例 子: 下面介绍几个 Display 最常用的功能,更多功能请参考 http://www.displaytag.org/index.jsp 。 1. 分页 如果想对代码分页,只需在 display:table 标签中添加一项 pagesize=" 每页显示行数 " ,如 <display:table name="test" pagesize="10"/> 2. 对列排序 display tag 可对列进行排序,就是点击列名,对该列的数据进行排序。你只需对想要排序的列添加 sorttable="true" 就 OK ,如下面的代码可 对前三列进行排序。在 display:table 中添加 defaultsort=" 列数 " ,可默认对指定的列排序。 <display:table name="test" styleClass="list" cellspacing="0" cellpadding="0" defaultsort="1"> <display:column property="id" title="ID" class="idcol" sort="true"/> <display:column property="name" url="detail.jsp" paramId="id" paramProperty="id" sort="true"/> <display:column property="email" autolink="true" sort="true"/> <display:column property="description" title="Comments"/> </display:table> 如果 table 有分页, Display Tag 默认只对当前页进行排序,如果想对整个 list 排序,可以在 display:table 之间添加一段代码: <display:setProperty name="sort.amount" value="list"/> 3. 导出数据 在 display:table 中添加 export="true" ,看看会出现什么! Display Tag 默认会提供三种数据导出方式: CSV 、 Excel 、 XML 。 另外 Display Tag 还可以导出为 PDF 格式,在 http://prdownloads.sourceforge.net/itext/ 下 载一个辅助包 iText.jar , copy 到 lib 目录下, 然后在 display:table 之间添加一段代码: <display:setProperty name="export.pdf" value="true"/> ,大功告成。 4. Display Tag 的属性设置 前面所说的 display:setProperty 是一种改变 Display Tag 属性的方法,但是在每个 jsp 中都要写太麻烦了。 Display Tag 中设置了很多默认的属性,它有一个专门的属性文件,是在它的 jar 包中的 displaytag/properties /TableTag.properties 想要改变它的默认属性,我们可以在 WEB-INF/classes 下新建一个文件 displaytag.properties ,仿照 TableTag.properties 中属性的格式设 置需要修改的属性。 TableTag.properties 中的 # messages 中设置的是显示在页面上的提示信息。默认是英文的,我们可以把它改为中文的。不过这里只能使用 unicode ,就是说中文字符必须转换为 unicode 码,这个可以使用 jdk 自带的 native2ascii.exe 进行转换。 5. displaytag 中 decorator 的使用原理 decorator 有两种,一种是用在 displaytag:table 中,一种是用在 displaytag:column 中,前者对整个表中相应属性有效,后者对单个列有效。 所以,在前者中,你一定要在响应的 decorator 类中写上 get 方法,命名方式为 get+beanProperty ( bean 属性),前者 需继承 TableDecorator 类 ,后者只需实现 ColumnDecorator 类的 decorate 方法即可( return 一个 String )。 关于 decorator 的原理,是这样的,当使用 decorator 属性时,数据先从 bean 中被取出,然后被传入进 decorator ,前者 是在 decorator 类中调用 g etCurrentRowObject 方法得到当前 bean ,继而再调用 bean 的 get 方法将属性取出 ( public String getDate() { return this.dateFormat.format(((ListObject) this.getCurrentRowObject()).getDate()); } ), 后者是数据直接被传进其 decorate 方法 . 当数据被处理完成后,再返回到页面显示,所以说, decorator 类其实是将原有属性的 value 进行包装后输出的包装 器,它的英文意思为油漆工 ,也就是这个意思,这也是一种基本设计模式 但是如果碰到你想要输出一个 checkbox 或者 radio 时,你可以覆盖掉以前的输入,直接输出自己想要的东西,像这样 : return " "; 那么你就 把输入进包装器的数据覆盖成 checkbox 输出了。 6. displaytag 的翻页机制 这可能是 displaytag 的局限性了,它的翻页机制是这样的: 如果一个 list 中有 10000 个 bean ,按照它的机制,如果是第一页(每页 n 条),它会把前 n 条数据取出来,然后再把剩余的 10000 - n 条删除,当你 点击页面 “2” 的时候,它再从后台绕一圈,把第二页的数据,也就是把第 n+1-2n 条记录取出来,把剩余的删除。这样,它实现了翻页,又防止 了内存占用过大。 但是,不管怎么说,它还是有一个取出所有条数的动作的,在极大数据量的情况下,有可能造成内存溢出。 8. displaytag 中 decorator 一例 后台部分: ======================================================= import org.displaytag.decorator.TableDecorator; import java.util.HashMap; import java.text.SimpleDateFormat; import java.util.Date; public class BulletinListDecorator extends TableDecorator{ private String bulletinId = null; private String title = null; private SimpleDateFormat sdf = null; private int i = 0; public BulletinListDecorator() { sdf = new SimpleDateFormat("yy-MM-dd"); } public String getBulletinId(){ i+=1; return ""+i; } public String getTitle(){ bulletinId = (String)((HashMap) this.getCurrentRowObject()).get("bulletinId"); title = (String)((HashMap) this.getCurrentRowObject()).get("title"); return ""+title+""; } public String getLastPubD(){ return sdf.format((Date)((HashMap) this.getCurrentRowObject()).get("lastPubD")); } } ==================================================== 前台部分: ==================================================== <display:table name="bulletinList" class="OuterTable" decorator="com.ztesoft.ds.application.web.bulletin.decorator.BulletinListDecorator"> <display:column property="bulletinId" titleKey="titlePage.seq" align="center" class="ValueTd" headerClass="ValueTd"/> <display:column property="title" titleKey="titlePage.title" align="center" class="ValueTd" headerClass="ValueTd"/> <display:column property="lastPubD" titleKey="titlePage.time" align="center" class="ValueTd" headerClass="ValueTd"/> <display:column property="className" titleKey="titlePage.class" align="center" class="ValueTd" headerClass="ValueTd"/> <display:column property="clickNo" titleKey="titlePage.clickNo" align="center" class="ValueTd" headerClass="ValueTd"/> </display:table> 其中 bulletinList 是一个 ArrayList , titleKey 指向了 properties 文件 |