`
lxcaoxin
  • 浏览: 127329 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

JSTL display tag

    博客分类:
  • JSP
阅读更多
转自http://hi.baidu.com/0102145/blog/item/6b6767c6f81015c6d1006095.html
   用了一段时间的Display Tag,觉得非常好用,可在论坛上发现好像使用这个东东的人挺少的,那偶也来写篇文章。
Display Tag Lib是一个标签库,用来处理jsp网页上的Table,功能非常强,可以对的Table进行分页、数据导出、分组、对列排序等等,反正我在做项目时需要的功能它都给我提供了,而且使用起来非常的方便。能够大大减少代码量。
介个是Display Tag的官方网站

首先当然是要下载它的jar包了,这里可以下载到最新的版本。将jar包放到WEB-INF的lib文件夹下。另外还需要两个辅助包:apache的commons-lang和standard包,更多的辅助包可以在这里下载。

在web.xml下添加一个filter
<filter>
<filter-name>exportFilter</filter-name>
<filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
</filter>

在jsp页面做一个引用:
<%@ taglib uri="http://displaytag.sf.net/el" prefix="display" %>

首先我们定义一个list
<%
List test = new ArrayList( 6 );
test.add( "Test String 1" );
test.add( "Test String 2" );
test.add( "Test String 3" );
test.add( "Test String 4" );
test.add( "Test String 5" );
test.add( "Test String 6" );
request.setAttribute( "test", test );
%>

当我们想在jsp页面上显示这个list时,我们只需要写一句话
<display:table name="test" />
display tag会自动生成一个table

如果list是从控制层抛出来的,name可使用EL表达式表示
<display:table name="$" />

这是最简单的display tag的使用,我们可以给它加上样式等,也可以定义显示的列,下面的table显示复杂一些
<display:table name="test" styleClass="list" cellspacing="0" cellpadding="0">
<display:column property="id" title="ID" class="idcol"/>
<display:column property="name" />
<display:column property="email" />
<display:column property="description" title="Comments"/>
</display:table>

如果想要给它加个链接也很简单,下面的代码给name加了连接,并附带id参数,email也自动连接到mailto:XXX
<display:table name="test" styleClass="list" cellspacing="0" cellpadding="0">
<display:column property="id" title="ID" class="idcol"/>
<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://displaytag.homeip.net/displaytag-examples-1.1/。
1. 分页
如果想对代码分页,只需在display:table标签中添加一项pagesize="每页显示行数",如
<display:table name="test" pagesize="10"/>

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="",第一个参数为格式化的数据序号,第二个参数是数据类型,数字为 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";,修改后导出数据的速度会慢很多,不过将就吧。
3. 新版的DisplayTag1.1添加了对一次取部分数据的支持,相关的标签包括partialList和size,需要设置partialList="true"和size的大小。具体怎么用偶还没研究。


*********************************************我不是分隔线,是寂寞*****************************************************


DisplayTag是一个非常好用的表格显示标签,适合MVC模式,其主页在http://displaytag.sourceforge.net

一、最简单的情况,未使用<display:column/>标签

<%request.setAttribute( "test", new ReportList(6) );%>
<display:table name="test" />

标签遍历List里的每一个对象,并将对象里的所有属性显示出来。一般用于开发的时候检查对象数据的完整性。

二、使用<display:column/>标签的情况

<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>

property对应List里对象的属性(用getXXX()方法取得),title则对应表格表头里的列名。定义列有两种方式:

A、<display:column property="email" />

使用<display:column/>标签里的property属性来定义

B、<display:column title="email">email@it.com</display:column>

在<display:column/>标签体里增加内容,可以是常量,也可以用其他标签等等

两种方式比较,用property属性来定义更加快速和利于排序。

三、表格显示样式的定义

A、在<display:table/>和<display:column/>标签里指定标准的html属性,烦琐

B、修改样式表
<display:table name="test" class="mars">
<display:column property="id" title="ID" class="idcol"/>
<display:column property="name" />
<display:column property="email" />
<display:column property="status" class="tableCellError" />
<display:column property="description" title="Comments"/>
</display:table>

通过class属性来指定所要应用的样式。可以在其默认样式表里(./css/screen.css)直接修改

四、标签取得数据的数据源

有四种范围

pageScope
requestScope (默认) <display:table name="test2" >
sessionScope <display:table name="sessionScope.holder.list" > 注意,这里要指定范围,非默认
applicationScope

五、通过增加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>

注意到在<display:table/>里增加了id属性,这时就在page context里创建了一个隐含对象,指向List里的当前对象,

可以通过(ListObject)pageContext.getAttribute("id")来捕获这个对象。同时还创建了一个id_rowNum对象,同样,可

通过pageContext.getAttribute("testit_rowNum")来捕获,它仅仅代表当前行的行数。

有了这两个隐含对象,就可以通过其他标签来访问,例如Jstl:

<display:table id="row" name="mylist">
<display:column title="row number" >
<c:out value="${row_rowNum}"/>
</display:column>
<display:column title="name" >
<c:out value="${row.first_name}"/>
<c:out value="${row.last_name}"/>
</display:column>
</display:table>

六、显示部分数据

显示开始五条数据:通过设定length属性

<display:table name="test" length="5">
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
</display:table>

显示第三到第八条数据:通过设定offset和length属性

<display:table name="test" offset="3" length="5">
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
</display:table>

七、对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>

如果要显示的对象里包含email和url地址,则可以在display:column里直接设定autolink="true"来直接连接

八、使用装饰模式转换数据显示(写自己的 decorator )

A、对整个表格应用decorator

<display:table name="test" decorator="org.displaytag.sample.Wrapper" >
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
<display:column property="date" />
<display:column property="money" />
</display:table>
org.displaytag.sample.Wrapper即自己写的decorator,它要继承TableDecorator类,看看它的一个方法:
public String getMoney()
{
return this.moneyFormat.format(((ListObject) this.getCurrentRowObject()).getMoney());
}

很明显,它通过父类的getCurrentRowObject()方法获得当前对象,然后对其getMoney()方法进行‘油漆’

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.LongDateWrapper" />
</display:table>
org.displaytag.sample.LongDateWrapper要实现ColumnDecorator接口,它的方法:
public final String decorate(Object columnValue)
{
Date date = (Date) columnValue;
return this.dateFormat.format(date);
}

显然,它获得不了当前对象(因为它实现的是接口),仅仅是获得该对象的columnValue,然后‘油漆’

九、创建动态连接

有两种方法创建动态连接:

A、在<display:column/>里通过增加href、paramId、paramName、paramScope、paramProperty属性

href       基本的URL 地址
paramId     加在URL 地址后的参数名称
paramName    数据bean的名称,一般为null(即使用当前List里的对象)
paramScope    数据bean的范围,一般为null
paramProperty  数据bean的属性名称,用来填充URL 地址后的参数值
<display:table name="sessionScope.details">
<display:column property="id" title="ID" href="details.jsp" paramId="id" />
<display:column property="email" href="details.jsp" paramId="action" paramName="testparam" paramScope="request" />
<display:column property="status" href="details.jsp" paramId="id" paramProperty="id" />
</display:table>

这种方法简便直接,但缺点是无法产生类似details.jsp?id=xx&action=xx的复合URL

B、应用decorator 创建动态连接:

<display:table name="sessionScope.details" decorator="org.displaytag.sample.Wrapper" >
<display:column property="link1" title="ID" />
<display:column property="email" />
<display:column property="link2" title="Actions" />
</display:table>
org.displaytag.sample.Wrapper里的方法:
public String getLink1()
{
ListObject lObject= (ListObject)getCurrentRowObject();
int lIndex= getListIndex();
return "<a href=\"details.jsp?index=" + lIndex + "\">" + lObject.getId() + "</a>";
}

public String getLink2()
{
ListObject lObject= (ListObject)getCurrentRowObject();
int lId= lObject.getId();

return "<a href=\"details.jsp?id=" + lId
+ "&action=view\">View</a> | "
+ "<a href=\"details.jsp?id=" + lId
+ "&action=edit\">Edit</a> | "
+ "<a href=\"details.jsp?id=" + lId
+ "&action=delete\">Delete</a>";
}

十、分页

实现分页非常的简单,增加一个pagesize属性指定一次想显示的行数即可

<display:table name="sessionScope.test" pagesize="10">
<display:column property="id" title="ID" />
<display:column property="name" />
<display:column property="email" />
<display:column property="status" />
</display:table>

十一、排序

排序实现也是很简单,在需要排序的column里增加sortable="true"属性,headerClass="sortable"仅仅是

指定显示的样式。column里的属性对象要实现Comparable接口,如果没有的话可以应用decorator

defaultsort="1"       默认第一个column排序
defaultorder="descending"  默认递减排序
<display:table name="sessionScope.stest" defaultsort="1" defaultorder="descending">
<display:column property="id" title="ID" sortable="true" headerClass="sortable" />
<display:column property="name" sortable="true" headerClass="sortable"/>
<display:column property="email" />
<display:column property="status" sortable="true" headerClass="sortable"/>
</display:table>

注意的是,当同时存在分页时排序仅仅针对的是当前页面,而不是整个List都进行排序

十二、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>

十三、导出数据到其他格式(页面溢出filter??)

在<display:table/>里设定export="true"

在<display:column/>里设定media="csv excel xml pdf" 决定该字段在导出到其他格式时被包不包含,不设定则都包含

<display:setProperty name="export.csv" value="false" />

决定该种格式能不能在页面中导出

<display:table name="test" export="true" id="currentRowObject">
<display:column property="id" title="ID"/>
<display:column property="email" />
<display:column property="status" />
<display:column property="longDescription" media="csv excel xml pdf" title="Not On HTML"/>
<display:column media="csv excel" title="URL" property="url"/>
<display:setProperty name="export.pdf" value="true" />
<display:setProperty name="export.csv" value="false" />
</display:table>

十四、配置属性,覆盖默认

两种方法:

A、在程序classpath下新建displaytag.properties文件

B、对于单个表格,应用<display:setProperty>标签

具体可配置的属性:http://displaytag.sourceforge.net/configuration.html

十五、一个完整的例子

<display:table name="test" export="true" sort="list" pagesize="8">
<display:column property="city" title="CITY" group="1" sortable="true" headerClass="sortable"/>
<display:column property="project" title="PROJECT" group="2" sortable="true" headerClass="sortable"/>
<display:column property="amount" title="HOURS"/>
<display:column property="task" title="TASK"/>
</display:table>
分享到:
评论

相关推荐

    display tag 分页实例

    这些jar包提供了Display Tag的核心功能以及与JSP标准标签库(JSTL)和其他Apache Commons库的集成。 要使用Display Tag实现分页,首先需要在JSP页面中引入Display Tag库。这可以通过在JSP头部添加以下代码完成: `...

    display tag使用总结文档

    Display Tag是Java Web开发中的一款强大且功能丰富的开源表格标签库,它为开发者提供了一种在JSP页面中处理和展示表格数据的高效方式。这个使用总结文档将深入探讨Display Tag的功能、配置、使用方法以及常见问题的...

    ajaxtags-1.5.5-bin.zip

    它是一个扩展了JSTL Display Tag的标签,主要用于实现表格的异步分页。Display Tag是一个强大的JSP标签库,常用于展示表格数据。而`ajax:displayTag`在此基础上添加了Ajax功能,当用户点击分页链接时,只请求和更新...

    用jquery 和 jstl tag 写的局部刷新的分页程序

    前几天用jquery+display tag 写了一个局部刷新的分页程序,感觉很不方便,所以自己写了分页程序配合jquery 使用, 一共2个例子,比较简单,第一个用java片写的,不需要添加任何的jar包,第二个用jstl写的,需要用2个jar 包, ...

    JSTL详解 DOC文档 较全的JSTL标记说明

    JSTL(JavaServer Pages Standard Tag Library,JavaServer Pages 标准标签库)是为简化和标准化 JavaServer Pages 开发而设计的一组标准标签。通过使用 JSTL,开发者可以减少 JSP 页面中的脚本代码量,提高代码的...

    Jstl框架以及标签详细讲解

    JSTL(JavaServer Pages Standard Tag Library,JavaServer页面标准标签库)是为简化和标准化JavaServer Pages (JSP) 页面开发而设计的一组标签库。它提供了一系列的标签来执行常见的任务,如循环、条件判断、国际化...

    使用EL和JSTL显示查询结果

    在JavaWeb开发中,EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)是两种非常重要的技术,它们极大地简化了视图层的编程,使得开发者可以从Servlet中传递数据到前端页面,并以优雅的方式...

    servlte加jstl传递List集合

    Servlet和JSTL(JavaServer Pages Standard Tag Library)是Java Web开发中的两个重要技术。Servlet主要负责处理HTTP请求,提供动态内容,而JSTL则是一组预定义的标签库,用于简化JSP页面的编写,使代码更加结构化和...

    display-tag

    "display-tag.rar" 文件可能是DisplayTag的另一种压缩格式,与上述的ZIP文件内容相似,可能包含二进制或源码文件。RAR是一种常见的压缩格式,尤其是在Windows环境中,它的压缩率可能比ZIP更高,但并非所有操作系统都...

    dispaly 标签 所需jar 包和css文件和images文件

    5. **javax.servlet.jsp.jstl.jar**:JSTL(JSP Standard Tag Library)核心库,`display:tag`可能会与JSTL配合使用。 6. **javax.servlet.jsp.jsp-api.jar**:JSP API库,包含了JSP规范定义的接口和类,是运行JSP...

    自定义标签和自定义jstl函数的具体项目实现

    在Java Web开发中,自定义标签和自定义JSTL(JavaServer Pages Standard Tag Library)函数是提升代码可复用性和可维护性的重要工具。它们允许开发者创建自己的语义化标签,以替代复杂的Java脚本或者JSP标签,使得...

    自定义Tag标签的使用、Struts2国际化全局资源配置(老鸟请绕道)

    在Java中,自定义标签通常基于JSP标准标签库(JSTL)的Tag Library Descriptor (TLD) 文件和对应的Java类实现。TLD文件定义了标签的名称、属性、事件处理等元数据,而Java类则实现了具体的业务逻辑。在Struts2中,...

    tag_tld(cusTag).txt

    - **显示名称**: `&lt;display-name&gt;JSTLcore&lt;/display-name&gt;` 定义了标签库的显示名称。 - **版本号**: `&lt;tlib-version&gt;1.1&lt;/tlib-version&gt;` 表示当前标签库的版本号。 - **简短名称**: `&lt;short-name&gt;firstLabel...

    displayTag学习摘要

    &lt;display:column title="staticvalue"&gt;static&lt;/display:column&gt; &lt;display:column title="rownumber(testit_rowNum)"&gt; ("testit_rowNum")%&gt; &lt;/display:column&gt; &lt;display:column title="((ListObject)testit).get...

    displayTag需要的所有必须包

    - `jstl-xxx.jar`、`standard-xxx.jar`:JSTL(JavaServer Pages Standard Tag Library)和其XML方言标准标签库,DisplayTag可能会用到这些标签库进行页面控制流的处理。 使用DisplayTag时,开发者需要在JSP页面中...

    webwork

    总的来说,WebWork框架和Display Tag是Web开发中的两个重要工具,它们提供了高效、灵活的解决方案来构建动态Web应用。通过学习和研究这些源码,开发者不仅可以提升技能,还能为未来的项目选择和定制合适的工具。

    tag struts2的自定义标签实例

    在Struts2中,自定义标签基于JSP标准标签库(JSTL)的实现,通过Action类与标签库之间的交互来动态生成内容。 一、创建自定义标签库 1. 定义标签接口:在Struts2中,我们通常使用`...

    displaytag

    DisplayTag可以与JSTL(JavaServer Pages Standard Tag Library)结合使用,进一步增强数据处理和页面渲染的能力。例如,使用JSTL的`&lt;c:out&gt;`标签可以在`&lt;display:column&gt;`中输出经过格式化或计算的值。 ### 总结 ...

    dispalytag标签的jar包

    通常,这会包括`displaytag.jar`和其他依赖的jar包,如`jstl.jar`(用于JSP标准标签库)、`ognl.jar`(Object-Graph Navigation Language,用于表达式语言)以及可能的其他第三方库。 在JSP页面中,你可以通过以下...

    自定义标签库

    - JSTL(JavaServer Pages Standard Tag Library)是预定义的一组标签库,包含了常见的数据处理、控制流等功能,而自定义标签库则允许开发者根据具体需求定制标签。 - JSTL是开源的,包含多个核心标签库,如Core、...

Global site tag (gtag.js) - Google Analytics