DisplayTag是一个非常好用的表格显示标签适合MVC模式其主页在httpdisplaytagsourceforgenet一最简单的情况未使用标签标签遍历List里的每一个对象并将对象里的所有属性显示出来一般用于开发的时候检查对象数据的完整性二使用标签的情况property对应List里对象的属性用getXXX方法取得title则对应表格表头里的列名定义列有两种方式A使用标签里的property属性来定义Bemailitcom在标签体里增加内容可以是常量也可以用其他标签等等两种方式比较用property属性来定义更加快速和利于排序三表格显示样式的定义A在和标签里指定标准的html属性烦琐B修改样式表通过class属性来指定所要应用的样式可以在其默认样式表里cssscreencss直接修改四标签取得数据的数据源有四种范围pageScoperequestScope默认sessionScope注意这里要指定范围非默认applicationScope五通过增加id属性创建隐含的对象staticgetAttributetestitrowNumgetAttributetestitgetMoney注意到在里增加了id属性这时就在pagecontext里创建了一个隐含对象指向List里的当前对象可以通过ListObjectpageContextgetAttributeid来捕获这个对象同时还创建了一个idrowNum对象同样可通过pageContextgetAttributetestitrowNum来捕获它仅仅代表当前行的行数有了这两个隐含对象就可以通过其他标签来访问例如Jstl六显示部分数据显示开始五条数据通过设定length属性显示第三到第八条数据通过设定offset和length属性七对email和url地址的直接连接如果要显示的对象里包含email和url地址则可以在displaycolumn里直接设定autolinktrue来直接连接八使用装饰模式转换数据显示写自己的decoratorA对整个表格应用decoratororgdisplaytagsampleWrapper即自己写的decorator它要继承TableDecorator类看看它的一个方法publicStringgetMoneyreturnthismoneyFormatformatListObjectthisgetCurrentRowObjectgetMoney很明显它通过父类的getCurrentRowObject方法获得当前对象然后对其getMoney方法进行油漆B对单独的column应用decoratordecoratororgdisplaytagsampleLongDateWrapperorgdisplaytagsampleLongDateWrapper要实现ColumnDecorator接口它的方法publicfinalStringdecorateObjectcolumnValueDatedateDatecolumnValuereturnthisdateFormatformatdate显然它获得不了当前对象因为它实现的是接口仅仅是获得该对象的columnValue然后油漆九创建动态连接有两种方法创建动态连接A在里通过增加hrefparamIdparamNameparamScopeparamProperty属性href基本的URL地址paramId加在URL地址后的参数名称paramName数据bean的名称一般为null即使用当前List里的对象paramScope数据bean的范围一般为nullparamProperty数据bean的属性名称用来填充URL地址后的参数值paramNametestparamparamScoperequestparamIdidparamPropertyid这种方法简便直接但缺点是无法产生类似detailsjspidxxampactionxx的复合URLB应用decorator创建动态连接orgdisplaytagsampleWrapperorgdisplaytagsampleWrapper里的方法publicStringgetLink1ListObjectlObjectListObjectgetCurrentRowObjectintlIndexgetListIndexreturnlObjectgetIdpublicStringgetLink2ListObjectlObjectListObjectgetCurrentRowObjectintlIdlObjectgetIdreturnampactionviewViewampactioneditEditampactiondeleteDelete十分页实现分页非常的简单增加一个pagesize属性指定一次想显示的行数即可十一排序排序实现也是很简单在需要排序的column里增加sortabletrue属性headerClasssortable仅仅是指定显示的样式column里的属性对象要实现Comparable接口如果没有的话可以应用decoratordefaultsort1默认第一个column排序defaultorderdescending默认递减排序defaultorderdescendingheaderClasssortable注意的是当同时存在分页时排序仅仅针对的是当前页面而不是整个List都进行排序十二column分组分组只是需要在column里增加group属性十三导出数据到其他格式页面溢出filter在里设定exporttrue在里设定mediacsvexcelxmlpdf决定该字段在导出到其他格式时被包不包含不设定则都包含决定该种格式能不能在页面中导出mediacsvexcelxmlpdftitleNotOnHTML十四配置属性覆盖默认两种方法A在程序classpath下新建displaytagproperties文件B对于单个表格应用标签具体可配置的属性httpdisplaytagsourceforgenetconfigurationhtml十五一个完整的例子sortabletrueheaderClasssortablegroup2sortabletrueheaderClasssortablesortlist对整个list进行排序导出数据到其他格式时group无效第二篇DisplayTag七宗罪最近比较乱很长时间没更新空间了正好今天有话题准备更新下DisplayTagLib是一个标签库主要用来处理jsp网页上的Table功能非常强可以对的Table进行分页数据导出分组对列排序等等而且使用起来非常的方便能够大大减少代码量记得有N多朋友问过分页问题如何可以更加方便快速的处理我的回答好象每次都是DisplayTag然后步骤相同的向朋友讲它有什么功能能减少多少编码量发文档如何看war例子以至于当时都想把操作过程录下来来降低我的口水消耗量俗话说得好路遥知马力经过不断的使用感觉DisplayTag肾虚了问题与缺陷越来越多现在还在使用它的朋友如果已经放弃不用那么就别浪费时间看这个了如果还在使用的朋友最好能看看我总结的DisplayTag罪状倒能弥补些缺陷不至于问题出现时记恨在下呵呵1中文翻页排序问题对于中文无法翻页排序最简单的办法是修改Tomcat下的serverxml文件找到HTTP的Connector标签在里面添加一项URIEncoding引号里面的内容取决于你的页面编码比如可以是GBKUTF8等2分页数据加载问题DisplayTag的分页机制是这样的它把所有的数据放入集合中然后再进行分页处理这样在数据量比较大的情况下很容易造成性能下降或者内存超支等问题目前解决方法有两个一是在中增加两个属性partialListtruesizeresultSize每次只加再当前页数据还有就是实现orgdisplaytagpaginationPaginatedList接口自定义分页算法个人推荐第二种详细的实现方法可参考DisplayTag11所带的例子PS第二种方法还不完善DisplayTag中仍存在一些Bug3导出中文Excel问题当导出中文列表名和中文表格数据Excel时会产生乱码现象解决更改配置文件displaytagproperties使用displaytagexportpoijar包更改exportexcelclassorgdisplaytagexportExcelView为exportexcelclassorgdisplaytagexcelExcelHssfView这样可以解决中文表格数据的问题对于中文列表名乱码的问题必须更改orgdisplaytagexcelExcelHssfView源代码oldHSSFCellcellxlsRowcreateCellshortcolNumcellsetCellValuecolumnHeadercellsetCellStyleheaderStylecellsetEncodingHSSFCellENCODINGUTF16newHSSFCellcellxlsRowcreateCellshortcolNumcellsetEncodingHSSFCellENCODINGUTF16cellsetCellValuecolumnHeadercellsetCellStyleheaderStyle还有一种通过修改编码方式来支持中文的方法那就是将orgdisplaytagexportExcelViewjava中的getMimeType方法内容修改为returnapplicationvndmsexcelcharsetGB2312但是这样修改后导出速度将会非常慢呵呵4decorator内容无法导出问题和Html标签导出问题如果对table进行了decorator那么decorator后的内容将无法导出目前此问题无法解决所以最好不用decorator如果显示的内容使用了html标签进行了修饰那么它会将html标签一起导出也是没有什么好的解决方法5导出Excel兼容性问题有时会出现兼容性问题导出的Excel在Office2003下打不开PS导出问题不少尤其是Excel建议使用ApachePOI自己实现Excel的导出6同页面使用多个displayTag翻页问题DisplayTag翻页时页面上所有的displayTag元素都翻页解决办法对页面中的每个表格先判断它的记录是否为0如果为0则不使用DisplayTag7未知Bug比较多正式发布版本总是存在很多Bug在11版本发布时居然分页算法出现了明显Bug无语第三篇displayTag的应用displayTag作为当前还算得上比较流行的表现层工具插件在sourceForge官方网站httpdisplaytagsourceforgenet上平均每天的访问量数以万计本文是建立在实际开发过程中碰到的导出excel报表的实际需求所获得的一些学习心得与技巧与大家分享默认的displayTag导出的Excel格式会有中文乱码网上大部分文章都说只有改一下orgdisplaytagexportExcelView类中publicStringgetMimeTypereturnapplicationvndmsexcelNONNLS1方法在方法后面追加chartsetgbk其它不尽然如果这样改的话在tomcat作为web服务端的话如果列表中有中文很慢很慢才会有导出不过我至今尚未在tomcat下导出过中文把WEB应用布署在JBOSS下面导出的话如果数据量大的话也会有2040秒不等后来到displayTag的官网上去看它的bugtrack发现其实不尽然其它displayTag如果在你需要导出excel并且想自已利用apache的POI的话要再去到官方网上下载一个displaytagexportpoi11jar的包详细操作请看httpdisplaytagsourceforgenet11installhtml其中里面谈到如果每次导出的excel数据总是有缓存的话可以在webxml文件中加入如下配置进行过滤这样就可以导出实时数据了ConfiguretheFilterinyourwebxmlResponseOverrideFilterorgdisplaytagfilterResponseOverrideFilterAndaddmappingsforthepagesthatyouwillinterceptforexampleResponseOverrideFilterdoResponseOverrideFilterjsp从以上内容来看也只是告诉你如果要用apache的最新的POI的话需要把displaytagexportpoi11jar从官网下载下来放入你的工程文件中并没有说如何调用写自己的所需的excel的报表格式下面就实际问题来讨论一下如何让displayTag导出自己所需的excel格式在displayTag所提供的接口类中导出自已所需的Excel有两种方式一种是通过指定的excel模板一种是对excel的所有的格子一个个样式的处理后一种方式完全体现了慢工出细活的格言而前一种方式实现起来显然要好用得多只用读模板的样式就行了如何调用displayTag对导出自定制的Excel文件所提供的接口呢请看下文不要急噢要调用displayTag给Poi所提供的接口操作步骤如下1先要在你的appfuse工程中新建一个类让其实现orgdisplaytagexportBinaryExportView接口其中关键的方法是publicvoiddoExportOutputStreamoutthrowsJspExceptionStringcaptionvaluethismodelgetCaptionExcelHssfView1tempExcelViewnewExcelHssfView1tryBeanUtilssetPropertytempExcelViewactioncaptionvaluecatchIllegalAccessExceptioneTODOAutogeneratedcatchblockeprintStackTracecatchInvocationTargetExceptioneTODOAutogeneratedcatchblockeprintStackTraceifcaptionvaluenullcaptionvaluecaptionvaluereplaceAllrtdoExportCommonoutelseSystemoutprintlnexecCommondoExportCommonout对这个方法按照你的POI的定制excel报表的的方法然后实现它再把内容写入outputStream中去基本上就可以了当然如果有上面的thismodelgetCaption是读取displayTag的页面标签标签中的内容可以在不同的JSP页面放入不同的caption的值从而判断调用不同的方法生成不同的excel样式的报表灵活性兼而有之写完以上类以后最好先写个测试方法用main或junit工具都成看看你的调用poi的逻辑有没有问题当以上的类及方法写完后就要在你的appfuse工程中找displaytagproperties文件了一般就在webclass目录下找到后打开此文件添加如下一段配置exportexcelclassorgdisplaytagexportexcelExcelHssfView1后面一段是你的新建的类的文件的路径因为是多国语言系统所以最好把displayenproperties及displayzhCnproperties都加上到此就完成了使用自己的POI来在appfuse中导出指定格式样式的excel文件先别急噢还有更精彩的等着你这个时候又有一个问题来了如果你页面想要显示某些列表字段列而导出的excel文件中又不出现这样的字段又该如何处理呢嘿嘿请接着看下文如果要实现以上功能请如下操作1调整页面上的displayTag标签的参数值呵比如requestURIsortlistidtestListpagesize5classtabletestListexporttruedefaultsort1defaultorderdescendingExportByCommontargetoperationFramegiftitlevalueStatustestListstatustitleRemarksstylewordwrapbreakwordwordbreakbreakallwidth90pxvalue注意上面用了多种配置需求可以自已加链接自定义导出名自定义表头表尾自定义是否全排序自定义样式等这些网上都有就不细说了关键的需求点media的配置参数噢如果mediaexcel表示只在excel中显示如果mediahtml表示仅在页面出现没有此参数是两个都显示噢其它的格式也类同设置到此displayTag的点点心得分享与大家完毕谢谢大家花费时间分享我的快乐噢上文提到中文问题用POI后就解决了第四篇displaytag111之中文乱码解决方案1displaytag页面的汉化把displaytagproperties考到项目里同时复制一份displaytagproperties修改文件名displaytagzhCNproperties把文件里面的对应条目改成中文即可同时文件里的对应两条配置注意选择合适的使用下面是struts的配置localeproviderorgdisplaytaglocalizationI18nStrutsAdapterlocaleresolverorgdisplaytaglocalizationI18nStrutsAdapter2excel导出中文内容乱码重载类orgdisplaytagexportExcelView复写publicStringgetMimeTypereturnapplicationvndmsexcelcharsetgbkNONNLS1原代码是returnapplicationvndmsexcelNONNLS1修改displaytagzhCNproperties中对应条目exportexcelclassyourpackageSimpleChineseExcelView3Excel导出文件名中文乱码重载类orgdisplaytagtagsSetPropertyTag复写privateStringvaluepublicvoidsetValueStringpropertyValuetrythisvaluenewStringpropertyValuegetBytesGBKISO88591catchExceptionethisvaluepropertyValuesupersetValuethisvalue修改displaytagtld对应条目setPropertyorgdisplaytagtagsSetPropertyTag45yourpackageSimpleChineseSetPropertyTag在jsp中应用时称xls注意这种解决方案只能解决value的中文名称而不能解决bodycontent内的中文名称如导出菜单xls4Excel导出文件名中文乱码bodycontent中的不完美解决方案这种解决方案之所以称之为不完美适应为它要借助页面中的java代码实现使用MesourcesMessageResourcesmrsMessageResourcesrequestgetAttributeorgapachestrutsactionMESSAGEStringfileNamemrsgetMessagemenuexportexcelfilenamefileNamenewStringfileNamegetBytesGBKISO88591outprintfileName谁有好的解决方案可以回帖感激不尽Hibernate和displayTag完美分页3步曲displaytag中的分页对于数据量不大来说是很好的只需要简单的配置就可以做出来强大的功能但是要注意的是分页链接的编码问题我们知道的这样的分页模式在数据量大时对于性能来说是个问题毕竟将大量的数据一次性取出来而用到的只有少数不是很好的选择而Hibernate强大的分页功能对于我们来说再简单不过了但是却不知道如何2者结合起来使用下面就是一个很好的例子只需要3部1AddpartialListtruesizeresultSizetothedisplaytaginyourjspfilelikesorequestURIdefaultsort1idcpagesize25partialListtruesizeresultSizeclasslistexportfalse2ModifyyouractionfilebyaddingamethodwhichgetsthepagenumberfromtherequestpublicfinalclassDisplayTagActionextendsBaseActionpublicActionForwardexecuteActionMappingmappingActionFormformHttpServletRequestrequestHttpServletResponseresponsethrowsExceptioniflogisDebugEnabledlogdebugEnteringexecutemethodTestDataManageramgrTestDataManagergetBeantestDataManagergetthepagenumberfromrequestintpagegetPagerequestintsize25passinpageandsizerequestsetAttributecollectionamgrgetTestDatapagesizegetthetotalsizeofcollectionrequiredfordisplaytagtogetthepaginationtoworkrequestsetAttributeresultSizenewIntegeramgrgetTestDataSizereturnmappingfindForwarddisplayTagPagepublicintgetPageHttpServletRequestrequestintpage0EnumerationparamNamesrequestgetParameterNameswhileparamNameshasMoreElementsStringnameStringparamNamesnextElementifnamenullampampnamestartsWithdampampnameendsWithpStringpageValuerequestgetParameternameifpageValuenullpageIntegerparseIntpageValue1returnpage3ModifythedataaccesscalltoreturnapaginatedlistpublicListgetTestDataintpageintpageSizeQueryquerygetSessioncreateQueryfromTestreturnquerysetFirstResultpagepageSizesetMaxResultspageSize1listpublicintgetTestDataSizereturnIntegergetSessioncreateQueryselectcountfromTestuniqueResultintValue