一 简介
Display Tag Lib是一个标签库,用来处理jsp网页上的Table,功能非常强,可以对的Table进行分页、数据导出、分组、对列排序等等。
二 安装使用
1.在displaytag官网下载的文件:
displaytag-1.2.jar
displaytag-export-poi-1.2.jar
displaytag-portlet-1.2.jar adapt displaytag for use in JSR-168 portals
displaytag-examples-1.2.war
2.其他包
commons-logging
commons-lang
commons-collections
commons-beanutils
log4j
itext (optional, for pdf/rtf export)
3.引入displaytag标签库
<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>
三 示例
1.最简单的应用
<display:table name=”s”/>
//name 数据源 默认从request中取值
2.带column的应用
<display:table name="test">
<display:column property="id" title="ID" />
<display:column property="name" />
<display:column property="email" format="email is {0}" />
<display:column property="power" />
<display:column property="url" autolink="true"/>
</display:table>
//title 列名,property 属性名getXXX方法
// format 格式化
//autolink <a> 自动匹配http://www.sina.com s@126.com
3.表格显示样式
<%request.setAttribute("tableClass","its");%>
<display:table name="p" class="${tableClass}"/>
<display:column title="Age" property="age"
style="text-align:right;"/>
</display:table>
//默认情况display:table的样式是itis
//<display:table>适用所有<table>属性
//<display:column>适用所有<td>属性
4.分页
<display:table id="row" name="p"
size="${resultSize}" pagesize="5">
<display:column title="Id" property="id"/>
<display:column title="Name" property="name"/>
<display:column title="Age" property="age"/>
</display:table>
//size总记录数
//pagesize 每页记录数
5.排序
<display:table id="row" name="p" defaultsort="5" >
<display:column title="Id" property="id"/>
<display:column title="Name" property="name"/>
<display:column title="Age" property="age"
sortable=”true” headerClass=”sortable”/>
</display:table>
// sortable列是否可以排序
// headerClass 表头样式
// defaultsort 默认按照第几列进行排序
//注意:存在分页时排序仅仅针对的是当前页面,而不是整个List都进行排序
6.导出
<display:table id="row" name="p" export="true">
<display:column title="Id" property="id"/>
<display:column title="Name" property="name"/>
<display:column title="Age" property="age"/>
<display:setProperty name="export.pdf" value="true"/>
</display:table>
//export支持导出 默认有CSV、EXCEL、XML 3种格式
//display:setProperty 替换displaytag.properties 属性文件中的属性
//添加了iText包以后name="export.pdf" value="true"可以支持导出PDF和RTF
//在<display:table/>里设定export="true"
//在<display:column/>里设定media="csv excel xml pdf" 决定该字段在导出到其//他格式时被包不包含,不设定则都包含
//<display:setProperty name="export.csv" value="false" />
//决定该种格式能不能在页面中导出
7.数据源
有四种范围:
pageScope
requestScope (默认) <display:table name="p" >
sessionScope <display:table name="sessionScope.p" >
applicationScope
注意,默认情况下是从request中取值name="p",如果要从别的作用域中取值需要加作用域。
8.通过增加id属性创建隐含的对象
<display:table id="row" name="p" export="true">
<display:column title="Id" property="id"/>
<display:column title="Name" property="name"/>
<display:column title="Age" property="age"/>
<display:column title="RowNumber" >
<%=pageContext.getAttribute("row_rowNum")%>
|${row_rowNum}|<c:out value="${row.first_name}"/>
</display:column>
</display:table>
在<display:table/>里增加了id属性,这时就在page context里创建了一个隐含对象,指向List里的当前对象,可以通过(ListObject) pageContext. getAttribute("id")来捕获这个对象。同时还创建了一个id_rowNum对象,同样,可通过pageContext.getAttribute("testit_rowNum")来捕获,它仅仅代表当前行的行数。
9.分组
<display:table id="row" name="p" export="true">
<display:column title="Id" property="id"/>
<display:column property="name" group="1"/>
<display:column title="Age" property="age"/>
</display:table>导出数据到其他格式时,group无效
10.配置属性,修改默认值
两种方法:
A、在程序classpath下新建displaytag.properties文件
B、对于单个表格,应用<display:setProperty>标签
具体可配置的属性:http://displaytag.sourceforge.net/configuration.html
11.使用装饰模式转换数据显示(写自己的 decorator )
A、对整个表格应用decorator
<display:table name="p" class="${tableClass}"
decorator="com.yaxon.tag.decorators.DecoratorsMS"> <display:column title="Id" property="id"/>
<display:column title="Name" property="name"/>
<display:column title="Age" property="age"/>
<display:column title="Brithday" property="brithday"/>
<display:column title="Power" property="power"/>
<display:column title="Email" property="email"/>
<display:column title="Url" property="url"/>
</display:table>
com.yaxon.tag.decorators.DecoratorsMS 即自己写的decorator,它要继承TableDecorator类,看看它的一个方法:
public String getBrithday()
{
return this.dateFormat.format(((People) this.getCurrentRowObject()).getBrithday());
}
很明显,它通过父类的getCurrentRowObject()方法获得当前对象,然后对其getBrithday ()方法进行‘油漆’
B、对单独的column应用decorator
<display:table name="test">
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
<display:column property="date" decorator="org.displaytag.sample.LongDate Wrapper " />
</display:table>
org.displaytag.sample.LongDateWrapper要实现ColumnDecorator接口,它的方法:
public final String decorate(Object columnValue)
{
Date date = (Date) columnValue;
return this.dateFormat.format(date);
}
显然,它获得不了当前对象(因为它实现的是接口),仅仅是获得该对象的columnValue,然后‘油漆’
11.数据格式化输出
简单介绍几种需要格式化输出的情况:
1) 日期
<display:column property="brithday" format="{0,date, yyyy-MM-dd}"/>
输出:2009-06-06
<display:column property="brithday" format="{0,date, yyyy年MM月dd日}"/>
输出:2009年06月06日
2) 数值
<display:column property="power" format="{0,number, #,###.00}"/>
输出:500,000,000.05
3) 固定常量
<display:column property="money" format="{0}$"/>
输出:5000$
Format{}第一个参数为格式化的数据序号,第二个参数是数据类型,数字为number,第三个参数为数据格式。引用一句官方网站上的原话:You can use any valid java.text.MessageFormat
pattern in the format
attribute. Sorting will be based on the original object, not on the formatted String.
是说你可以使用任何java.text.MessageFormat
的有效格式来格式化此属性,排序是针对原数据而不是针对格式化后的数据。
12.创建动态连接
如图:
创建动态连接有两种方式
1) 自定义decorator 输出内容,这个方法开发代码比较多,这里就不介绍了。
2) 现在介绍一种比较简单实用的方法:
比如上图需要显示某个记录信息的详细情况,
1.创建处理显示详情的Action方法
public String someoneDetail() throws NamingException{
InitialContext ctx=new InitialContext();
SomethingSessionRemote
ssb=(SomethingSessionRemote)ctx.lookup("SomethingSessionBean/remote");
something = ssb.getSomeoneDetail(something);
return "detail";
}
2.配置Action处理方法的返回类型,或者直接操作request对象跳转。
<action name="shows" class="com.yaxon.test.action.SomethingAction">
<result name="detail">showDetail.jsp</result>
</action>
3.为数据显示页面创建动态连接
<display:table中新增加column列
<display:column title="操作">
<a href='shows!someoneDetail.action?something.id=${thin.id}' target='_blank' >详情</a>
</display:column>
${thin.id}中thin是<display:table的id属性值,id是数据源对象的某个属性
4.创建显示详细信息的JSP页面
<body>
<br>NAME:${something.id}
<br>WEIGHT:${something.weight}
<br>DETAIL:${something.detail}
<br>DETAIL1:${something.detail1}
<br>DETAIL2:${something.detail2}
<br>DETAIL3:${something.detail3}
<br>DETAIL4:${something.detail4}
<br>DETAIL5:${something.detail5}
</body>
Struts2的处理机制会把action中的getter方法封装到作用域对象中,这里是使用el表达式的方式来取值的。
完成以上步骤就可以在显示详情信息页面中显示详情信息了。