📄 在jsf中实现分页(二).htm
字号:
<DIV>
<DIV class="right t_number"><A class=bold
onclick="window.clipboardData.setData('text','http://www.agilejava.org/java/viewthread.php?tid=8&page=1#pid2262')"
href="http://www.agilejava.org/java/viewthread.php?tid=8&extra=&page=1###">#1</A></DIV>
<DIV style="PADDING-TOP: 4px">发表于 2006-1-29 18:36 <A
href="http://www.agilejava.org/java/viewpro.php?uid=1">资料</A> <A
href="http://www.agilejava.org/space/index.php?action/space/uid/1"
target=_blank>个人空间</A> <A
href="http://www.agilejava.org/java/pm.php?action=send&uid=1"
target=_blank>短消息</A> </DIV></DIV></TD></TR>
<TR>
<TD class=line style="PADDING-TOP: 10px" vAlign=top height="100%"><A
title="评分 0"
href="http://www.agilejava.org/java/misc.php?action=viewratings&tid=8&pid=2262"
name=pid2262></A><SPAN class=bold>在JSF中实现分页(二)</SPAN><BR><BR>
<DIV style="FONT-SIZE: 12px">
<P>
前面一篇直接使用了Myfaces中的两个Component完成了一个简单的分页,这里将会介绍一种On-demand
loading的方法来进行分页,仅仅在需要数据的时候加载。</P>
<P>
先来说一些题外话,为了实现这种方式的分页,公司里大约5-6个人做了半个多月的工作,扩展了dataTable,修改了dataScrollor,以及各种其他的方法,但是都不是很优雅。在上个月底的时候,在Myfaces的Mail
List中也针对这个问题展开了一系列的讨论,最后有人总结了讨论中提出的比较好的方法,提出了以下的分页方法,也是目前实现的最为优雅的方法,也就是不对dataTable和dataScrollor做任何修改,仅仅通过扩展DataModel来实现分页。</P>
<P>
DataModel是一个抽象类,用于封装各种类型的数据源和数据对象的访问,JSF中dataTable中绑定的数据实际上被包装成了一个DataModel,以消除各种不同数据源和数据类型的复杂性,在前面一篇中我们访问数据库并拿到了一个List,交给dataTable,这时候,JSF会将这个List包装成ListDataModel,dataTable访问数据都是通过这个DataModel进行的,而不是直接使用List。</P>
<P>
接下来我们要将需要的页的数据封装到一个DataPage中去,这个类表示了我们需要的一页的数据,里面包含有三个元素:datasetSize,startRow,和一个用于表示具体数据的List。datasetSize表示了这个记录集的总条数,查询数据的时候,使用同样的条件取count即可,startRow表示该页的起始行在数据库中所有记录集中的位置。<BR><BR><SPAN
lang=EN-US><o:p></P>
<DIV
style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG
id=Codehighlighter1_0_271_Open_Image
onclick="this.style.display='none'; Codehighlighter1_0_271_Open_Text.style.display='none'; Codehighlighter1_0_271_Closed_Image.style.display='inline'; Codehighlighter1_0_271_Closed_Text.style.display='inline';"
src="在JSF中实现分页(二).files/ExpandedBlockStart.gif" align=top><IMG
id=Codehighlighter1_0_271_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_0_271_Closed_Text.style.display='none'; Codehighlighter1_0_271_Open_Image.style.display='inline'; Codehighlighter1_0_271_Open_Text.style.display='inline';"
src="在JSF中实现分页(二).files/ContractedBlock.gif" align=top><SPAN
id=Codehighlighter1_0_271_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</SPAN><SPAN
id=Codehighlighter1_0_271_Open_Text><SPAN
style="COLOR: #008000">/**</SPAN><SPAN
style="COLOR: #008000"><BR><IMG src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * A simple class that represents a "page" of data out of a longer set, ie a<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * list of objects together with info to indicate the starting row and the full<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * size of the dataset. EJBs can return instances of this type when returning<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * subsets of available data.<BR><IMG
src="在JSF中实现分页(二).files/ExpandedBlockEnd.gif"
align=top> </SPAN><SPAN
style="COLOR: #008000">*/</SPAN></SPAN><SPAN
style="COLOR: #000000"><BR><IMG src="在JSF中实现分页(二).files/None.gif"
align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #0000ff">class</SPAN><SPAN
style="COLOR: #000000"> DataPage<BR><IMG
id=Codehighlighter1_295_1342_Open_Image
onclick="this.style.display='none'; Codehighlighter1_295_1342_Open_Text.style.display='none'; Codehighlighter1_295_1342_Closed_Image.style.display='inline'; Codehighlighter1_295_1342_Closed_Text.style.display='inline';"
src="在JSF中实现分页(二).files/ExpandedBlockStart.gif" align=top><IMG
id=Codehighlighter1_295_1342_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_295_1342_Closed_Text.style.display='none'; Codehighlighter1_295_1342_Open_Image.style.display='inline'; Codehighlighter1_295_1342_Open_Text.style.display='inline';"
src="在JSF中实现分页(二).files/ContractedBlock.gif" align=top></SPAN><SPAN
id=Codehighlighter1_295_1342_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="在JSF中实现分页(二).files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_295_1342_Open_Text><SPAN
style="COLOR: #000000">{<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> </SPAN><SPAN
style="COLOR: #0000ff">private</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> datasetSize;<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> </SPAN><SPAN
style="COLOR: #0000ff">private</SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> startRow;<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> </SPAN><SPAN
style="COLOR: #0000ff">private</SPAN><SPAN
style="COLOR: #000000"> List data;<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif" align=top><BR><IMG
id=Codehighlighter1_368_746_Open_Image
onclick="this.style.display='none'; Codehighlighter1_368_746_Open_Text.style.display='none'; Codehighlighter1_368_746_Closed_Image.style.display='inline'; Codehighlighter1_368_746_Closed_Text.style.display='inline';"
src="在JSF中实现分页(二).files/ExpandedSubBlockStart.gif" align=top><IMG
id=Codehighlighter1_368_746_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_368_746_Closed_Text.style.display='none'; Codehighlighter1_368_746_Open_Image.style.display='inline'; Codehighlighter1_368_746_Open_Text.style.display='inline';"
src="在JSF中实现分页(二).files/ContractedSubBlock.gif"
align=top> </SPAN><SPAN
id=Codehighlighter1_368_746_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</SPAN><SPAN
id=Codehighlighter1_368_746_Open_Text><SPAN
style="COLOR: #008000">/**</SPAN><SPAN
style="COLOR: #008000"><BR><IMG src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * Create an object representing a sublist of a dataset.<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * <BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * </SPAN><SPAN
style="COLOR: #808080">@param</SPAN><SPAN
style="COLOR: #008000"> datasetSize<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * is the total number of matching rows available.<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * <BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * </SPAN><SPAN
style="COLOR: #808080">@param</SPAN><SPAN
style="COLOR: #008000"> startRow<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * is the index within the complete dataset of the first element<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * in the data list.<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * <BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * </SPAN><SPAN
style="COLOR: #808080">@param</SPAN><SPAN
style="COLOR: #008000"> data<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> * is a list of consecutive objects from the dataset.<BR><IMG
src="在JSF中实现分页(二).files/ExpandedSubBlockEnd.gif"
align=top> </SPAN><SPAN
style="COLOR: #008000">*/</SPAN></SPAN><SPAN
style="COLOR: #000000"><BR><IMG src="在JSF中实现分页(二).files/InBlock.gif"
align=top> </SPAN><SPAN
style="COLOR: #0000ff">public</SPAN><SPAN
style="COLOR: #000000"> DataPage(</SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> datasetSize, </SPAN><SPAN
style="COLOR: #0000ff">int</SPAN><SPAN
style="COLOR: #000000"> startRow, List data)<BR><IMG
id=Codehighlighter1_808_893_Open_Image
onclick="this.style.display='none'; Codehighlighter1_808_893_Open_Text.style.display='none'; Codehighlighter1_808_893_Closed_Image.style.display='inline'; Codehighlighter1_808_893_Closed_Text.style.display='inline';"
src="在JSF中实现分页(二).files/ExpandedSubBlockStart.gif" align=top><IMG
id=Codehighlighter1_808_893_Closed_Image style="DISPLAY: none"
onclick="this.style.display='none'; Codehighlighter1_808_893_Closed_Text.style.display='none'; Codehighlighter1_808_893_Open_Image.style.display='inline'; Codehighlighter1_808_893_Open_Text.style.display='inline';"
src="在JSF中实现分页(二).files/ContractedSubBlock.gif"
align=top> </SPAN><SPAN
id=Codehighlighter1_808_893_Closed_Text
style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG
src="在JSF中实现分页(二).files/dot.gif"></SPAN><SPAN
id=Codehighlighter1_808_893_Open_Text><SPAN
style="COLOR: #000000">{<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> </SPAN><SPAN
style="COLOR: #0000ff">this</SPAN><SPAN
style="COLOR: #000000">.datasetSize </SPAN><SPAN
style="COLOR: #000000">=</SPAN><SPAN
style="COLOR: #000000"> datasetSize;<BR><IMG
src="在JSF中实现分页(二).files/InBlock.gif"
align=top> </SPAN><SPAN
style="COLOR: #0000ff">this</SPAN><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -