Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 ZRPy~wy>
sZwZWD'
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 !t%Q{`p
?S9Nm~vlt
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 J'Gm7h{
2qXo{C3
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 D:)~%wu Lt
rei5{PC
。 r,"7%1I
3C#RjA-2[
分页支持类: sJv`fjf%8
vzcz<i )
java代码: 4i`S+`#
yf?W^{^|
k% NrL@z
package com.javaeye.common.util; kF?S 2(vH
4&]%e6,jH
import java.util.List; RAwk7F3qn
gwJ}]Tf
publicclass PaginationSupport { 1@@y]s_.a
D$$3fN.iEL
publicfinalstaticint PAGESIZE = 30; 1\IZcJ {
bOe<\Y$
privateint pageSize = PAGESIZE; {KsVK4\r
F:_FjxU
privateList items; 6&mWIk^VC
?Nu#]u-
privateint totalCount; ,#
eO&
F^xaz^=`u
privateint[] indexes = newint[0]; u]0!|Jd0
5!8-)J-H
privateint startIndex = 0; F "!`X#
j
C9<hLt
public PaginationSupport(List items, int 9\:w8M X'
O'fc/cvh='
totalCount){ pLPd[a
setPageSize(PAGESIZE); ],Ab cTX
setTotalCount(totalCount); TG?fUD V
setItems(items);
ZRO.bMgZF
setStartIndex(0); PB@-U.Z
} t:disL&!E
"~Us#4>
public PaginationSupport(List items, int Fos1WH?\
[:B W+6
totalCount, int startIndex){ ?o@E1:aA
setPageSize(PAGESIZE); aC4m{F[
setTotalCount(totalCount); X!m;uJZp
setItems(items); IN>TsTo
setStartIndex(startIndex); L^&do98
} 4@gl4&<h
HaS[.&\S0
public PaginationSupport(List items, int Of!|,2`(
r^e-.,+
totalCount, int pageSize, int startIndex){ 8XgVY9]Qm
setPageSize(pageSize); 8`6
LMQ
setTotalCount(totalCount); r!>es;R8
setItems(items); W%w82@'
setStartIndex(startIndex); N:5b1TdI,
} H_v/}DEG
cz$c)It
publicList getItems(){ -g~iE]x6Y
return items; p{w}
} ?! !;XW
I)qKS@
publicvoid setItems(List items){ /]P%b K6B
this.items = items; +ESX.Vel
} 'w: tq
@b4b{d5[
publicint getPageSize(){ aIY$5^x
return pageSize; yZQ1]
'^31
} &0?DL
|P^ikx6f5
publicvoid setPageSize(int pageSize){ PsacXZNs\N
this.pageSize = pageSize; w}fqs/)w
} `Nc`xO?
h4B+0
publicint getTotalCount(){ 7m vSo350
return totalCount; \3,$YlG
} x A@|I#
i+kFL$N
publicvoid setTotalCount(int totalCount){ zS#f%{
if(totalCount > 0){ Nu>sp,|A
this.totalCount = totalCount; EY=\C$3J:
int count = totalCount / ;2+FgOj
1==P.d(
pageSize; ";%e~
=
if(totalCount % pageSize > 0) o;Hd W
count++; rcD.P?"
indexes = newint[count]; +-xSuR,
for(int i = 0; i < count; i++){ ~GsH8yA_P
indexes = pageSize * A?%XO
%
UtHmM,*I
i; ^Y1AeJ$L
} TZvBcNi
}else{ <lsi.x\y<
this.totalCount = 0; \rB/83[;u
} 7M&.UzIY`
} %FXI lH5
%tklup]LF8
publicint[] getIndexes(){ I\F=s-VVY
return indexes; _ d(Ks9
} UvW:#
ePIly)=X
publicvoid setIndexes(int[] indexes){ Z`0r]V`Ys
this.indexes = indexes; @eAGN|C5
} f6(9wz$Trt
d6Q :{!Sd"
publicint getStartIndex(){ W}<M?b4tP
return startIndex; ZIGbwL
} P5ESrZ@f
umHs " d
publicvoid setStartIndex(int startIndex){ *;ZW=%M
if(totalCount <= 0) Y`[HjS,
this.startIndex = 0; ,&O:/|c E
elseif(startIndex >= totalCount) 80R=r
this.startIndex = indexes /(WX!EEsB
Sf.8Ibw
[indexes.length - 1]; A+bubH,
elseif(startIndex < 0) t"!8
this.startIndex = 0; Xoa<r9
else{ JXI+k.fi
this.startIndex = indexes $HR(|{piZ
=c5 /cpZ^
[startIndex / pageSize]; jT wM<?
} G+\~rl
} .-1{,o/&Q
5D02%U2N)G
publicint getNextIndex(){ DlQ[}5STF
int nextIndex = getStartIndex() + *|.yX%"k
6lH>600]u
pageSize; O}\"$n>
if(nextIndex >= totalCount) )eedfb1
return getStartIndex(); Kw5+4R(5
else $4ZDT]n
return nextIndex; q5K/+N^2?
} yI)RGOV
q_m#BE;t
publicint getPreviousIndex(){ -fZShOBY`
int previousIndex = getStartIndex() - :O@,Z_"
;] `NR
pageSize; \5L 4*
if(previousIndex < 0) 6[Pr<4J
return0; HU.6L'H*
else B#V4
return previousIndex; fN? Lz%z3
} 7_d#XKz@
q'8@0FT0
} 4>ce,*B1
G QB^
(k HQKQmq
~>-;(YU"t
抽象业务类 PFn[[~5V
java代码: AZ Lt'9UD
2W-NCE%K)T
<?va)
ou
/** 0 Ukl#6
* Created on 2005-7-12 +H^V},dBp!
*/ k~EPVJh"
package com.javaeye.common.business; DDCQ Af
l$_+WC*wp
import java.io.Serializable; RlPByG5K
import java.util.List; k^%ec3l
YV!V9
import org.hibernate.Criteria; EQ`t:jc{
import org.hibernate.HibernateException; V$F.`O!hfi
import org.hibernate.Session; s\1_-D5]Z
import org.hibernate.criterion.DetachedCriteria; '!L1z45
import org.hibernate.criterion.Projections; pxnUe1=
import G78j$
^/0
9PfU'm|h
org.springframework.orm.hibernate3.HibernateCallback; -/{}^QWB
import D\&y(=fzf
{EHG |
org.springframework.orm.hibernate3.support.HibernateDaoS < 3+&DV-<N
tNf" X!
upport; pPoC61F
&B,& *Lp
import com.javaeye.common.util.PaginationSupport; T[=cKYp8\
o-Fle, qf
public abstract class AbstractManager extends x{o5Ha{
H 1X]tw.
HibernateDaoSupport { f0bV]<_9
M{RZ-)IC
privateboolean cacheQueries = false; ]<z(Rmn`Q
&_hCs![
privateString queryCacheRegion; s3!LR2qiF
&+iW:
publicvoid setCacheQueries(boolean O9&:(2'f
>^HTghgRD
cacheQueries){ U+M?<4J)"
this.cacheQueries = cacheQueries; yzl\{I&
} ryLNMh
5kNs@FP
publicvoid setQueryCacheRegion(String = }lA|S
~,-O
queryCacheRegion){ 80>!qG
this.queryCacheRegion = <&Xq`i/(
2/N*Uk 0
queryCacheRegion; *lF%8k"Al
} fOervo
s4k%ty}
publicvoid save(finalObject entity){ }Cg~::,"
getHibernateTemplate().save(entity); ,lM2BXz%
} rL"k-5>fd
JAlsc]XtO9
publicvoid persist(finalObject entity){ 5)<jPyC
getHibernateTemplate().save(entity); }"k(kH
} 1\{F.v
N)Kr4GC
publicvoid update(finalObject entity){ ~ riw7"
getHibernateTemplate().update(entity); $O!<Zz
} kn|l 3+
:!hH`l}p
publicvoid delete(finalObject entity){ 5~0;R`D
getHibernateTemplate().delete(entity); 1]`HX=cl
} S,%HW87
VNXVuM )c
publicObject load(finalClass entity, X
jN.X
'|T=
finalSerializable id){ *^_!W'T{j
return getHibernateTemplate().load W7"sWaOhW
S}O\<6&
(entity, id); MEUqQ4/Gl
} >FNt*tX<0
&N ;6G`3
publicObject get(finalClass entity, --sb ;QG
k]g\`
gc
finalSerializable id){ .5xg;Qg\Y
return getHibernateTemplate().get V|7CYkB8
w[-Bsf
(entity, id); .`].\Zykf
} -Ma"V
rOT8!"
publicList findAll(finalClass entity){ Wz]S+IpY
return getHibernateTemplate().find("from k#n=mm'N9
%-CC_R|0$
" + entity.getName()); IIZsN*^
} {5JXg9um
jFfki.H
publicList findByNamedQuery(finalString H_FhHX.2(
Ex3woT-
namedQuery){ a{W-+t
return getHibernateTemplate T\>=o]
.bGeZwvf:G
().findByNamedQuery(namedQuery); |z%,W/Ef
} 7F4]EA^
7SCI_8`
publicList findByNamedQuery(finalString query, .$iIr:Tc>
k|5nu-B0v
finalObject parameter){ 8Yh2K}
return getHibernateTemplate A-FwNo2"%
?x97q3I+]
().findByNamedQuery(query, parameter); 9D,&)6
} ks}o9[D3
|=POV]K
publicList findByNamedQuery(finalString query, KJiwM(o
l;uEw
finalObject[] parameters){ q}jf&xUWzH
return getHibernateTemplate ?*4zNhL
p98lu'?@
().findByNamedQuery(query, parameters); xcig'4L
} BlUY9`VWh@
$gNCS:VG*
publicList find(finalString query){ &ly[mBP~
return getHibernateTemplate().find !NCT) #G`
!Xm: $KH
(query); _OY ;SJ(
} oa|0=
/ @&Sqv4?
publicList find(finalString query, finalObject S%@$J~\rx
v09f#t$;5
parameter){ ?P5D!b:(
return getHibernateTemplate().find ^?2txLv,6
CbZ1<r" /
(query, parameter); !cZsIcIe
} HZT;7<
51j
public PaginationSupport findPageByCriteria wb}tN7~Y;
K +~
(final DetachedCriteria detachedCriteria){ +3C
S3fTq
return findPageByCriteria Xk2
75Y
ciTQH (G
(detachedCriteria, PaginationSupport.PAGESIZE, 0); R/#*~tPi8
} V/Q6v
YX
4Qdg t*
public PaginationSupport findPageByCriteria [V2l&ZUni
B;m18LDu
(final DetachedCriteria detachedCriteria, finalint \;3r
c:0$
Mw=
startIndex){ MiC&av
return findPageByCriteria
; H3kb
+
`9ieTt
(detachedCriteria, PaginationSupport.PAGESIZE, 8p
FSm>
E8xXr>j>#
startIndex); !hq7R]TC+
} |"mb59X
iJYr?3nw;
public PaginationSupport findPageByCriteria vmoqsdZ/
zme:U![
(final DetachedCriteria detachedCriteria, finalint z+4R[+[
,y0kzwPR1
pageSize, 68y.yX[
finalint startIndex){ +o/q@&v;Ax
return(PaginationSupport) /90@ 85%r
;02lmpBj
getHibernateTemplate().execute(new HibernateCallback(){ 9J?j2!D
publicObject doInHibernate ~7ArH9k.
_uBf.Qfs
(Session session)throws HibernateException { MT9a 1 >
Criteria criteria = L]p:gI{m
{*|yU"
detachedCriteria.getExecutableCriteria(session); &L/C:<.
int totalCount = j'7FTVmJ
zYep
V
((Integer) criteria.setProjection(Projections.rowCount ?LZ)r^ger
SQeQ"k|P%
()).uniqueResult()).intValue(); nhIITfJJ
criteria.setProjection =v_ju;C=
ZFRKh:|
(null); l"cYW9
List items = Dk4Wj"LS
H&GMq5)B
criteria.setFirstResult(startIndex).setMaxResults %(NRH?
>uQ!B/C!
(pageSize).list(); 3*FktXmI}
PaginationSupport ps = S4|)N,#
[X-Q{c4
new PaginationSupport(items, totalCount, pageSize, 'n=FBu^
E J 9A
4B
startIndex); 5[GX
return ps; J)R2O4OEd
} /aK },+
}, true); uU<Yf5
} uZqo"
Edjh*
public List findAllByCriteria(final ^lQej%
!Zs;m`j&9
DetachedCriteria detachedCriteria){ L\b$1U!i
return(List) getHibernateTemplate EqOB
0\
#a/lt^}C*
().execute(new HibernateCallback(){ ^m5{:\
Xk
publicObject doInHibernate ;B7>/q;g
ftK.jj1:
(Session session)throws HibernateException { C&"8A\we
Criteria criteria = wo?C7,-x
r*WdD/r|
detachedCriteria.getExecutableCriteria(session); pHWol!
return criteria.list(); -8EdTc@
} %2>FSE
}, true); QJ$]~)w?H
} o XGf#>keg
C#gQJ=!B
public int getCountByCriteria(final ntjUnd&v\
)of_"gZ$3A
DetachedCriteria detachedCriteria){ !D z:6r
Integer count = (Integer) bjR&bIA:
^6Xi o6W
getHibernateTemplate().execute(new HibernateCallback(){ GA;E (a
publicObject doInHibernate Ue8_Q8q5
1Ce:<.99B
(Session session)throws HibernateException { f(9w FT
Criteria criteria = Tvk= NJ
0wOgQ n
detachedCriteria.getExecutableCriteria(session); {a>)VZw_#
return u<+;]8[o
t);5Cw_
criteria.setProjection(Projections.rowCount |FKo}>4
Gk!v-h9cq
()).uniqueResult(); +[*UC"
} |px4a"
}, true); 8l?]UFM>C
return count.intValue(); E{j6OX\
} KnbP@!+c
} gs9f2t
2wu
5`Z[E
X5)>yM^N`
<KJ18/
CMTy(Z8_)
|4dNi1{Zd
用户在web层构造查询条件detachedCriteria,和可选的 W}(dhgf
-'ZP_$sA
startIndex,调用业务bean的相应findByCriteria方法,返回一个 :Z&ipd!yY
w $2-t
PaginationSupport的实例ps。 ,ll!19y
p-ry{"XA
ps.getItems()得到已分页好的结果集 QAu^]1 ;
ps.getIndexes()得到分页索引的数组 `7'(U)x,F
ps.getTotalCount()得到总结果数 !(+?\+U lE
ps.getStartIndex()当前分页索引 Gew0Y#/
ps.getNextIndex()下一页索引 Xf#uK\f
ps.getPreviousIndex()上一页索引 3fBq~ Q
!M}&dW2
4;%=ohD:!
i++ F&r[
Z#\
\NfR
_gU[FUBtJ
ULsz<Hj
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 CuDU~)`
~~h9yvW7&
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 NH|v`rO
c?wFEADn
一下代码重构了。 {%~Sbcq4F
[D/q%
我把原本我的做法也提供出来供大家讨论吧: u*H2kn[DU
x37r{$2
首先,为了实现分页查询,我封装了一个Page类: {K:/(\
java代码: Be-gGJG
W6]iJ
GY0<\-
/*Created on 2005-4-14*/ EEF}Wf$f
package org.flyware.util.page; 1=#`&f5f&
% #|S
/** VRMlr.T+
* @author Joa Ik~5j(^E-
* -@AGQ+e
*/ R:OoQ^c
publicclass Page { '0?5K0
2(
Ip?Ueaei
/** imply if the page has previous page */ XbG=H-|
privateboolean hasPrePage; BXLhi(.s
}p."7(
/** imply if the page has next page */ O+(Z`,^
privateboolean hasNextPage; *FOTq'%i
\5X34'7
/** the number of every page */ D*_ F@}=
privateint everyPage; {:fyz#>>^
u!;kBs
/** the total page number */ "PnYa)?1
privateint totalPage; c1b@3
l--xq^,`o]
/** the number of current page */ Jtc?p{
privateint currentPage; R%}OZJ_
C\EZ8
/** the begin index of the records by the current 2<YHo{0BLS
wgfn:LR
query */ @4hxGk=
privateint beginIndex; 7dN]OUdi
+)Z,%\)Z
)p ,-TtV
/** The default constructor */ 3^wJ4=^
public Page(){ b-%7@j
O^|,Cbon6
} >P+V!-%#
!0E$9Xon
/** construct the page by everyPage ^#XxqVdPk
* @param everyPage 5v!Uec'+
* */ W:hR81ci
public Page(int everyPage){ ,O $F`0>9A
this.everyPage = everyPage; 90teXxg=|
} d.2
2>?GD@GE
/** The whole constructor */ 7ug mZO}lL
public Page(boolean hasPrePage, boolean hasNextPage, Zna
}h{
LBw,tP
WY0u9M4
int everyPage, int totalPage, !|,=rM9x
int currentPage, int beginIndex){ K)@]vw/\
this.hasPrePage = hasPrePage; _U/etlDTO
this.hasNextPage = hasNextPage; V|<qO-#.
this.everyPage = everyPage; l
AE$HP'o
this.totalPage = totalPage; dID]{
this.currentPage = currentPage; *)g*5kKN
this.beginIndex = beginIndex; R#
mZYg
} 80l(,0`,
<N+l"Re#]
/** "yL&?B"9@
* @return 5N`g
* Returns the beginIndex. {tF=c0Z
*/ ?AYI
publicint getBeginIndex(){ 9`-ofwr'|
return beginIndex; nolTvqMT
} bbA+ZLZJn
#d(6q$IE
/**
9CUMqaY2
* @param beginIndex
p^\>{
* The beginIndex to set. }#w>>{Q
*/ ur9 -F^$
publicvoid setBeginIndex(int beginIndex){ ~O|j*T
this.beginIndex = beginIndex; si%f.A #
} K31Fp;K
i|.!*/qF
/** :mL\KQ
* @return zVkHDT[
* Returns the currentPage. e[>(L% QV+
*/ 6Q>:g"_
publicint getCurrentPage(){ bZERh:%o
return currentPage; aH,0+ |
} >(:KEA
{K_YW
/** B~LB^
n(>@
* @param currentPage oV,>u5:B
* The currentPage to set. gaTI:SKzc
*/ @*A(#U8p3
publicvoid setCurrentPage(int currentPage){ )wSsxX7:
this.currentPage = currentPage; !\+SE"ml
} 2R:['QT
3P I{LU
/** O:p~L`o>>
* @return sN^R Z0!>
* Returns the everyPage. <bIAq8
*/ {3
zq.e{
publicint getEveryPage(){ AP/tBCeM
return everyPage; N@;6/[8
} nVs0$?}
jO!!. w
/** b3y@!_'c
* @param everyPage J|,| *t
* The everyPage to set. lZ/Yp~2S
*/ [8O`VSV3
publicvoid setEveryPage(int everyPage){ \>:(++g
this.everyPage = everyPage; W#-M|
} \T<?=A
.NwHr6/s*
/** !oM1
* @return ]#+fQR$!
* Returns the hasNextPage. IjJ3CJ<
*/ !mq+Oz~
publicboolean getHasNextPage(){ jNrGsIY$
return hasNextPage; 2Hy $SSH
} Y7!,s-v4W
%UgyGQeo
/** wArNWBM
* @param hasNextPage OC"W=[Myl
* The hasNextPage to set. won%(n,HT
*/ /1o~x~g(b
publicvoid setHasNextPage(boolean hasNextPage){ ECU:3KH>MF
this.hasNextPage = hasNextPage; q$>At}4
} Q6"r^wWx
S : 9zz
/** FW=oP>f]w
* @return 8;Yx a8i e
* Returns the hasPrePage. +<8r?d2
*/ \BUr2]
publicboolean getHasPrePage(){ o!\Vk~Vi&
return hasPrePage; sq-[<ryk
} ks:Z=%o
W}a&L
/** lN{-}f;TN
* @param hasPrePage ~qco -b
* The hasPrePage to set.
z.P)
:Er
*/ *,@dt+H!y
publicvoid setHasPrePage(boolean hasPrePage){ ^5j9WV
this.hasPrePage = hasPrePage; oT%~)g
} w+*Jl}&\
b!ot%uZZ
/** 1i#M(u_
* @return Returns the totalPage. y`7BR?l
* ZU7,=B=
*/ G W|~sE +
publicint getTotalPage(){ YM/GSSq
return totalPage; 7 45Uo'
} &37QUdp+p
7p@qzE
/** :a[L-lr`e
* @param totalPage W?5^cEF
* The totalPage to set. f9X*bEl9;`
*/ :TX!lbCq
publicvoid setTotalPage(int totalPage){ |SQ5 Sb
this.totalPage = totalPage; u])N^AY"sj
} NuLQkf)
ORyFE:p$
} G>d@lt
>z.o?F
~X*)gS-=
`SZ^~O
89k9#i X
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 s+h`,gg9
iRBUX`0
个PageUtil,负责对Page对象进行构造: 8{(;s$H~
java代码: w8%<O^wN,
gle_~es'K
vp{jh-&
/*Created on 2005-4-14*/ @K3<K(
package org.flyware.util.page; D42Bm&JocO
cAC]%~orx
import org.apache.commons.logging.Log; w|OMT>.
import org.apache.commons.logging.LogFactory; -;Y*;xe
=3_I;Lw
/** !X
e
* @author Joa ))K3pKyb
* F%UyFUz
*/ FrIgu k1
publicclass PageUtil { R0B\| O0Uv
t$m268m~
privatestaticfinal Log logger = LogFactory.getLog UpF,e>s
j,Eo/f+j5
(PageUtil.class); "M3R}<Vt
WV]Si2pOZ
/** &}_E~jKK
* Use the origin page to create a new page EC<g7_0F
* @param page f R$E*Jd
* @param totalRecords Fo|6 PoSo
* @return %AwR 4"M
*/ a^hDxeG
publicstatic Page createPage(Page page, int l{[{pAm
k|(uIU* ]
totalRecords){ $,ZBK6CT
return createPage(page.getEveryPage(), 66NJ&ac
*e&OpVn
page.getCurrentPage(), totalRecords); JS]6jUB<B
} JL5
)
s.d }*H-o
/** ?W:YS82
* the basic page utils not including exception 9 +k7x,
;7Cb!v1
handler `md)|PSU
* @param everyPage q+<X*yC
* @param currentPage #EQwl6
* @param totalRecords :Q@=;P2
* @return page ;.>CDt-E]
*/ E%@,n9T~"
publicstatic Page createPage(int everyPage, int wl|cipy"
wqEO+7)S
currentPage, int totalRecords){ | #Z+s-
everyPage = getEveryPage(everyPage); CT(VV6I\
currentPage = getCurrentPage(currentPage); 29p`G1n
int beginIndex = getBeginIndex(everyPage, 6g06s @kz
E_ #MQ;n
currentPage); X%w` :c&
int totalPage = getTotalPage(everyPage, f"My;K $l;
//T1e7)
totalRecords); ++=t|ZS
U
boolean hasNextPage = hasNextPage(currentPage, =8:m:Y&|`G
X!#rw= Q
totalPage); pm`BMy<5PU
boolean hasPrePage = hasPrePage(currentPage); {8`V5:
o,}`4_N||
returnnew Page(hasPrePage, hasNextPage, .;nU"
a3'
everyPage, totalPage, 0$Rl78>(
currentPage, 7L2$(d4
2IDN?Mw
beginIndex); 1o5n1
A
} bWU4lPfP
@Tk5<B3
privatestaticint getEveryPage(int everyPage){ 9HJrMX
return everyPage == 0 ? 10 : everyPage; )\oLUuL`;
} 3Ov? kWFO
_ zM/>Qa
privatestaticint getCurrentPage(int currentPage){ Lso4ZZ;
return currentPage == 0 ? 1 : currentPage; O.OPIQ=?:w
} )> >Tj7
?VUW.-
privatestaticint getBeginIndex(int everyPage, int pgNyLgN
bp"@vlv
currentPage){ 9Q)9*nHe
return(currentPage - 1) * everyPage; 0i%r+_E_
} H$G`e'`OZ
r5#8Vzr
privatestaticint getTotalPage(int everyPage, int +q*Cw>t /
S:b-+w|*
totalRecords){ W_JFe(=3,
int totalPage = 0; VAGQR&T?
F`C$F!GE
if(totalRecords % everyPage == 0) &:Mk^DH5
totalPage = totalRecords / everyPage; RQg7vv]%
else VH*4fcT'D
totalPage = totalRecords / everyPage + 1 ; {c|{okQ;Q
R# 8.]
return totalPage; =H8
LBM
} J%9)&aW
jEaU;
privatestaticboolean hasPrePage(int currentPage){ R H^!7W*
return currentPage == 1 ? false : true; Ng=_#<
} ,\".|m1o.
<4{Jm8zJ
privatestaticboolean hasNextPage(int currentPage, aFfd!a"n
?^f=7e8]
int totalPage){ !t.*xT4W
return currentPage == totalPage || totalPage == r:xbs0
7
8l<