|
DisplayTag一直以來(lái)為人們所詬病的缺點(diǎn)就是它的裝載數(shù)據(jù)的方式: 一次性把所有數(shù)據(jù)讀取到內(nèi)存中,然后再分頁(yè)顯示。這樣做的后果就是在處理大批量數(shù)據(jù)時(shí)力不從心,可用性急劇下降,并且在翻頁(yè)顯示的僅僅是內(nèi)存中的數(shù)據(jù)而不是實(shí)時(shí)數(shù)據(jù).因此人們往往只是在實(shí)現(xiàn)小型項(xiàng)目的小數(shù)量表格分頁(yè)顯示時(shí)才想到DisplayTag,并且因?yàn)榭紤]到項(xiàng)目的擴(kuò)展往往最終棄用DiaplayTag. 但是發(fā)布于本月12日的1.1版本徹底解決了這個(gè)問題,新版的DisplayTag提供了兩種方式實(shí)現(xiàn)部分裝入數(shù)據(jù): (1)實(shí)現(xiàn)接口 org.displaytag.pagination.PaginatedList,用戶可以實(shí)現(xiàn)這個(gè)接口用來(lái)代替以前傳入DisplayTag的list對(duì)象,DisplayTag將認(rèn)為分頁(yè)和排序的動(dòng)作已經(jīng)由外部動(dòng)作執(zhí)行了,而不會(huì)使用 原來(lái)的分頁(yè)方式(即全部讀入內(nèi)存).但是這樣用戶需要自己編寫分頁(yè)和排序代碼; (2)設(shè)置相應(yīng)參數(shù),告訴DisplayTag傳入的數(shù)據(jù)集由外部分頁(yè)和排序,而不使用默認(rèn)的方式.比如: <display:table name="testList" sort="external" defaultsort="1" pagesize="20" id="element" partialList="true" size="resultSize"> 其中: sort="external" 告訴DisplayTag傳入的數(shù)據(jù)集已經(jīng)由外部程序排好序了.. defaultsort="1" 說(shuō)明默認(rèn)是升序(Descending is 2, Ascending is 1); partialList="true" 說(shuō)明部分裝入數(shù)據(jù); pagesize="20" 每頁(yè)顯示記錄數(shù); size="resultSize" 顯示記錄的總條數(shù)(此參數(shù)結(jié)合PageSize,使得表格在只拿到某一頁(yè)的完整數(shù)據(jù)的同時(shí),可以知道會(huì)有多少頁(yè),并將其他的頁(yè)數(shù)也列舉出來(lái),當(dāng)用戶實(shí)際翻頁(yè)時(shí)才去獲取當(dāng)頁(yè)數(shù)據(jù)); displaytag(partialList="true")分頁(yè)例子JSP: <% @tagliburi = " /WEB-INF/displaytag.tld " prefix = " display " %> < display:table name ="resultList" pagesize ="100" requestURI ="listLog.do" sort ="external" id ="row" partialList ="true" size ="resultSize" > < display:column property ="operdate" title ="操作時(shí)間" ></ display:column > < display:column property ="pername" title ="操作人員" ></ display:column > < display:column property ="opertype" title ="操作類型" ></ display:column > </ display:table > name="resultList" 將記錄集存在session或者request中的鍵值 pagesize="100" 每頁(yè)顯示100條數(shù)據(jù) sort="external" 外部排序 id="row" 表格id值,用于程序得相關(guān)的參數(shù) partialList="true" 分段從數(shù)據(jù)庫(kù)中讀數(shù)據(jù) size="resultSize" 記錄的總條數(shù),用于計(jì)算總頁(yè)數(shù) Controller:
// 頁(yè)數(shù)的參數(shù)名 StringpageIndexName = new org.displaytag.util.ParamEncoder( "row" ).encodeParameterName(org.displaytag.tags.TableTagParameters.PARAMETER_PAGE); // 每頁(yè)顯示的條數(shù) int pageSize = 100 ; // 當(dāng)前頁(yè) int pageIndex = GenericValidator.isBlankOrNull(request.getParameter(pageIndexName)) ? 0 Integer.parseInt(request.getParameter(pageIndexName)) - 1 ); // 統(tǒng)計(jì)總記錄數(shù)的sql語(yǔ)句 int resultSize = logDao.getAllCount(); // 取得當(dāng)前頁(yè)數(shù)據(jù) ListresultList = logDao.getLogList( int pageIndex, int pageSize); try { request.setAttribute( " resultList " ,resultList); // 把結(jié)果存入request request.setAttribute( " resultSize " , new Integer(rs.getInt( 1 ))); // 將總記錄數(shù)保存成Intger實(shí)例保存在request中 } catch (Exceptionex) { ex.printStackTrace(); } 其中 logDao.getAllCount() 和 logDao.getLogList(intpageIndex,intpageSize),根據(jù)不同持久層有不同實(shí)現(xiàn),此處略。
|