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

    本文介绍DisplayTag的一些使用方法。摘自[http://hongyu0809.spaces.msn.com/PersonalSpace.aspx]
    DisplayTag 基本介绍
    DisplayTag是一个非常好用的表格显示标签,适合MVC模式,
    其主页在http://displaytag.sourceforge.net
    在这里可以下载displaytag-1.0.jar
    同时需要一下包文件:
    jstl.jar
    standard.jar
    commons-lang-2.0.jar
    commons-collections.jar
    commons-beanutils.jar
    crimson.jar
    gnujaxp.jar
    nekohtml.jar(org.cyberneko.html.parsers.DOMFragmentParser等)
    xerces-2.4.0.jar(org.apache.html.dom.HTMLDocumentImpl等)
    poi-2.5.1-final-20040804.jar
    然后把对应的jar文件copy到WEB-INF/lib中.
    DisplayTag的使用:
    <display:table id="pres" name="${pagedData.data}" sort="list" 
    styleClass="list" export="true"
    requestURI="${request.contextPath}" pagesize="10" defaultsort="3">
    name是要展现的集合数据.
    id:在<display:table/>里增加了id属性,就在page context里创建了一个隐含对象,指向List里的当前对象,
     所以可以通过(ListObject)pageContext.getAttribute("id")来捕获这个对象。
     同时还创建了一个id_rowNum对象,
     可通过pageContext.getAttribute("testit_rowNum")来捕获,它仅仅代表当前行的行数。
    sort     表示整个list被排序.
    pagesize   表示每页所要展示的数.
    defaultsort   表示默认是按第几列排序的,注意这里是以1开始计数的,默认从第一列开始排序.
    defaultorder    指定排序方式,defaultorder="descending" 指定默认为降序
    styleClass    指定所要应用的样式.
    requestURI
    <display:caption>使用displayTag示例</display:caption>
    display:caption标记中间的字符串是用来放到表格上面的标题.
    <display:column property="firstName" title="First Name" sortable="true" export="true"/>
    display:column标记指定了每列的属性.
    property   对应List里对象的属性(它是用getXXX()方法获取)
    title      对应表格表头里的列名
    export="true"              导出文件时导出该列
    sortable="true"            设定该列可进行排序
    分类样板说明如下:
      
      一、最简单的情况,未使用<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属性来指定所要应用的样式。
      
      四、标签取得数据的数据源
      
      有四种范围
      
      pageScope
      requestScope (默认) <display:table name="test2" >  相当于request.getAttribute( "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里创建了一个隐含对象,
      可以通过(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文件所有时区共用,
          建中文编码则创建displaytag_zh_CN.properties,放到类路径下,
          jar包内共有两个默认的属性文件TableTag.properties,message.properties
      B、对于单个表格,应用<display:setProperty>标签(<display:setProperty name=... value=...>)
      十五、一个完整的例子
      
      <display:table id="test" name="${test}" export="true" sort="list" pagesize="10">
      <display:column property="city" title="城市" group="1" sortable="true" headerClass="sortable"/>
      <display:column property="name" title="名字" group="2" sortable="true" headerClass="sortable"/>
      <display:column property="age" title="年龄"/>
      </display:table>
      
      sort="list" 对整个list进行排序
       十六 其它
      
      1)当多个表在一页显示时,每个表都想要有分页、排序、导出等功能时,只需为每个table指定一个不同的ID即可。
      2)增加表头<display:caption>角色管理</display:caption>
      3)增加表尾  <display:footer><tr><td colspan="6" align="center" >HY示例</td></tr></display:footer>
      4)http和email自动链接功能,指定autolink="true"
      5)指定一列显示的最大长度,避免太长把表格变形 maxLength="10" style="whitespace: nowrap;"
      6)当列的值为null,使用nulls="false"属性把null转为空白 
      7)<display:setProperty name="export.excel.filename" value="test.xls"/>设置导出excel的文件名
      8)<display:setProperty name="basic.show.header" value="false"/> 设置不显示表头
      9)在displaytag.properties里修改paging.banner.item_name=记录后,出现中文显示乱码问题,
      解决办法:
      org.displaytag.properties.TableProperties
      修改
      private String getProperty(String key)
      {
      return this.properties.getProperty(key);
      }
      为
      private String getProperty(String key)
     {
     String s = null;
     try {
     s = new String(this.properties.getProperty(key).getBytes("8859_1"), "GBK");
     }catch(Exception e) {
     s = null;
     }
     return s;
     }
     10)displaytag导出excel文件中文乱码的解决办法
      修改org.displaytag.export.ExcelView.java
      public String getMimeType()
      {
       return "application/vnd.ms-excel;charset=GB2312";
      }
     十七 总结
      我自己使用过程中,遇到显示当前页数,页总数等文字信息为英文的问题,
      需要把displaytag_zh_CN.properties,放到类路径下就可以了。
     
  • 相关阅读:
    [树形DP]Luogu P1131 [ZJOI2007]时态同步
    [状压DP]JZOJ 1303 骑士
    [DFS]JZOJ 1301 treecut
    [最小费用最大流]JZOJ 4802 探险计划
    [KMP][倍增求LCA]JZOJ 4669 弄提纲
    [DP]JZOJ 1758 过河
    列表生成式和生成器表达式
    协程函数
    生成器
    迭代器
  • 原文地址:https://www.cnblogs.com/huangchuansen/p/3374593.html
Copyright © 2011-2022 走看看