DisplayTag详解.docx
- 文档编号:4713991
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:15
- 大小:274.28KB
DisplayTag详解.docx
《DisplayTag详解.docx》由会员分享,可在线阅读,更多相关《DisplayTag详解.docx(15页珍藏版)》请在冰豆网上搜索。
DisplayTag详解
DisplayTag详解
简介Introduction】
DisplayTag是一个开源的自定义标签库(CustomTaglib),他提供了直接而有效的格式化web视图层数据的有效手段。
你可以在现在流行的web应用的MVC模式中集成
DisplayTag到View层,其提供的强大表格格式化功能一定会令你爱不释手。
或许上面说的有些夸张了,但是
DisplayTag在表格的格式化方面表现确实出色,当然,他也只能显示表格,视图层的大部分工作不就是使用表格来格式化数据嘛?
!
好了,让我们通过图片来看看他是一个什么样子吧“怎么
样?
是不是感觉不错那?
如果答案是肯定的,那么你一定急着想自己试一试咯?
!
不要急,下面就让我们开始我们的
DisplayTag之旅。
[b]【HelloDisplayTag】[/b]既然是一个tutorial,所以,我们不想对像自定义标签的实现原理等进行解释,也就是说在此之前,我们假定你已经对自定义标签有一定的认识,当然,没有也无所谓,等这篇tutorial
完成后,你估计就会了解的差不多了。
呐,让我们从最简单的displaytag的使用开始,就跟你的第
个程序往往是从HelloWorld程序开始一样。
先忽略其他的配置问题,我们的JSP文件的源代码如下:
实际上,除去初始化和数据准备等操作,生成表格的代码只有
行,那就是:
而他生成的表格就是这样的:
怎么样?
是不是很简单那?
简单的代码就可以生成如此漂亮的表格,你有理由不用嘛?
(因为使用了Struts的LabelValueBean,所以表格上显示了原始的title,不用着急,后面我们将会说道如何修改成你所期待的样子)
[b]【配置configuration】[/b]
Ok,在我们运用DisplayTag之前,我们需要对他的使用环境进行一些配置,或许有些复杂,但是,如果你是一个
WebApp老手的话,其实并不难。
当然,在此之前,我们需要下载DisplayTag,当前的最新版本是displaytag-1.0-b3。
你可以去SourceForge下载它,下载网址是:
2.1DisplayTag的类库,依赖库和TLD文件的添加解压下载下来的displaytag的压缩包,之后依次拷贝
displaytag-1.0-b3.jar和lib目录下面的所有jar文件到你自己的WEBAPP_HOME/WEB-INF/lib目录下面
displaytag-11.tld,displaytag-12.tld和displaytag-el-12.tld
到WEBAPP_HOME/WEB-INF目录下面。
他的依赖库包括:
commons-beanutils
commons-collections,commons-lang以及
commons-logging。
这里需要注意的问题就是,如果你连同Struts一起使用的话,
DisplayTag的依赖库实际上都包括在Struts1.1的发布包中,你只需要将displaytag-1.0-b3.jar文件拷贝到你自己的
WEBAPP_HOME/WEB-INF/lib目录下面就可以了。
另外一个重要的问题就是,如果你的Struts1.1发布包中的
commonslang包不是2.0版本或者更高版本的话,需要去
Apache的Jakartacommons项目主页上下载2.0版本的
commons-lang类库,并替换掉原来的commons-lang类库,否则,运行的时候将报错误并不能运行。
2.2web.xml的配置要使用DisplayTag提供的自定义标签,跟其他自定义标签的使用没有什么两样,同样,需要在web.xml文件中注册
taglib,下面是笔者的web.xml文件中taglib注册的片断:
/WEB-INF/displaytag-11.tld/WEB-INF/displaytag-12.tld/WEB-INF/displaytag-el-12.tld在这里有必要说明一下这三个tld之间的区别,这其实在DisplayTag的官方网站上有提到,这里只是重复一下:
displaytag-11.tld只是提供对
JSP1.1规范的的支持,而displaytag-12.tld则提供了对
JSP1.2规范的支持,最后的displaytag-el-12.tld除了提供跟
displaytag-12.tld提供的特性之外,他提供对Expression
Lanuage的支持。
所以,为了在web应用移植于不同的appserver的时候可以更少的修改文件,这里将所有的tld都添加在这里以便使用。
配置完成taglib后,下面是可选择的配置项,如果你不需要的话,可以不进行配置,但建议还是配置他们为好。
第一幅图中可以看到diaplaytag提供了数据的导出功能,如果说你的Table存在的页面被include在另一个页面中,比
如如果你使用Struts的话,那么Tiles的使用就是这种情况,
工作正常。
首先,在web.xml
中添加以下filter配置项(按照web.xml
文件中各个elements的顺序规定,需要将元素添加在前面,以下类似的情况请参考web.xml规范):
ResponseOverrideFilterorg.displaytag.filter.ResponseOverrideFilter其次,添加filter
的映射:
ResponseOverrideFilter
I18N
*.doResponseOverrideFilter*.jsp这样,对于web.xml的配置基本就完成了。
对于在web.xml文件中进行配置的手段,将在后面提到,不归入此类。
2.3属性文件的配置(displaytag.properties)
DisplayTag提供了一个属性文件(displaytag.properties)来定义表格显示的时候提供的信息,比如分页显示或者导出数据等的提示信息等,但是因为这个属性文件默认的文件随
jar文件一起发布而且是英文的,所以,我们需要对其进行定制以满足中文或者其他平台下的使用。
要对这个属性文件进行定制,有三种途径:
1】使用标签,这个标签可以对单个的属性进行设置,也
就是说如果要对整个的应用页面都进行定制的话,需要每个页面都使用这个标签并对每一个要定制的属性都使用它,这很明显不是太行得通,所以,displaytag还提供了下面得途径;
来初始化环境,
2】使用DisplayPropertiesLoaderServlet
这种方式方式可以对整个应用的属性进行定制,但是,笔者使用这种方式的时候报错,不过,还是将其在web.xml文件中的配置项列于此:
DisplayPropertiesLoaderServlet
DisplayPropertiesLoaderServletdisplaytaginitializationservletorg.displaytag.properties.DisplayPropertiesLoaderServletproperties.filename
/WEB-INF/displaytag.properties1这种方法也是读取制。
最后,也就是就第三中方式,也是笔者最常用的方式,那就是:
3】新建一个diaplaytag.properties属性文件,向该文件中
添加需要覆盖的或者需要另外定制的属性(具体有那些属性,
DisplayTag网站提供了一个PDF格式的manual,上面有所这个文件的一个样本笔者将在后面的实例部分进行罗列。
在准备好属性文件后,将其放到
WEBAPP_HOME/WEB-INF/classes目录下面就可以了。
我想这也比其他方式方便的多,另外,这种方式也是针对整个的WEB应用进行定制。
以上就是配置文件的三种配置方式,第一种只能对单个属性单个页面进行,而后面两种方式可以针对整个的web应用,尤其是第三种方式,笔者尤其倡导。
2.4CSS和img的移植如果说你试着将页面中的这一句去掉的话:
/css/screen.css"type="text/css"media="screen,print"/>
或许你会看到不想看到的景象,或者说你看到的表格将与你所期待的大相径庭:
怎么样?
与上面的简单实例相比,是不是淡色不少?
!
所以,要使得Displaytag提供最好的显示效果,或者说要显示正常,我们不但要保证服务器端的配置,
同样的也要保证视图层的配置,比如说CSS和Images。
故此,建议将下载的压缩包中的diaplaytag.war文件包中的
css目录和img目录拷贝到你当前工作的WEBApp的根目录
面,这样,就可以避免以上的事情发生。
当然,这只是可以正常显示的必要条件,像上面那样,如果页面中不引入css
的话,同样会显示不正常。
至此,你的Displaytag的配置就算完成了。
怎么样?
是不是有些繁琐那?
!
不过不用担心,与它所带给你的便捷和强大的功能相比,这算不了什么。
好了,下面就让我们对它的一些概念进行一下探索吧!
[b]DisplayTagTutorialbyDarrenWang[/b]
DisplayTag一共提供了五种标签用来显示显示表格,他们是,,,和。
通过这几个标签的组合可以完成大部分表格的显示功能。
下面,笔者将就各个标签情况做一阐述,其中将会包括其功能以及使用中可能遇到的问题。
3-1标签说明
通过
DisplayTag标签库的顶层标签,用来显示整体的表格,
标签都嵌套于此标签之内。
他所提供的主要功能包括:
以
CSV,XML和Excel形式导出数据;对于较长的数据,提供分页显示功能等等。
实例代码:
该标签有一系列的属性(Attribute),因为太多,
这里仅就几个主要而常用的进行说明:
requestScope,sessionScope和applicationScope。
其中
requestScope是缺省的scope,如果数据像
那么name属性可以直接像[name=“Infolist”]的形式指而定
像sessionScope的话,就要像上面的例子中那种形式指定
了。
Id属性:
指定显示表格的唯一标志,在后面你可以通过
id的另一个作用就是,如果一个页面中有多个分页显示表格的话,指定id后,各个表格的分页就可以工作正常。
Export属性:
需要指定boolean型的值,如果指定
export=true的话,表格显示完成后,下面会有一个输出项条目,指定数据导出的选项;否则,不显示数据导出条目。
默
认为false。
Pagesize属性:
指定每页最多显示的数据总数。
如果要显示的数据记录很长的话,指定pagesize后,数据将按照pagesize属性指定的数目显示记录数,其他的数据将分多个页面显示。
如果不指定该属性,所有数据将在一个页面显示。
Class属性:
指定表格显示所要使用的css风格,
displaytag提供了ISIS,ITS,Mars,Simple,Report五种风格,默认是ISIS,也就是上面的黄色色调的风格。
这些风格都是在screen.css文件中定义的,可以根据需要修改或者
添加需要的风格。
RequestURI属性:
当表格需要数据导出,而这个属性就是做这个事情的。
Sort属性:
用来指定对数据进行排序的时候是对整个的数据
list进行排序还是只对当前页面的数据进行排序。
默认的不指定该属性的情况下,排序的时候只对当前页面数据进行排序;如果指定sort=“list”的话,贝y可以对整个的数据st进行排序。
OK,其他属性读者有兴趣或者需要的话,可以参考
DiplayTag网站提供的manual。
3-2标签说明顾名思义,该标签是用来显示表格中的一列,它只能嵌套在标签中使用,显示decorator处理后的结果,如果没有指定
decorator,则显示property属性指定的数据。
代码实例:
该标签有个特性,即如果以空元素的形式出现,
则显示property属性指定的数据;否则,也就是不以空元素指定的数据存在,也会以两个元素间的数据显示为准。
例如:
或者将按照value属性指定的数据进行显示,而My
CustomValue将在每行只显示“MyCustomValue“,而不是显示property=”value”所指定的数据。
这个属性可以帮助你定制自己的列显示,后面将会提到某些实例中的使用。
标签的属性(Attribute)说明:
Property属性:
指定与该列显示数据相关联的property名称,该属性对应该行数据bean的属性,如果这列要显示bean
的数据,column的这个属性是必须指定的。
如:
Title属性:
该属性用来指定显示列的标题。
如果不指定该属性,默认的使用property的名字做为该列的标题。
这也就是我们第一个例子中两列的标题都是LabelValueBean的属性名的原因,我们只要为这两列指定需要的title就可以了。
如:
Href属性和其关联属性:
使用href属性动态构造当前列的各行数据的超连接。
使用paramId来指定附在url字符串后面的参数名称,而使用paramName或者paramProperty来指
定与paramId相关联的参数值。
如:
UPDATEDATA将会生成类似于下面的url
形式:
http:
//XXX/youApp/preUpdateAction.do?
id=132(
假设该行
的userId的值为132)
Sortable属性和headerClass属性:
DisplayTag
还提供了
个很有特色的特性,那就是可以针对某一列的数据进行排序,
而这只需要指定sortable属性为true,并指定其headerClass
为sortable就可以了。
如:
这样,就可以通过点击该列的标题来排序该列的数据了。
其中,sortable属性接受boolean值为合法属性值,而
headerClass为string型的合法值。
其他属性说明这里略去,请参考相关文档。
3-3标签说明
使用这个标签可以对DisplayTag显示的表格的属性进行设
置,但因为只能作用于单个的表格,所以,作用有限,一般
用来处理个别的情况。
该标签同样需要嵌套于标签内使用。
它只有两个属性:
name和value。
通过为指定的name设置
相应的value来更改displaytag的默认属性。
如:
或者无记录可供显示
这些属性的name可以参考DisplayTag网站提供的
TagReference文档,具体网址是
2.html。
3-4标签说明这个标签比较简单,就是完成html里面的标签所完成的功能。
可以在表格的上方显示指定的自定义表头。
代码实例:
CaptionofTheTable效果如下所示:
3-5标签说明与标签相对应,这个标签用来显示表格的表尾。
按照其实现
的需求,该标签应该像在上图中那样在表尾显示,但是上图表尾文字将会在表头之上(我想,这应该是IE的问题)。
如
图所示:
至此,DisplayTag的五种标签就简单介绍完了,
但是我们不想就此打住,下面,笔者将对DisplayTag的某些特性做进一步的探索。
[b]【displaytag高级特性】[/b]
有些时候,Collection中提供的数据或许不是我们想要的形式,比如,货币字段,在DataObject中或许只是存为int或者long甚至BigDecimal等形式,但是,显示的时候,我们不想以这种形式显示在页面上,这个时候,我们就需要借助
DisplayTag提供的Decorator特性。
Decorator可以帮助我们在显示数据之前对相应的数据进行格式化,然后再返回格式化后的结果进行显示。
下面我们就DisplayTag提供的
columndecorator和tabledecorator进行简单的剖析并列
举其使用场合。
4-1colunmdecorator阐述
ColumnDecorator所能实现的格式化功能只能针对单一的列进行,他所适用的情况包括对货币,时间,数字等类型进行统一格式化的情况,这样,就可以在应用中的所有表格中都能够使用该decorator进行格式化,大大提高了其可服用度。
缺点嘛,从笔者个人的使用情况来看,columndecorator
不能对处于同一行的其他列的数据进行引用,对某些情况下以通过稍后将提到的Tabledecorator来实现。
要使用columndecorator,需要实现DisplayTag库中的
ColumnDecorator接口,这个接口位于
org.displaytag.decorator.ColumnDecorator。
同时,实现静态的decorate()方法。
在这个方法中对要格式化列的数据进行格式化操作。
或许这么说有些抽象,让我们来看一个例子。
这个实例其实是DisplayTag自带的,我在这里只是进行简单的讲解。
代码如下:
importjava.util.Date;
importmons.lang.time.FastDateFormat;
importorg.displaytag.decorator.ColumnDecorator;
publicclassLongDateWrapperimplementsColumnDecoratorprivateFastDateFormatdateFormat;
publicLongDateWrapper()dateFormat=FastDateFormat.getInstance("MM/dd/yyyy
HH:
mm:
ss");
publicfinalStringdecorate(ObjectcolumnValue)
Datedate=(Date)columnValue;
returndateFormat.format(date);
code
该实例要对当前列的Date对象进行某种形式的格式化操作
实际上是MM/dd/yyyyHH:
mm:
ss的形式,这可以在
对象,并进行cast,然后使用commons-lang包中的
的结果。
与上原理所述,只要实现一个implemets了
ColumnDecorator的类,并override自己相应的decorate
)方法就可以了。
另外,为了提高性能,最好是将初始化的操作放到该类的构造函数中,否则,当iterate数据记录的时候还要初始化资源,那性能可想而知不会高到那里去的。
4-2tabledecorator阐述
TableDecorator笔者使用的更多一些,他可以对整个表格的输出在显示之前进行格式化。
表格在显示的时候,每次iterate
中是否实现了
到一行记录的时候,都会首先查询decorator
对各个列的数据对象进行格式化的方法,如果有,则调用这些方法对当前数据对象进行格式化,然后返回格式化后的结果进行显示;否则,直接返回当前数据对象进行显示。
如果说原始的数据对象不能够满足你数据显示需要的话,
tableDecorator就可以帮你忙。
上面已经谈到过column
Decorator遇到的问题:
不能引用同行的数据对象,而现在
tabledecorator就可以,你可以结合同一行的数据对当前行进行格式化,这在比如设置连接的时候要为连接设置不同的参数情况下特别有用。
稍后实例将会有说阐明。
要编写Tabledecorator,首先需要继承DisplayTag包中的
TableDecorator类,该类的确切位置是:
org.displaytag.decorator.TableDecorator。
之后,因为我们要可以对没一列都能进行格式化,所以,针对每一个要格式化的字段,只要想javabean的属性getter方法那样,实现每个字段的getter方法,并在该方法中实现针对该字段的格式化逻辑。
实例代码:
importorg.displaytag.decorator.TableDecorator;
importmons.beanutils.*;
publicclassUserTableDecoratorextendsTableDecoratorpublicUserTableDecorator()publicStringgetUserId()
Objectobj=this.getCurrentRowObject();
DynaBeanrow=(DynaBean)obj;
Stringdeco=""+row.get("userId");
returndeco;
这是笔者后面实例中将会用到的一个TableDecorator,他是用来实现表格显示的时候能够生成便于用户选择的
checkbox,以便用户可以选择一条或者多条数据进行删除或者其他操作。
他生成的界面类似于:
在这里,因为
ValueObject的UserID字段只是返回一个String型的数据,这不能满足我们要显示checkbox的需要,所以,按照
Javabean的getter方法形式,我们实现了publicString
getUserId()方法,并在这个方法中实现了将数据格式化为据对象并cast成正确的对象类型,就可以调用该对象的方法使用同一行的其他列数据了。
4-3其他,像表格的嵌套和表格的排序,表格的总结行的添加等功能,希望读者能够自己研读DisplayTagSa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DisplayTag 详解