displaytag 是一個巨大的失望

來源:互聯網
上載者:User

首先,墨守成規地把這幾天的學習內容羅列一下。

然後,根據displaytag具有的缺陷以及解決辦法提出自己的無限失望。

好,開始列了,

displaytag 學習筆記總結(1)

6,列表的子集
 <display:table name="mylist" offset="m" length="n"/>
 offset 為第一個資料在mylist中的序號。
 length 為顯示的記錄條數。

7,自動化佈建連結
 能夠把此列的內容作為連結,串連的url和內容一致。
    當然必須格式有效url,否則寫了也沒有串連。

 (
  自認為這個功能一般。
  因為串連的內容和顯示的內容通常不一樣。
  )
 當然可以在<display:column href="">在這裡給某列指定所有的連結為同一個串連。
 或者<display:column ><a href="">sdfs</a></display:column >兩者效果是一樣的。

 !!!那麼,如果串連的url不是列內容,而且每行的連結都不相同,這個時候怎麼辦?
  就好像廣告列表有商戶名稱,商戶名稱是一個串連,串連到商戶的具體資訊頁面。
  串連的url肯定不同。如何處理?
 
 現在還不知道,接著往下看。

8,使用裝飾類來轉換資料。
 

 <display:table name="test" decorator="org.displaytag.sample.Wrapper" >
 用來轉換資料內容的。一般用來格式化資訊。
 此類必繼承TableDecorator。
 順便介紹一個格式化時間的包  org.apache.commons.lang.time.FastDateFormat;
 格式化金錢的包  java.text.DecimalFormat;
 
 思路就是覆蓋List中具體類型的getXXX方法。
 this.getCurrentRowObject() 得到當前行的資料。
 this.getListIndex() 得到當前行的序號。
 之後就轉化為List中存放的具體類型,之後得到某列的資料。
 返回格式化後的資料。

 !!!!另外我看到,裝飾類增加了一些getXXX方法,這些方法並沒有在ListObject中定義。
 還不知道這樣做有什麼好處?
 
  <display:column property="date" decorator="org.displaytag.sample.LongDateWrapper" />
 這樣僅僅對一列資料進行格式化,需要繼承ColumnDecorator
 需要實現:String decorate(Object columnValue)方法。此方法同樣接受一個Object參數,
  此參數就是對象的某個具體屬性值,直接轉化為對應類型,然後格式化,返回String。

9,建立動態連結。
 兩種方式可以建立動態連結。
    第一種方式直接在頁面上使用
  <display:column href="baseurl" paramId="paramid" />
  http://baseurl/paramid=columnvalue
  <display:column href="baseurl" paramId="paramid"  paramName=“name” paramScope="scope"/>
  http://baseurl/paramid=scope範圍內的名字為name的值
  <display:column href="baseurl" paramId="paramid"  paramProperty=“propertyname”/>
  http://baseurl/paramid=名字為propertyname的屬性值

 這種方式處理簡單的連結十分有效,但是連結參數值如果通過查詢資料庫等比較複雜的方式得到的話,這種方式
 就不適應了。這時候就必須使用第二種方法。

 第二種方法,在裝飾類中獲得串連。
  裝飾類多定義一些getXXX方法,那麼頁面上就可以使用<display:column propety="XXX" ..>來使用裝飾類de
  getXXX方法。好,這樣一來,在裝飾類的getXXX方法裡,得到此行對象,這樣對象的各個屬性就都能得到,
  之後去查資料庫也好,去完成負責的判斷邏輯也好,都很容易實現,別忘了,然後拼裝起來,並寫成一個
  <a href="....">這樣的字串返回。
  好,頁面直接一句話就可得到此拼裝的《a》了。<display:column propety="XXX" ..>

 第二種方法比較好些,因為可以顯得更靈活。想怎麼寫就怎麼寫。第一種方法就是簡單地實現。
 
10,翻頁。
 1,怎麼得到每行的序號?
  <display:table id="xxx" ...>
  使用<%=pageContext.getAttribute("xxx_rowNum")%>肯定好用。
   但是<c:out value="${row_rowNum}"/>這種方式就不好用。也不知道差哪了。

  翻頁很簡單。就是在<display:table  pagesize="m">這樣來指定每頁的數量就可以了。
  自動出現換頁的索引,上下頁等等東西。
  實在是方便。但是問題就是一次傳下來很多東西,效能不好。等一會看看如何改良。

11,自動化佈建排序
  <display:table name="sessionScope.stest" defaultsort="1" defaultorder="descending">
  <display:column property="id" title="ID" sortable="true" headerClass="sortable" />
  可以設定預設時按照哪列排序,是升序還是降序。本例設定第一列預設時降序。
  每列都得對象都必須實現了Comparable介面才能被設定成sortable="true".
  如果沒有實現Comparable,那麼必須寫一個裝飾類。
  另外需要注意,
   他只對當前頁面進行排序。而不是全部。在翻頁時特別需要注意。
   要想實現全部的排序,那麼必須重新寫Action往網頁傳新的List了。

12,如何分組
  按照某列進行分組顯示。
  這個功能真不錯。
  <display:column property="city" title="CITY" group="1"/>
  <display:column property="project" title="PROJECT" group="2"/>
  這樣不僅僅結果可以分組,而且還可以省略掉重複的資料,例如city列,project列都有
  A ,B ,A,B 兩行那麼第二行這兩列就不顯示了。

  同樣只能對當前頁進行分組。

  注意:第一列一定要1,第二列一定是2,否則出NUllPoint 錯誤。

13,統計
  好東西啊。可以對分組進行統計,也可以對所有行進行統計。
  主要靠TableDecorator類finishRow()返回統計結果,放到頁面去顯示。

  TableDecorator類方法getDecoratedObject()得到整個結果集。一般把它轉化成List,因為大多數情況下結果
  是存放在List中的。
  public final String finishRow() {}當一行結束時執行此方法。所以用它來判斷是否需要計算城市統計,
   抑或是全部統計。
  相當於事件處理。返回的字串也將在頁面上顯示。本例返回了<tr><td>...</td><tr>這樣的三份。
  這樣就在表中嵌套進了三行。用來顯示統計是足夠了。

 

14,匯出資料
  很簡單。talbe裡設定export=“true”就行了。設定檔也要設定好export.xml = true , 這樣才能匯出xml。
  類推pdf、excel、html、csv。
  每個列能配置是否在某種格式中顯示,文法<display:column media="csv excel" 。。
  不配置就在所有格式中都顯示。

  另外需要注意:
   被包含的檔案不能使用這個功能,非要使用,就的用過濾器。以後再深研究吧。

15,配置DisplayTag.
  在應用的classpath路徑上拷貝一個TableTag.properties,並命名為displaytag.properties.
  這樣就預設取displaytag.properties裡的配置了。想漢化,很簡單。就需要把displaytag_zh.properties放到
  classpath路徑下就可以了。

  標題像漢化:因為預設是jstl的資源檔使用方式。所以得先學習jstl的
  我知道了jstl.fmt如何使用資源檔。好了,jstl 首先必須用fmt:bunlle指定一個資源檔,然後才能
  在他的body部分使用此資源檔,頗麻煩。

  而displaytag呢? 沒有這麼麻煩,如果與struts搭配使用,適用struts的資源檔當然最合理了。
  你必須在displaytag.properties裡定義好一個
  參數,#locale.provider=org.displaytag.localization.I18nJstlAdapter
   locale.provider=org.displaytag.localization.I18nStrutsAdapter
  就這麼簡單,就能夠使用struts設定檔了。我今天竟然看了一下午。哎,苦於沒有好點的資料啊。

  問題是:如果不合struts搭配使用。如果僅僅在jstl環境下,displaytag又該如何使用jstl的資源檔呢?
  你必須象在jstl環境裡一樣使用<fmt:bundl>指定好資源檔,之後把displaytag標籤放到他的body
  後,就可以使用jstl的資源檔了!!!!(幸虧我首先看了jstl使用資源檔的方法)

16,一個頁面兩個以上的表格.
  很簡單,只需要每個表格配置不同的id.

17,表格裡面還有表格.
  很簡單.只要在外層表的
  <dispaly:column>
   ( 在這加<display:table ...>。。。
   </display:table>即可)
  </display:column>
 
  
  
18,表頭表尾
  很簡單:<dispaly:caption><display:footer>想<display:column>一樣使用就行了.
  主要注意一下: <display:footer>內容必須是<tr>.....</tr>

19,表格裡的值截斷,與顯示空白.
 <display:column property="nullValue" nulls="false"/>
   <display:column property="longDescription" maxLength="10" style="whitespace: nowrap;"/>
 簡單得很.

ok,差不多到了關鍵的時候了。!!!!!

=============================================
關鍵:
20,如何分頁.
 
 因為displaytag的分頁機制需要一次把所有紀錄都傳到裡面.所以對紀錄很多的項目並不合適.如果還非得用
 displaytag那隻好放棄他的一些功能了.比較理智的方法是僅僅讓displaytag獲得一頁的list.這樣就不用displaytag
 的分頁index,而使用自己的,或者寫customertag,或者使用jsppager tag.

 有很多人質疑這種方法,因為這使得displaytag的光芒至少減少了一半以上,因為他的很多功能因此而無法使用,
 例如排序功能,可以針對所有list進行全域排序,如果每次只傳給一頁的資料,全域排序就和當頁排序沒有區別了.
 displaytag的全域排序功能宣布廢掉了.

 <display:table name="mylist" offset="m" length="n"/>這樣的功能基本上也沒有什麼用處。

 那麼還使用它幹什麼呢? displaytag即使廢掉了一些武功仍然有它的優點.例如
 1,支援表格的嵌套.
 2,支援css這樣就能寫少量地代碼使得程式更簡潔.只好定義好一套css,就能全域範圍內使用了.
 3,另外還支援截斷長的字串,這樣就不用在頁面使用自己的方法了. 
 4,能夠實現比較複雜的邏輯從而產生動態連結。這也勉強所以個好處吧。
 5,能輕鬆地使用struts的資源檔。使得它可以很好的國際化。
 6,能夠過濾空值。

 缺點: 
 1,分組就使用不了了,統計也無法使用了。只統計當前頁是沒有意義的。
 2,排序也變成當前頁排序了。沒多少意思。
 3,匯出也變成當前頁匯出了,沒多少意思了。

 唉,總體來說,displaytag真正一用,就像掉光了羽毛的孔雀,華麗的東西丟失殆盡,可惜我用了一個星期的時間,
絕對時間也有16個小時來研究它。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.