J2EE社區

          茍有恒,何必三更起五更眠;
          最無益,只怕一日曝十日寒.
          posts - 241, comments - 318, trackbacks - 0, articles - 16

          Display Tag使用小記

          Posted on 2008-08-21 12:46 xcp 閱讀(1192) 評論(0)  編輯  收藏 所屬分類: struts
          轉載于:http://www.builder.com.cn/2008/0317/772884.shtml
           用了一段時間的Display Tag,覺得非常好用,可在論壇上發現好像使用這個東東的人挺少的,那偶也來寫篇文章。
              Display Tag Lib是一個標簽庫,用來處理jsp網頁上的Table,功能非常強,可以對的Table進行分頁、數據導出、分組、對列排序等等,反正我在做項目時需要的功能它都給我提供了,而且使用起來非常的方便。能夠大大減少代碼量。
              介個是Display Tag的官方網站

              首先當然是要下載它的jar包了,這里可以下載到最新的版本。將jar包放到WEB-INF的lib文件夾下。另外還需要兩個輔助包:apache的commons-lang和standard包,更多的輔助包可以在這里下載。

              在web.xml下添加一個filter
              <filter>
                  <filter-name>exportFilter</filter-name>
                  <filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
              </filter>

              在jsp頁面做一個引用:
          <%@ taglib uri="http://displaytag.sf.net/el" prefix="display" %>

              首先我們定義一個list
          <%
           List test = new ArrayList( 6 );
           test.add( "Test String 1" );
           test.add( "Test String 2" );
           test.add( "Test String 3" );
           test.add( "Test String 4" );
           test.add( "Test String 5" );
           test.add( "Test String 6" );
           request.setAttribute( "test", test );
          %>

              當我們想在jsp頁面上顯示這個list時,我們只需要寫一句話
              <display:table name="test" />
              display tag會自動生成一個table

              如果list是從控制層拋出來的,name可使用EL表達式表示
              <display:table name="$" />

              這是最簡單的display tag的使用,我們可以給它加上樣式等,也可以定義顯示的列,下面的table顯示復雜一些
          <display:table name="test" styleClass="list" cellspacing="0" cellpadding="0">
            <display:column property="id" title="ID" class="idcol"/>
            <display:column property="name" />
            <display:column property="email" />
            <display:column property="description" title="Comments"/>
          </display:table>

              如果想要給它加個鏈接也很簡單,下面的代碼給name加了連接,并附帶id參數,email也自動連接到mailto:XXX
          <display:table name="test" styleClass="list" cellspacing="0" cellpadding="0">
            <display:column property="id" title="ID" class="idcol"/>
            <display:column property="name" url="detail.jsp" paramId="id" paramProperty="id"/>
            <display:column property="email" autolink="true"/>
            <display:column property="description" title="Comments"/>
          </display:table>

          下面介紹幾個Display最常用的功能,更多功能請參考http://displaytag.homeip.net/displaytag-examples-1.1/
          1. 分頁
              如果想對代碼分頁,只需在display:table標簽中添加一項pagesize="每頁顯示行數",如
          <display:table name="test" pagesize="10"/>

          2. 對列排序
              display tag可對列進行排序,就是點擊列名,對該列的數據進行排序。你只需對想要排序的列添加 sort="true" 就OK,如下面的代碼可對前三列進行排序。在display:table中添加defaultsort="列數",可默認對指定的列排序。
          <display:table name="test" styleClass="list" cellspacing="0" cellpadding="0" defaultsort="1">
            <display:column property="id" title="ID" class="idcol" sort="true"/>
            <display:column property="name" url="detail.jsp" paramId="id" paramProperty="id" sort="true"/>
            <display:column property="email" autolink="true" sort="true"/>
            <display:column property="description" title="Comments"/>
          </display:table>
             如果table有分頁,Display Tag默認只對當前頁進行排序,如果想對整個list排序,可以在display:table之間添加一段代碼:
          <display:setProperty name="sort.amount" value="list"/>

          3. 導出數據
              在display:table中添加export="true",看看會出現什么!Display Tag默認會提供三種數據導出方式:CSV、Excel、XML 。
              另外Display Tag還可以導出為PDF格式,在http://prdownloads.sourceforge.net/itext/下載一個輔助包iText.jar,copy到lib目錄下,然后在display:table之間添加一段代碼:
          <display:setProperty name="export.pdf" value="true"/>,大功告成。

          4. Display Tag的屬性設置
              前面所說的display:setProperty 是一種改變Display Tag屬性的方法,但是在每個jsp中都要寫太麻煩了。
              Display Tag中設置了很多默認的屬性,它有一個專門的屬性文件,是在它的jar包中的displaytag/properties/TableTag.properties
              想要改變它的默認屬性,我們可以在WEB-INFclasses下新建一個文件displaytag.properties,仿照TableTag.properties中屬性的格式設置需要修改的屬性。
              TableTag.properties中的# messages中設置的是顯示在頁面上的提示信息。默認是英文的,我們可以把它改為中文的。不過這里只能使用unicode,就是說中文字符必須轉換為unicode碼,這個可以使用jdk自帶的native2ascii.exe進行轉換。

          5. 其它功能
              DisplayTag還有一些很實用的小功能,這里提兩個。一個是對數據的Format,這是1.1版本添加的新功能,可以使用標簽的方式格式化時間、數字、字符串。比如日期,在需要格式化的column標簽中添加format="",第一個參數為格式化的數據序號,第二個參數是數據類型,數字為number,第三個參數為數據格式。
              另外一個功能是對table數據的合計功能。在table標簽中添加 decorator="org.displaytag.decorator.TotalTableDecorator",然后在想要進行合計的數據列的column標簽中添加 total="true",該列就可以被計算總數了。但這個功能有個缺點,不能用在有分頁的時候,它只能合計第一頁的數據。

          DisplayTag的不足
              初次使用DisplayTag的人可能會覺得驚喜,但是用久了會發現很多問題,最大的問題是對中文的支持不好,比如如果查詢條件中有中文,就無法翻頁,無法對中文排序,將中文導出為指定文件時出現亂碼等等。這些問題有時候會讓人很郁悶,有時候逼得你要去修改它的源代碼。下面是對以上幾個問題的解決方法:
              1. 對于中文無法翻頁、排序,最簡單的辦法是修改Tomcat下的server.xml文件。找到HTTP的Connector標簽,在里面添加一項URIEncoding="...",引號里面的內容取決于你的頁面編碼,比如可以是GBK,UTF8等。這樣上面兩個問題就可以解決了。
              2. 導出為文件:其實這個功能除了中文支持外還有很多其它問題,比如它會將Html標簽一起導出、只導出顯示的內容,但如果對table進行了decorator,decorator后的內容無法導出。如果想要將中文正確導出,需要修改DisplayTag源代碼。
              下載相同版本的源代碼,在org.displaytag.export.ExcelView.java文件中找到getMimeType()方法,將此方法修改為 return "application/vnd.ms-excel;charset=GB2312";,修改后導出數據的速度會慢很多,不過將就吧。
              3. 新版的DisplayTag1.1添加了對一次取部分數據的支持,相關的標簽包括partialList和size,需要設置partialList="true"和size的大小。具體怎么用偶還沒研究。



          displaytag.properties的寫法

          #For a list of settings you can customize, see
          # http://displaytag.sourceforge.net/configuration.html

          basic.empty.showtable=true
          paging.banner.onepage=
          export.pdf=true
          basic.msg.empty_list=\u6ca1\u6709\u663e\u793a\u7ed3\u679c\u3002
          basic.msg.empty_list_row=<tr class="empty"><td colspan="0">\u6ca1\u6709\u663e\u793a\u7ed3\u679c\u3002</td></tr></tr>
          export.banner=<div class="exportlinks">\u5bfc\u51fa\u9009\u9879\uff1a{0}</div>
          paging.banner.no_items_found=<span class="pagebanner">\u6ca1\u6709\u627e\u5230{0}\u8bb0\u5f55\u3002</span>
          paging.banner.one_item_found=<span class="pagebanner">\u5171\u627e\u5230\u4e00\u6761{0}\u8bb0\u5f55\u3002</span>
          paging.banner.all_items_found=<span class="pagebanner">\u5171\u627e\u5230{0}\u6761\u8bb0\u5f55\uff0c\u663e\u793a\u6240\u6709\u8bb0\u5f55\u3002</span>
          paging.banner.some_items_found=<span class="pagebanner">\u5171\u627e\u5230{0}\u6761\u8bb0\u5f55\uff0c\u5f53\u524d\u663e\u793a\u4ece\u7b2c{2}\u6761\u81f3\u7b2c{3}\u6761\u3002</span>
          paging.banner.full=<span class="pagelinks">[<a href="{1}">\u9996\u9875</a>/<a href="{2}">\u4e0a\u4e00\u9875</a>]{0}[<a href="{3}">\u4e0b\u4e00\u9875</a>/<a href="{4}">\u5c3e\u9875</a>]</span>
          paging.banner.first=<span class="pagelinks">[\u9996\u9875/\u4e0a\u4e00\u9875] {0}[<a href="{3}">\u4e0b\u4e00\u9875</a>/<a href="{4}">\u5c3e\u9875</a>]</span>
          paging.banner.last=<span class="pagelinks">[<a href="{1}">\u9996\u9875</a>/<a href="{2}">\u4e0a\u4e00\u9875</a>]{0} [\u4e0b\u4e00\u9875/\u5c3e\u9875]</span>
          paging.banner.page.link=<a href="{1}" title="\u8f6c\u5230\u7b2c{0}\u9875">{0}</a>




          名稱: ?4C.ESL | .↗Evon
          口號: 遇到新問題?先要尋找一個方案乄而不是創造一個方案こ
          mail: 聯系我


          主站蜘蛛池模板: 三台县| 二连浩特市| 廉江市| 左云县| 栾城县| 海兴县| 华坪县| 阿鲁科尔沁旗| 奎屯市| 城固县| 肃宁县| 龙岩市| 商河县| 乌兰县| 伊宁市| 会泽县| 海南省| 桂阳县| 兰溪市| 玛曲县| 河池市| 吉安市| 栾城县| 突泉县| 岐山县| 璧山县| 嘉荫县| 富源县| 连云港市| 玛多县| 曲阜市| 石景山区| 荔波县| 太康县| 金塔县| 景东| 左权县| 中牟县| 科技| 杭锦后旗| 来安县|