zoukankan      html  css  js  c++  java
  • displayTag标签

    DisplayTag七宗罪(转)

    最近比较乱,很长时间没更新空间了,正好今天有话题,准备更新下^_^Display Tag Lib是一个标签库,主要用来处理jsp网页上的Table,功能非常强,可以对的Table进行分页、数据导出、分组、对列排序等等,而且使用起来非常的方便,能够大大减少代码量.记得有N多朋友问过分页问题如何可以更加方便、快速的处理,我的回答好象每次都是"DisplayTag",然后步骤相同的向朋友讲它有什么功能、能减少多少编码量、发文档、如何看war例子.以至于当时都想把操作过程录下来,来降低我的口水消耗量.俗话说得好"路遥知马力",经过不断的使用,感觉DisplayTag"肾虚"了,问题与缺陷越来越多.现在还在使用它的朋友,如果已经放弃不用,那么就别浪费时间看这个了;如果还在使用的朋友,最好能看看我总结的DisplayTag罪状,倒能弥补些缺陷,不至于问题出现时记恨在下.呵呵.1.中文翻页、排序问题:对于中文无法翻页、排序,最简单的办法是修改Tomcat下的server.xml文件.找到HTTP的Connector标签,在里面添加一项URIEncoding="...",引号里面的内容取决于你的页面编码,比如可以是 GBK,UTF-8等.2.分页数据加载问题:DisplayTag的分页机制是这样的,它把所有的数据放入集合中,然后再进行分页处理.这样在数据量比较大的情况下,很容易造成性能下降或者内存超支等问题.目前解决方法有两个,一是在<displaytag>中增加两个属性:partialList="true"size="resultSize",每次只加再当前页数据.还有就是实现 org.displaytag.pagination.PaginatedList接口,自定义分页算法.个人推荐第二种,详细的实现方法可参考 DisplayTag 1.1所带的例子.
    PS:第二种方法还不完善,DisplayTag中仍存在一些Bug.3.导出中文Excel问题:当导出中文列表名和中文表格数据Excel时,会产生乱码现象.
    解决:
    更改配置文件displaytag.properties,使用displaytag-export-poi.jar包.更改 export.excel.class=org.displaytag.export.ExcelView为 export.excel.class=org.displaytag.excel.ExcelHssfView,这样可以解决中文表格数据的问题.对于中文列表名乱码的问题,必须更改org.displaytag.excel.ExcelHssfView源代码:old:
    HSSFCell cell = xlsRow.createCell((short) colNum++);
    cell.setCellValue(columnHeader);
    cell.setCellStyle(headerStyle);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);new:
    HSSFCell cell = xlsRow.createCell((short) colNum++);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue(columnHeader);
    cell.setCellStyle(headerStyle);还有一种通过修改编码方式来支持中文的方法,那就是将 org.displaytag.export.ExcelView.java中的getMimeType()方法内容修改为return "application/vnd.ms-excel;charset=GB2312";但是这样修改后,导出速度将会非常慢,呵呵.4.decorator内容无法导出问题和Html标签导出问题:如果对table进行了decorator,那么decorator后的内容将无法导出.目前此问题无法解决.所以最好不用decorator.如果显示的内容使用了html标签进行了修饰,那么它会将html标签一起导出.也是没有什么好的解决方法.5.导出Excel兼容性问题:有时会出现兼容性问题,导出的Excel在Office 2003下打不开.
    PS:导出问题不少,尤其是Excel.建议使用Apache POI自己实现Excel的导出.6.同页面使用多个displayTag翻页问题.DisplayTag翻页时,页面上所有的displayTag元素都翻页.解决办法:对页面中的每个表格,先判断它的记录是否为0,如果为0则不使用DisplayTag.7.未知Bug比较多:正式发布版本总是存在很多Bug.在1.1版本发布时,居然分页算法出现了明显Bug,无语.


    ======================第三篇=====================================

    displayTag的应用 displayTag作为当前还算得上比较流行的表现层工具插件,在sourceForge官方网站(http://displaytag.sourceforge.net/)上,平均每天的访问量数以万计,本文是建立在实际开发过程中
    碰到的导出excel报表的实际需求,所获得的一些学习心得与技巧与大家分享.
    默认的displayTag导出的Excel格式会有中文乱码,网上大部分文章都说只有改一下,org.displaytag.export.ExcelView类中,
    public String getMimeType()
    {
    return "application/vnd.ms-excel"; //$NON-NLS-1$
    }
    方法,在方法后面追加;chartset=gbk;其它不尽然,如果这样改的话在tomcat作为web服务端的话,如果列表中有中文,很慢很慢才会有导出(不过,我至今尚未在tomcat下导出过中文),
    把WEB应用布署在JBOSS下面,导出的话,如果数据量大的话也会有20-40秒不等,后来到displayTag的官网上,去看它的bugtrack,发现其实不尽然。其它displayTag如果在你需要导出excel并且想自已利用apache的
    POI的话,要再去到官方网上下载一个displaytag-export-poi-1.1.jar的包,详细操作请看http://displaytag.sourceforge.net/11/install.html

    其中里面谈到,如果,每次导出的excel数据总是有缓存的话,可以在web.xml文件中加入如下配置进行过滤,这样就可以导出实时数据了。
    Configure the Filter in your web.xml:

    <filter>
    <filter-name>ResponseOverrideFilter</filter-name>
    <filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
    </filter>And add mappings for the pages that you will intercept, for example:

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

    从以上内容来看,也只是告诉你,如果要用apache的最新的POI的话,需要把displaytag-export-poi-1.1.jar从官网下载下来,放入你的工程文件中,
    并没有说如何调用写自己的所需的excel的报表格式.下面就实际问题,来讨论一下如何让displayTag导出自己所需的excel格式.
    在displayTag所提供的接口类中,导出自已所需的Excel有两种方式,一种是通过指定的excel模板,一种是对excel的所有的格子,一个个样式的处理,
    后一种方式完全体现了“慢工出细活”的格言,而前一种方式实现起来显然要好用得多,只用读模板的样式就行了。如何调用displayTag对导出自定制的Excel文件
    所提供的接口呢,请看下文,(不要急噢!^_^)
    要调用displayTag给Poi所提供的接口操作步骤如下:
    1,先要在你的appfuse工程中新建一个类,让其实现org.displaytag.export.BinaryExportView接口,其中关键的方法是
    public void doExport(OutputStream out) throws JspException {
    String captionvalue = this.model.getCaption();
    // ExcelHssfView1 tempExcelView=new ExcelHssfView1();
    // try {
    // BeanUtils.setProperty(tempExcelView, "action",captionvalue);
    // } catch (IllegalAccessException e) {
    // // TODO Auto-generated catch block
    // e.printStackTrace();
    // } catch (InvocationTargetException e) {
    // // TODO Auto-generated catch block
    // e.printStackTrace();
    // }
    if (captionvalue != null) {
    captionvalue = captionvalue.replaceAll("(\r)|(\n)|(\t)", "");

    doExportCommon(out);


    } else {
    System.out.println("exec Common");
    doExportCommon(out);
    }
    }
    对这个方法按照你的POI的定制excel报表的的方法,然后实现它,再把内容写入outputStream中去,基本上就可以了,当然如果有上面的

    this.model.getCaption()是读取displayTag的页面标签<displayTag:caption/>标签中的内容,可以在不同的JSP页面放入不同的caption的值
    从而判断调用不同的方法,生成不同的excel样式的报表,灵活性兼而有之.
    写完以上类以后,最好先写个测试方法,用main或junit工具都成,看看你的调用poi的逻辑有没有问题。
    当以上的类及方法写完后,就要在你的appfuse工程中找displaytag.properties文件了,一般就在web/class/目录下,找到后,打开此文件,添加如下一段配置:
    export.excel.class=org.displaytag.export.excel.ExcelHssfView1
    后面一段是你的新建的类的文件的路径
    因为是多国语言系统,所以最好把display_en.properties及display_zh_Cn.properties都加上.
    到此就完成了,使用自己的POI来在appfuse中导出指定格式样式的excel文件.先别急噢,还有更精彩的等着你。这个时候又有一个问题来了,如果你
    页面想要显示某些列表字段列,而导出的excel文件中又不出现这样的字段,又该如何处理呢,嘿嘿,请接着看下文。
    如果要实现以上功能请如下操作:
    1,调整页面上的displayTag标签的参数值,呵,比如:

    <display:table name="testList" cellspacing="0" cellpadding="0" requestURI="" sort="list"
    id="testList" pagesize="5" class="table testList" export="true"
    defaultsort="1" defaultorder="descending" >
    <display:caption media="excel">ExportByCommon</display:caption>
    <display:column title="ID" sortable="true" media="html">
    <a href="/aaa.html?id=<c:out value="${testList.id }" /> "
    target="operationFrame">
    <c:out value="${testList.id }" />
    </a>

    </display:column>
    <display:column title="Status" sortable="true" media="html">
    <img src="<c:out value="${testList.status}" />.gif" title="<c:out value="Status:${testList.status}" />">
    </display:column>

    <display:column property="remarks" escapeXml="true" sortable="true"
    title="Remarks" style="word-wrap: break-word;word-break: break-all; 90px;"/>
    <display:footer media="excel">
    <c:out value="${aa }"></c:out>|
    <c:out value="(${bb })"></c:out>|
    <c:out value="${currentDate }"></c:out>
    </display:footer>
    <display:setProperty name="item_name" value="Info"/>
    <display:setProperty name="items_name" value="Infos"/>
    <display:setProperty name="export.excel" value="true" />
    <display:setProperty name="export.excel.filename" value="<%=exportFileName%>"/>
    <display:setProperty name="export.csv" value="false" />
    <display:setProperty name="export.xml" value="false" />
    <display:setProperty name="export.pdf" value="false" />
    </display:table>
    </form>
    注意上面用了多种配置需求,可以自已加链接,自定义导出名,自定义表头表尾,自定义是否全排序,自定义样式等,这些网上都有,就不细说了,
    关键的需求点media的配置参数噢,如果media="excel"表示只在excel中显示,如果media=html表示仅在页面出现,没有此参数是两个都显示噢
    其它的格式也类同设置,到此displayTag的点点心得分享与大家完毕,谢谢大家花费时间分享我的快乐!^_^
    噢,上文提到中文问题,用POI后就解决了!


    ==============================第四篇=============================
    displaytag-1.1.1之中文(乱码)解决方案
    1,displaytag页面的汉化:
    把displaytag.properties考到项目里,同时复制一份displaytag.properties,修改文件名displaytag_zh_CN.properties,把文件里面的对应条目改成中文即可 ;
    同时,文件里的对应两条配置注意选择合适的使用,下面是struts的配置
    locale.provider=org.displaytag.localization.I18nStrutsAdapter
    locale.resolver=org.displaytag.localization.I18nStrutsAdapter

    2,excel导出中文内容乱码:
    重载类org.displaytag.export.ExcelView,复写
    public String getMimeType(){
          return "application/vnd.ms-excel;charset=gbk" ; //$NON-NLS-1$
    }
    原代码是return "application/vnd.ms-excel"; //$NON-NLS-1$
    修改displaytag_zh_CN.properties中对应条目:
    export.excel.class=yourpackage.SimpleChineseExcelView

    3,Excel导出文件名中文乱码:
    重载类org.displaytag.tags.SetPropertyTag,复写
    private String value;
    public void setValue(String propertyValue){
    try{
        this.value = new String(propertyValue.getBytes("GBK"),"ISO-8859-1");
    }catch(Exception e){
        this.value = propertyValue;
    }
    super.setValue(this.value);
    }
    修改displaytag.tld对应条目
    <name>setProperty</name>
    <!-- <tag-class>org.displaytag.tags.SetPropertyTag</tag-class> -->
    <tag-class>yourpackage.SimpleChineseSetPropertyTag </tag-class>
    在jsp中应用时
    <display:setProperty name="export.excel.filename" value="导出中文名称.xls "/>
    注意,这种解决方案只能解决value的中文名称,而不能解决bodycontent内的中文名称,如
    <display:setProperty name="export.excel.filename">导出菜单.xls</
    display:setProperty >

    4,Excel导出文件名中文乱码bodycontent中的不完美解决方案
    <display:setProperty name="export.excel.filename">
    <%=new String("导出菜单.xls".getBytes("GBK"),"ISO-8859-1") %>
    </display:setProperty>
    这种解决方案之所以称之为不完美适应为它要借助页面中的java代码实现

    使用Mesources
    <display:setProperty name="export.excel.filename">
    <%
    MessageResources mrs = (MessageResources)request.getAttribute("org.apache.struts.action.MESSAGE");
    String fileName = mrs.getMessage("menu.export.excel.filename");
    fileName = new String(fileName.getBytes("GBK"),"ISO-8859-1");
    out.print(fileName);
    %>
    </display:setProperty>

  • 相关阅读:
    cocos2dx 3.x(获取当前系统时间)
    cocos2dx 3.x(加载cocostudio进度条)
    cocos2dx 3.x(Button传统按钮)
    cocos2dx 3.x以上(Sprite精灵类的相关属性与创建)
    cocos2dx 3.x版本搭建Mac环境工程(创建一个新的C++工程)百分百可行
    iOS
    iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)
    iOS -Swift 3.0 -String(字符串常规用法)
    iOS -Swift 3.0 -UIButton属性大全
    iOS -Swift 3.0 -UILabel属性大全
  • 原文地址:https://www.cnblogs.com/huangchuansen/p/3368613.html
Copyright © 2011-2022 走看看