现在的位置: 首页 > 综合 > 正文

Display 应用指南

2013年10月07日 ⁄ 综合 ⁄ 共 9728字 ⁄ 字号 评论关闭
DisplayTag是一个非常好用的表格显示标签,适合MVC模式,其主页在http://displaytag.sourceforge.net  %|@�&ZRg  
一、最简单的情况,未使用<display:column/>标签 Av"Q%:Li  
  <%request.setAttribute( "test", new ReportList(6) );%> -p8R#a;B  
  <display:table name="test" /> 7pmkQA  
  标签遍历List里的每一个对象,并将对象里的所有属性显示出来。一般用于开发的时候检查对象数据的完整性。 _<#W1��-T  
  >h<.PT{  
二、使用<display:column/>标签的情况 |.`9;  
<display:table name="test"> ,@7H}>@i  
  <display:column property="id" title="ID" /> Zf,MS(lS  
  <display:column property="name" /> axv]IhC  
  <display:column property="email" /> n9/!?i3  
  <display:column property="status" /> }KUtj6'KO@  
  <display:column property="description" title="Comments"/> *t'oMu0  
</display:table> 2M/gUA n,  
  property对应List里对象的属性(用getXXX()方法取得),title则对应表格表头里的列名。定义列有两种方式: dc!og>_  
  A、<display:column property="email" /> /F;f4[%z:  
      使用<display:column/>标签里的property属性来定义 Lg`N �_
 
  B、<display:column title="email">email@it.com</display:column> z%}:cLtaCx  
      在<display:column/>标签体里增加内容,可以是常量,也可以用其他标签等等
?f)!�PvB
 
  两种方式比较,用property属性来定义更加快速和利于排序。 V*%XK dSCn  
  m:e#xFNr  
三、表格显示样式的定义 8WL9{>_r  
  A、在<display:table/>和<display:column/>标签里指定标准的html属性,烦琐 ?%0-`J-  
  B、修改样式表 ##T8nj"!  
<display:table name="test" class="mars"> V80ya9f}g  
  <display:column property="id" title="ID" class="idcol"/> ;={D(WJ%|  
  <display:column property="name" /> jucE8M?B&W  
  <display:column property="email" /> Ar'b>
 
  <display:column property="status" class="tableCellError" /> A==/{SH  
  <display:column property="description" title="Comments"/> k$|~8w6+X  
</display:table> vN%AbJmX  
  通过class属性来指定所要应用的样式。可以在其默认样式表里(./css/screen.css)直接修改 'kF$rX  
  jH>:s~S  
四、标签取得数据的数据源 D^Wr-b<P`  
  有四种范围 !(/N
w)I
 
  pageScope YL)uxV(]L^  
  requestScope (默认)  <display:table name="test2" > .l7`r7  
  sessionScope  <display:table name="sessionScope.holder.list" > 注意,这里要指定范围,非默认 <M_^Wk'f  
  applicationScope /*@z:m1>e  
  _{L&C
E
 
五、通过增加id属性创建隐含的对象 0vl.[x3w  
<display:table name="test" id="testit"> 1/VCoRL0e  
    <display:column property="id" title="ID" /> ydx[1ko^  
    <display:column property="name" /> =pE=s  
    <display:column title="static value">static</display:column> %%T/5}
j
 
 
  <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> imxg-Ayr)  
</display:table> ywZ&3_zc  
  注意到在<display:table/>里增加了id属性,这时就在page context里创建了一个隐含对象,指向List里的当前对象, w@`&d3(D)  
  可以通过(ListObject)pageContext.getAttribute("id")来捕获这个对象。同时还创建了一个id_rowNum对象,同样,可 `-K7yLoF+  
  通过pageContext.getAttribute("testit_rowNum")来捕获,它仅仅代表当前行的行数。 bNE2-?j  
  有了这两个隐含对象,就可以通过其他标签来访问,例如Jstl: C_-oYG  
  <display:table id="row" name="mylist"> 8<?s,  
    <display:column title="row number" > &C WWxn  
      <c:out value="${row_rowNum}"/> Gh"H'n6  
    </display:column> KmEK:4  
    <display:column title="name" > <8*M(V]  
      <c:out value="${row.first_name}"/> j$'1$/)#[  
      <c:out value="${row.last_name}"/> CoCnW%^7  
    </display:column> J=~>JCQ  
  </display:table> VP5MQr  
  CFul;
(z@
 
六、显示部分数据 iBP%02-
 
  显示开始五条数据:通过设定length属性 NtN.Ea&b^o  
<display:table name="test" length="5"> ,6'*sxN  
  <display:column property="id" title="ID" /> uFf2#Lax  
  <display:column property="email" /> SOh�V|G  
  <display:column property="status" /> ly;}a=x^  
</display:table> [UB_tQY}  
  显示第三到第八条数据:通过设定offset和length属性 6Kl~%GAP  
<display:table name="test" offset="3" length="5"> DE9=X@/bu  
  <display:column property="id" title="ID" /> x5/�>3qk  
  <display:column property="email" /> $==AJv'  
  <display:column property="status" /> O,}Wz!  
</display:table>  MUvL~.  
daNx|VP  
七、对email和url地址的直接连接 xB_-oO+  
<display:table name="test" > |0YouI,  
  <display:column property="id" title="ID" /> &|"mfRni  
  <display:column property="email" autolink="true" /> #VP2s^}MR  
  <display:column property="url" autolink="true" /> R}Zf;R.VJ  
</display:table> 0
"M//qvvq
 
如果要显示的对象里包含email和url地址,则可以在display:column里直接设定autolink="true"来直接连接 eU�,2  
ZC/z/q  
八、使用装饰模式转换数据显示(写自己的 decorator ) Xi/iBpgt  
  A、对整个表格应用decorator {mY7�JS}+  
  <display:table name="test" decorator="org.displaytag.sample.Wrapper" > T:ltQ(_!{  
      <display:column property="id" title="ID" /> /PXQ,}1  
      <display:column property="email" /> HT�QV
F8
 
      <display:column property="status" /> 56I|be(Q  
      <display:column property="date" /> LENpy+�}o  
      <display:column property="money" /> "S�6DM&,Y  
  </display:table> ;X!]6>:  
    org.displaytag.sample.Wrapper即自己写的decorator,它要继承TableDecorator类,看看它的一个方法: Wk(cw&  
        public String getMoney() 7v_fVR"M2%  
    { oHF55|5dm^  
        return this.moneyFormat.format(((ListObject) this.getCurrentRowObject()).getMoney()); iIX1bdbT  
    } Tr"Yrd  
    很明显,它通过父类的getCurrentRowObject()方法获得当前对象,然后对其getMoney()方法进行‘油漆’ XT7r[8RJ  
  B、对单独的column应用decorator H`1%nr'B]  
  <display:table name="test"> ERU@
N(;g
 
    <display:column property="id" title="ID" /> 2tLHpzn/  
    <display:column property="email" /> `?Ryu[Df  
    <display:column property="status" /> `2p7=& e  
    <display:column property="date" decorator="org.displaytag.sample.LongDateWrapper" /> ZuzI@b  
  </display:table> YA^%"{V  
    org.displaytag.sample.LongDateWrapper要实现ColumnDecorator接口,它的方法: mc%l5t_  
        public final String decorate(Object columnValue) tZ / }lZ8  
    { 1
~ivEs"
 
        Date date = (Date) columnValue; ~]d^N@J  
        return this.dateFormat.format(date);
c]uCAS
 
    } /LJp g#a}  
    显然,它获得不了当前对象(因为它实现的是接口),仅仅是获得该对象的columnValue,然后‘油漆’ :sqr`d>  
    Zq":Un]  
九、创建动态连接 VTF~E;  
  有两种方法创建动态连接: Gdggh@+X  
  A、在<display:column/>里通过增加href、paramId、paramName、paramScope、paramProperty属性 LzvwfL4  
      href            基本的URL 地址 ph*]�G  
      paramId          加在URL 地址后的参数名称 8&%+XHG>r  
      paramName        数据bean的名称,一般为null(即使用当前List里的对象) ps
>"|3M
 
      paramScope      数据bean的范围,一般为null @-haYE  
      paramProperty    数据bean的属性名称,用来填充URL 地址后的参数值 >Sl
E9adMC
 
<display:table name="sessionScope.details"> cU)rzOW  
  <display:column property="id" title="ID" href="details.jsp" paramId="id" /> Z9N~WY?  
  <display:column property="email" href="details.jsp" paramId="action" paramName="testparam" paramScope="request" /> $KCS1`U  
  <display:column property="status" href="details.jsp" paramId="id" paramProperty="id" /> t{cAWCR  
</display:table>  9k'5TlL-  
    这种方法简便直接,但缺点是无法产生类似details.jsp?id=xx&action=xx的复合URL NtOL>TO  
  B、应用decorator 创建动态连接: te1m6o"  
<display:table name="sessionScope.details" decorator="org.displaytag.sample.Wrapper" > .hfpZ`)N  
  <display:column property="link1" title="ID" /> 2aRDJi7]  
  <display:column property="email" /> g#a] '~d  
  <display:column property="link2" title="Actions" /> :r',
|v=u
 
</display:table> I,nqJMUs  
  org.displaytag.sample.Wrapper里的方法: Ui@lX`s
 
    public String getLink1() H^3rhL:}S  
    { &B _W  
        ListObject lObject= (ListObject)getCurrentRowObject(); kD^N.;4z  
        int lIndex= getListIndex(); dM]?BvW  
        return "<a href=/"details.jsp?index=" + lIndex + "/">" + lObject.getId() + "</a>"; O!L/>"Ca  
    } X<Nt6S>  
]`+?_YlMn  
G'k#|]  
    public String getLink2() ]Y;f=6D  
    { .a>?rk)1  
        ListObject lObject= (ListObject)getCurrentRowObject(); $w-4LT/  
        int lId= lObject.getId(); ~DuF}&dl  
;o%yl=�  
        return "<a href=/"details.jsp?id=" + lId wIza3f  
            + "&action=view/">View</a> | " szNn?A-6  
            + "<a href=/"details.jsp?id=" + lId 1/EaG2z  
            + "&action=edit/">Edit</a> | " 21Uw "  
            + "<a href=/"details.jsp?id=" + lId IT'A{5.$m[  
            + "&action=delete/">Delete</a>"; ^`T;wNJRJr  
    } 159hPD[z  
n2W>/Ml>  
十、分页 L.awn+G|N  
  实现分页非常的简单,增加一个pagesize属性指定一次想显示的行数即可 pI#
=Lnh
 
<display:table name="sessionScope.test" pagesize="10"> C28i|)X5  
    <display:column property="id" title="ID" /> n],xj6@  
    <display:column property="name" /> }<mIRs&  
    <display:column property="email" /> d)_X.tYtf  
    <display:column property="status" /> ``V_B  
</display:table> [YryZV/"MD  
7lM>o/:a'  
十一、排序 DHtiYO
 
  排序实现也是很简单,在需要排序的column里增加sortable="true"属性,headerClass="sortable"仅仅是 B ]uhd=b{  
  指定显示的样式。column里的属性对象要实现Comparable接口,如果没有的话可以应用decorator mZ}eS  
  defaultsort="1"              默认第一个column排序 uA#gX  
  defaultorder="descending"    默认递减排序 e8%AhaI?C(  
<display:table name="sessionScope.stest" defaultsort="1" defaultorder="descending"> O
u21Z0
 
  <display:column property="id" title="ID" sortable="true" headerClass="sortable" /> :xDd;&$c  
  <display:column property="name" sortable="true" headerClass="sortable"/> y5zG�v3y  
  <display:column property="email" /> q[)BSsaz  
  <display:column property="status" sortable="true" headerClass="sortable"/> cU(0ef
b
 
</display:table> iYuA/`-#j6  
  注意的是,当同时存在分页时如果不指定sort=list,则排序仅仅针对的是当前页面,而不是整个List都进行排序 ~jY
b9Kk{
 
  44r43,  
十二、column 分组 `h=qVVE+  
  分组只是需要在column里增加group属性 #kjM%@dg  
<display:table name="test" class="simple"> &@'I6)!  
  <display:column property="city" title="CITY" group="1"/> >; #|IX_  
  <display:column property="project" title="PROJECT" group="2"/> M7<9Z"�"  
  <display:column property="amount" title="HOURS"/> skoU~%>U  
  <display:column property="task" title="TASK"/> .U9.KY  
</display:table> y{wE;Y#  
V#J;RH>  
十三、导出数据到其他格式(页面溢出filter??) /8 ")"PZ  
  在<display:table/>里设定export="true" Jy]a?5fc  
  在<display:column/>里设定media="csv excel xml pdf" 决定该字段在导出到其他格式时被包不包含,不设定则都包含 #y(
Xz"*
 
  <display:setProperty name="export.csv" value="false" /> RzNIOfwE  
  决定该种格式能不能在页面中导出 ;3
oY weNl
 
<display:table name="test" export="true" id="currentRowObject"> W).bD?w4<  
  <display:column property="id" title="ID"/> #<cFMJV=P1  
  <display:column property="email" /> G9{,>v#=Q  
  <display:column property="status" /> EK)<ZOY  
  <display:column property="longDescription" media="csv excel xml pdf" title="Not On HTML"/> lCK&!>-W  
  <display:column media="csv excel" title="URL" property="url"/> )gsal,  
  <display:setProperty name="export.pdf" value="true" /> 1acCs#  
  <display:setProperty name="export.csv" value="false" /> Em 6-~>M  
</display:table> Qbf`[S*Dx  
{C6'=t _  
十四、配置属性,覆盖默认 )d/ZyTD%  
  两种方法: K>o/):X  
  A、在程序classpath下新建displaytag.properties文件 _I8&")1_f  
  B、对于单个表格,应用<display:setProperty>标签 Dx5/6`9~  
  具体可配置的属性:http://displaytag.sourceforge.net/configuration.html >'[xhv'  
  pc
qBkjR{
 
十五、一个完整的例子 me,ns"d  
<display:table name="test" export="true" sort="list" pagesize="8"> UlE<
5/L
 
  <display:column property="city" title="CITY" group="1" sortable="true" headerClass="sortable"/> Z3S5�[N  
  <display:column property="project" title="PROJECT" group="2" sortable="true" headerClass="sortable"/> /}d>mGW[,  
  <display:column property="amount" title="HOURS"/> 9C=o5  
  <display:column property="task" title="TASK"/> A~3}q_K(
 
</display:table> |SE(/Cm  
  sort="list" 对整个list进行排序 kSs&'
1{Q
 
  导出数据到其他格式时,group无效 L:Z^EyU 

抱歉!评论已关闭.