当前位置: 代码迷 >> Web前端 >> displayTag分页条(二)
  详细解决方案

displayTag分页条(二)

热度:332   发布时间:2012-08-31 12:55:03.0
displayTag分页条(2)

?

?

一、要把displaytag加入自己的工程,需要做以下工作:
?? 1.? 把displaytag-1.2.jar加入WEB-INF/lib
?? 2. 确认WEB-INF/lib目录中包含以下lib文件:
????????? * commons-logging
????????? * commons-lang
????????? * commons-collections
????????? * commons-beanutils
????????? * log4j
????????? * itext (optional, for pdf/rtf export)

要注意版本的兼容。比较好的方法就是直接从displaytag的例子项目中拷贝这些lib文件。
如果需要把文件导成pdf,excel等还需要把 displaytag-export-poi jar也导入进来。

解压displaytag-examples-1.2.war之后, 我们使用displatag所需的所有jar包,css文件,国际化资源文件都可以在这里找到,

1.将displaytag-examples-1.2/下的images、img、css三个目录拷到你项目的WebRoot下;

????????? 将displaytag-examples-1.2/WEB-INF/classes/下的displaytag.properties文件拷到你项目的src下。
  2.将displaytag-examples-1.2/WEB-INF/lib/下的所有jar包拷到你项目的WebRoot\ WEB-INF\lib下
  3.在所需要用Displaytag的JSP文件中加入如下内容即可:
  a 在Jsp文件的头部加入:
  <%@ taglib uri="http://displaytag.sf.net" prefix="display"%>
  b 在<head></head>之间加入如下:
  <link rel="stylesheet" type="text/css" href="css/screen.css" />,路径自己注意
  c 在显示分页表格的地方加入如下代码:
  <display:table name="all" pagesize="5">
  <display:column property="cid" title="编号" />
  <display:column property="name" title="学生姓名" />
  <display:column property="teacher" title="任课老师" />
  <display:column property="creditHour" title="学分" />
  </display:table>
  这是一个例子,至此你已经应用了displaytag

错误:The absolute uri:? http://displaytag.sf.net? cannot be resolved in either web.xml or the jar files deployed with this application

web.xml配置

<taglib>
<taglib-uri>http://displaytag.sf.net</taglib-uri>
<taglib-location>displaytag.tld</taglib-location>
</taglib>

?

3.要是要用到导出功能的话,还需要在web.xml里增加一个过滤器,

<filter>
??? <filter-name>ResponseOverrideFilter</filter-name>
??? <filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
? </filter>

<filter-mapping>
??? <filter-name>ResponseOverrideFilter</filter-name>
??? <url-pattern>*.do</url-pattern>
? </filter-mapping>
? <filter-mapping>
??? <filter-name>ResponseOverrideFilter</filter-name>
??? <url-pattern>*.jsp</url-pattern>
? </filter-mapping>

这里我们只用到分页功能,所以这一步可以跳过。





?完成以上工作后,在你的工程里创建一个如下的jsp页面试一试吧:

<%@ page language="java" contentType="text/html; charset=UTF-8"
??? pageEncoding="UTF-8"%>
???? <%@ taglib uri=" http://displaytag.sf.net " prefix="display" %>
???? <% request.setAttribute( "test", new TestList(10, false) ); %>

<display:table name="test">
? <display:column property="id" title="ID" />
? <display:column property="name" />
? <display:column property="email" />
? <display:column property="status" />
? <display:column property="description" title="Comments"/>
</display:table>


?http://jakarta.apache.org/taglibs/tutorial.html中有更多的使用指南。

最基本的:

<display:table />test为你的属性名字,如你上一页使用了request.setAttribute("blog", blog);然后转向到你要使用分页的页面上,这时你的显示页面就应该是<display:table name="blog" />

这是最简单的应用,我们可以给他加上样式,也可以定义显示的列标题。

<% request.setAttribute( "test", new TestList(10, false) ); %>

<display:table name="test">
? <display:column property="id" title="ID" />
? <display:column property="name" />
? <display:column property="email" />
? <display:column property="status" />
? <display:column property="description" title="Comments"/>
</display:table>

下面我们再给他加上分页的功能,这个才是我们用他的重点,呵呵

如果想对代码分页,只需在display:table标签中添加一项pagesize="每页显示行数",如
<display:table name="test" pagesize ="10"/>

这里还需要注意的是,如果我们的项目使用了struts,URL会是http://*****/****/***.action的形式,

这时候就需要配置一个requestURI="DynamicTreeSelectAction.action"来改变默认的翻页路径。

<display:table name="departmentList" requestURI="DepartmentList.action" sort="list" pagesize="20" class="ITS">
??? ??? <display:column property="deptId" titleKey="listDeptPage.deptId.title" />
??? ??? <display:column property="deptNo" titleKey="listDeptPage.deptNo.title"/>
??? ??? <display:column property="deptName" titleKey="listDeptPage.deptName.title"/>
??? ??? <display:column titleKey="listDeptPage.edit.title" href="DepartmentFind.action"? paramId="deptId" paramProperty="deptId" >Click</display:column>
??? ??? <display:column titleKey="listDeptPage.delete.title" href="DepartmentDel.action"? paramId="deptId" paramProperty="deptId" >Delete</display:column>
??? ? </display:table>

2. 对列排序
display tag可对列进行排序,就是点击列名,对该列的数据进行排序。你只需对想要排序的列添加 sort="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-INFclasses下新建一个文件displaytag.properties,仿照TableTag.properties中属性的格式设置需要修改的属性。

TableTag.properties中的# messages中设置的是显示在页面上的提示信息。默认是英文的,我们可以把它改为中文的。不过这里只能使用unicode,就是说中文字符必须转换为 unicode码,这个可以使用jdk自带的native2ascii.exe进行转换。

5. 其它功能

DisplayTag还有一些很实用的小功能,这里提两个。一个是对数据的Format,这 是1.1版本添加的新功能,可以使用标签的方式格式化时间、数字、字符串。比如日期,在需要格式化的column标签中添加format=" {0,date,yyyy-MM-dd}",第一个参数为格式化的数据序号,第二个参数是数据类型,数字为number,第三个参数为数据格式。

另外一个功能是对table数据的合计功能。在table标签中添加 decorator="org.displaytag.decorator.TotalTableDecorator",然后在想要进行合计的数据列的 column标签中添加 total="true",该列就可以被计算总数了。但这个功能有个缺点,不能用在有分页的时候,它只能合计第一页的数据。

DisplayTag的不足 初次使用DisplayTag的人可能会觉得惊喜,但是用久了会发现很多问题,最大的问题是对中文的支持不好,比如如果查询条件中有中文,就无法翻页,无 法对中文排序,将中文导出为指定文件时出现乱码等等。这些问题有时候会让人很郁闷,有时候逼得你要去修改它的源代码。下面是对以上几个问题的解决方法:

1. 对于中文无法翻页、排序,最简单的办法是修改Tomcat下的server.xml文件。找到HTTP的Connector标签,在里面添加一项 URIEncoding="...",引号里面的内容取决于你的页面编码,比如可以是GBK,UTF8等。这样上面两个问题就可以解决了。

2. 导出为文件:其实这个功能除了中文支持外还有很多其它问题,比如它会将Html标签一起导出、只导出显示的内容,但如果对table进行了decorator,decorator后的内容无法导出。如果想要将中文正确导出,需要修改DisplayTag源代码。

下载相同版本的源代码,在 org.displaytag.export.ExcelView.java文件中找到getMimeType()方法,将此方法修改为 return "application/vnd.ms-excel;charset=GB2312";,修改后导出数据的速度会慢很多,不过将就吧。

?

下面看一下我这个博客文章管理页面的具体应用:

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri=" http://displaytag.sf.net " prefix="display" %>
<%@include file="header.jsp" %>
<style type="text/css" media="all">
??????? @import url("/blog/admin/css/screen.css");
</style>
<script type="text/javascript">??
???function del() {
????var msg = "您真的确定要删除吗?\n\n请确认!";
????if (confirm(msg)==true){
??????return true;
?????}else{
??????return false;
?????}
????}
</script>

<h2>博文管理</h2>
<display:table pagesize="3" requestURI="/servlet/AdminBlogListServlet" >
?<display:column property="id" title="编号" sortable="true"/>
?<display:column property="title" title="主题"/>
?<display:column property="category" title="分类"/>
?<display:column property="createdTime" title="日期" sortable="true"/>
?<display:column title="操作">
??<a href="/blog/servlet/PreEditBlogServlet?id=${blog.id}"><img src="/blog/admin/images/edit.gif " border="0"/></a>
??????? <a href="/blog/servlet/DeleteBlogServlet?id=${blog.id}" onclick="javascript:return del()"><img src="/blog/admin/images/delete.gif" border="0"/></a>??
?</display:column>
?
</display:table>?
<%@include file="footer.jsp" %>

注意事项:

有时候,要是点下一页出现Nothing found to display. ,就在加上requestURI="这里写上你显示列表页"

编号和日期上有个向上和向下的小三角,点击那里可以进行排序。

默认分页,上一页下一页这些是在显示表格的上面的,我们可以通过属性文件来把他改成下面,或者是上下都有。

在src目录下新建一个displaytag.properties属性文件,或者是把到示例程序把这个文件复制过来再修改

paging.banner.placement=bottom

这样分页显示就在表格的下面了。