Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 g3{)AX[Uy
Wo5G23:xz
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 -F,o@5W>Y
U,/NygB~
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 R`=IYnoOA
<x@\3{{U
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 e2w$":6>
ixN>KwH
。 V M[9!:
K8*QS_*
分页支持类:
Z4'"*
u&l2s&i
java代码: fX G+88:2
M%4o0k]E,s
><iE VrpN
package com.javaeye.common.util; #I9|>XE1
0O4'Ts ?
import java.util.List; [:$j<}UmB
/b@0HL?
publicclass PaginationSupport { s<0yQ-=.?N
Vja' :i
publicfinalstaticint PAGESIZE = 30; FVLXq0<Cj
L]0+u\(
privateint pageSize = PAGESIZE; SqY;2:
jM
J[6qj
privateList items; "d'xT/l
"
yZI4%fen
privateint totalCount; G1B~?i2$ ?
G~)jk+Qq
privateint[] indexes = newint[0]; tjk Y[
*sf9(%j
privateint startIndex = 0; ] d| -r:4
o)n8,k&nm
public PaginationSupport(List items, int "Ks%!
Faa:h#
totalCount){ Q"8)'dL'
setPageSize(PAGESIZE); 7d/wT+f
setTotalCount(totalCount); 'xZxX3
setItems(items); # l~d
setStartIndex(0); XRs/gUT
} [K13Jy+
O89<IXk
public PaginationSupport(List items, int do*`-SDy
` 2|~Z
H
totalCount, int startIndex){ -a3+C,I8g
setPageSize(PAGESIZE); fh$U"
setTotalCount(totalCount); /@FB;`'
setItems(items); 5`oor86
setStartIndex(startIndex); W_8FzXA
} =YA%=
d_
'DsfKR^s
public PaginationSupport(List items, int &0f7>.y
2bX!-h
totalCount, int pageSize, int startIndex){ 8q7KqYu
setPageSize(pageSize); <t]c'
setTotalCount(totalCount); EBzg<-?o
setItems(items); bXq,iX
setStartIndex(startIndex); eJ{"\c(
} ~'fa,XZ<
BO[Q"g$Kon
publicList getItems(){ UkNC|#l)
return items; H#U{i
} i40r}?-
avO+1<`4B
publicvoid setItems(List items){ ABhza|
this.items = items; voQ, K9
} xx;'WL,g
6z%3l7#7Yi
publicint getPageSize(){ ;~~Oc
return pageSize; a,cDj
} 7u5B/M!
9][Mw[k>
publicvoid setPageSize(int pageSize){ c}Z,xop<P{
this.pageSize = pageSize; 1:YDN.*
} s>~&:GUwR
9[T#uh!DC
publicint getTotalCount(){ Si]Z `_
return totalCount; 4)Pt]#Ti
} \<lV),
0 {{7 "
publicvoid setTotalCount(int totalCount){ ]CC~Eo-%-
if(totalCount > 0){ $6!`
this.totalCount = totalCount; ::H jpM
int count = totalCount / @T/C<- /:
GU&XK7L
pageSize; U\VwJ2
{i
if(totalCount % pageSize > 0) ie.cTTOI
count++; vp mSzh
indexes = newint[count]; 7C2/^x P
for(int i = 0; i < count; i++){ Qg6m
indexes = pageSize * A9l^S|r
$<s@S;Ri
i; 5jNBt>.0
} t1C{
}else{ 1b|<
this.totalCount = 0; NlcWnSv
} ,7%(Jj$
^
} ;o^m"I\y
1}ZBj%z4l
publicint[] getIndexes(){ /4~RlXf@
return indexes; I}:>M!w
} RB &s$6A
?!~au0
publicvoid setIndexes(int[] indexes){ jHz]
this.indexes = indexes; gP1$#KgU
} svo^#V~h'
BM&'3K_y
publicint getStartIndex(){ Q ;k_q3
return startIndex; +#B%Y K|LR
} =?*V3e3{
} |SVt`n
publicvoid setStartIndex(int startIndex){ STOE=TC>
if(totalCount <= 0) Q ^ 39Wk@
this.startIndex = 0; 3"L$*toRA
elseif(startIndex >= totalCount) Be]o2N;J
this.startIndex = indexes GtGToI
:cC`wX$
[indexes.length - 1]; R:ar85F
elseif(startIndex < 0) 7H>dv'
this.startIndex = 0; xD1wHp!+
else{ Y(A?ib~K
this.startIndex = indexes |g;XC^!%=o
n,HWVo>([
[startIndex / pageSize]; ~{NDtB)
} UT{Nly8u
} HPCA,*YR`
_v$mGZpGY
publicint getNextIndex(){ W\KZFrV@
int nextIndex = getStartIndex() +
@ics
Sr+1.77}
pageSize; =)I{KT:y
if(nextIndex >= totalCount) O/-OW: 03
return getStartIndex(); *@BBlkcx
else z.H`a+cl
return nextIndex; }Ql;% 7
} Ahwu'mgnC
9n%W-R.
publicint getPreviousIndex(){ ljf9L:L
int previousIndex = getStartIndex() - ]g)%yuox9F
r}5GJ|p0
pageSize; 1Gqtd^*;
if(previousIndex < 0) dl;A'/(t
return0; /KV@Ce\
else dkn_`j\v
return previousIndex; B " B
} ^|\?vA
R1m18GHQ
} ,}|V'y
:8QG$Ua1
H{ $ yy)@F
:-
5Mn3*
抽象业务类 d8r+UP@#
java代码: \Q)~'P3
0yZw`|Zh[
34l=U?
/** 9q5[W=|
* Created on 2005-7-12 .s9Iymz
*/ $fn^i.
package com.javaeye.common.business; *lTu-
JC+VG;kcs
import java.io.Serializable; w'eenIX^^
import java.util.List; ;s!H
07MLK8jS
import org.hibernate.Criteria; #nxx\,i>
import org.hibernate.HibernateException; hg&AQk
import org.hibernate.Session; Fca?'^X
import org.hibernate.criterion.DetachedCriteria; wvYxL
c#p0
import org.hibernate.criterion.Projections; aOuon0
import W>Kwl*Cis"
*>#cs#)
org.springframework.orm.hibernate3.HibernateCallback; x$p\ocA
import J+4uUf/d!
ejQCMG7
org.springframework.orm.hibernate3.support.HibernateDaoS wb?hfe
H9Z3.F(2
upport; E:tUbWVp
rTJWftH!
import com.javaeye.common.util.PaginationSupport; 8]L.E
R.QcXz?d
public abstract class AbstractManager extends ?t"PawBWE
3HiW1*5W
HibernateDaoSupport { lt]U?VZ
p?h;Sv/
privateboolean cacheQueries = false; INT2i8oU
zJy{Ry[Sb
privateString queryCacheRegion; :({<"H)!'
4CCux4)N
publicvoid setCacheQueries(boolean 0k>&MkM\^
!K2[S
J
cacheQueries){ W
| }Hl{}
this.cacheQueries = cacheQueries; 7wnzef?)
} PLyu1{1"z
_aGdC8%[
publicvoid setQueryCacheRegion(String WI9.?(5q
7l p VK]
queryCacheRegion){ u rOG Oa$
this.queryCacheRegion = 9..k/cH
a]k&$
queryCacheRegion; {3Rax5Ty
}
u0e#iX
Rb0{t[IU
publicvoid save(finalObject entity){ tvUvd(8w
getHibernateTemplate().save(entity); }X?*o`sW
} WWLVy(
*l^'v9
publicvoid persist(finalObject entity){ d7P @_jO6
getHibernateTemplate().save(entity); ba ?k:b
} vB{b/xmah
0_EF7`T
publicvoid update(finalObject entity){ f#t^<`7
getHibernateTemplate().update(entity); xRUYJ=|oh
} >KPJ74R
]4yvTP3[Rm
publicvoid delete(finalObject entity){ O+$70
getHibernateTemplate().delete(entity); SMFW]I2T/
} 5HN<*u%z
m [g}vwS
publicObject load(finalClass entity, dNobvK
M&FuXG%
finalSerializable id){ |gz,Ip{
return getHibernateTemplate().load SDwSlwf
H^g<`XEgw
(entity, id); C] w< &o
} 6~S0t1/t?
#77UKYj2L-
publicObject get(finalClass entity, m+UdT854
Q(6(Scp{
finalSerializable id){ D2p6&HNT
return getHibernateTemplate().get jhG7sS|
DE ws+y-*
(entity, id); m=}X$QF`^
} 4QNR_w
->8q, W2A
publicList findAll(finalClass entity){ pxx(BE
return getHibernateTemplate().find("from r\d:fot
<3}l8Z
" + entity.getName()); 'qJ-eQ7e
} ^Q>*f/.KN
JWL J<z
publicList findByNamedQuery(finalString xW =$j|
Ol[gck|~
namedQuery){ o}A #-
return getHibernateTemplate DeA'D|
HqBPY[;s
().findByNamedQuery(namedQuery); o3qv945
} D3xaR
j!\0Fyr
publicList findByNamedQuery(finalString query, u2]g1XjeG
#:|?t&On
finalObject parameter){ 63S1ed[
return getHibernateTemplate RH Vv}N0
'.yWL
().findByNamedQuery(query, parameter); &|'6-wD.
} |sa7Y_
@3 c#\jx
publicList findByNamedQuery(finalString query, ,d>~='
U_'q- *W
finalObject[] parameters){ AFTed?(
return getHibernateTemplate "}p?pF<'0
--`LP[ll
().findByNamedQuery(query, parameters); #\BI-zt
} [Z\1"m
?w/nZQWi
publicList find(finalString query){ x
5Dt5Yp"o
return getHibernateTemplate().find {Ch"zuPX
%k
#Nu
(query); "v!HKnDT
} p0y?GNQ
SsX05>
publicList find(finalString query, finalObject TSSt@xQ+
{K4t8T]
parameter){ [E
(M(w':
return getHibernateTemplate().find tcEf
~|3
lO> 7`2x=F
(query, parameter); HF+fk*_Q
} MIF[u:&
Az9J{)
public PaginationSupport findPageByCriteria &6=ZT:.6Te
)]>
'7] i
(final DetachedCriteria detachedCriteria){ b^DV9mO4J
return findPageByCriteria w s>Iyw.u
}#>d2 =T$
(detachedCriteria, PaginationSupport.PAGESIZE, 0); x[W]?`W3r~
} -#;VFSz,9*
FR^wDm$
public PaginationSupport findPageByCriteria H)T# R?
S\g7wXH
(final DetachedCriteria detachedCriteria, finalint BON""yIC
!9 LAXM
startIndex){ Y~hd<8 ~
return findPageByCriteria B4Af
\w[ZY$/
(detachedCriteria, PaginationSupport.PAGESIZE, h$ iyclX
jQeE07g
startIndex); B9)qv>m
} b%f2"e0g
1=5'R/k
public PaginationSupport findPageByCriteria ((>3,%B`
vKf;&`^qE
(final DetachedCriteria detachedCriteria, finalint {C0^D*U:
"rDzrz
pageSize, Po!JgcJ#\
finalint startIndex){ 'Oy5G7^R
return(PaginationSupport) JvJ!\6Q@
T>Rf?%o
getHibernateTemplate().execute(new HibernateCallback(){ /\uH[[s
publicObject doInHibernate .Xz"NyW
#u5;utY:F
(Session session)throws HibernateException { 1fhK{9#
Criteria criteria = \BcJDdL
]AA*f_!
detachedCriteria.getExecutableCriteria(session); 2a(yR>#
int totalCount = Ldj^O9p(
Xa%&.&V
((Integer) criteria.setProjection(Projections.rowCount $_7d! S"
9g5{3N3
()).uniqueResult()).intValue(); f.84=epv
criteria.setProjection 0R 5^p
2td|8vDA
(null); -kri3?Y,
List items = X.AWs=:-
vua1iN1
criteria.setFirstResult(startIndex).setMaxResults aco}pXz
l^y?L4hg)
(pageSize).list(); 6dR-HhF
PaginationSupport ps = m>-^K
9 c5G6n0
new PaginationSupport(items, totalCount, pageSize, ah"MzU)
9q)nNX<$)
startIndex); M|E2&ht
return ps; 19w,'}CGk
} &B7+>Ix,
}, true); ?)o4 Kt'h
} Iam-'S5
ny_ kr`$42
public List findAllByCriteria(final {p*hN i)0
yH"$t/cU"R
DetachedCriteria detachedCriteria){ i&'^9"Z)O
return(List) getHibernateTemplate [FV=@NI
CbH T #
().execute(new HibernateCallback(){ $h]Y<&('G
publicObject doInHibernate "tz0ko,(
p5# P
r
(Session session)throws HibernateException { ]^6y NtLK
Criteria criteria = #b"5L2D`y'
qqt.nrQ^
detachedCriteria.getExecutableCriteria(session); 0jJ28.kOp
return criteria.list(); zTBi{KrZ
} wI]R+.
}, true);
k E#_Pc
} b^l
-*4
;$tv8%_L[
public int getCountByCriteria(final A]O5+"mc
Yx}"> ;\
DetachedCriteria detachedCriteria){ ?(NT!es
Integer count = (Integer) L3=YlX`UL
<&Y}j&(
getHibernateTemplate().execute(new HibernateCallback(){ >gZk
581/
publicObject doInHibernate bHQKRV
)<x;ra^
(Session session)throws HibernateException { X?v^>mA
Criteria criteria = 5)>ZO)F&
&(uF&-PwO4
detachedCriteria.getExecutableCriteria(session); o )nT
return wp]7Lx?F
@F(3*5c_Y
criteria.setProjection(Projections.rowCount =y-!k)t
9>[.=
()).uniqueResult(); Rqb{)L
X*
} ?4,*RCaI
}, true); Ubw!/|mi
return count.intValue(); :af;yu
} "U5Ln2X{J
} hNq8
uyKx
5Ckk5b
[,o5QH\Etq
v1X&p\[d
r@ T-Hi
IB.'4B7
用户在web层构造查询条件detachedCriteria,和可选的 rm)SfT<
!8" $d_=h
startIndex,调用业务bean的相应findByCriteria方法,返回一个 T?]kF-
#-gGsj;F
PaginationSupport的实例ps。 =4M.QA@lI!
n2y/zP>TC
ps.getItems()得到已分页好的结果集 {7Gx9(
ps.getIndexes()得到分页索引的数组 l`M5'r]l
ps.getTotalCount()得到总结果数 d[>N6?JA/
ps.getStartIndex()当前分页索引 +zVcOS*-
ps.getNextIndex()下一页索引 2NArE@
ps.getPreviousIndex()上一页索引 :9x084ESR)
`3sy>GU?
RZ<+AX9R
%+7T9>+
Vr/` \441
UP~WP@0F
1hMX(N&|
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 =~W0 ~lxX
`r'0"V
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 S4{ Mu(^xT
%];h|[ax]
一下代码重构了。 1 ~B<
=UB*xm%!
我把原本我的做法也提供出来供大家讨论吧: FUzMc1zy|
Kixr6\
首先,为了实现分页查询,我封装了一个Page类: N&x WHFn]C
java代码: DQ n`@
&Xn8oe
,.6J6{
/*Created on 2005-4-14*/ }W__ffH
package org.flyware.util.page; J2oWssw"
dY4k9p8
/** iBtjd`V*
* @author Joa [`hE^chd
* {#w A!>.
*/ 6m-:F.k1(
publicclass Page { rt 3f7 s*
kY'<u
/** imply if the page has previous page */ |Uy e>%*}4
privateboolean hasPrePage; 0U~;%N+lv
_Ra<|NVQh
/** imply if the page has next page */ #4P3xa
privateboolean hasNextPage; n ,&/D
{XDY:`vZ}
/** the number of every page */ Uxk[O
privateint everyPage; ]M+VSU
Z92iil;t
/** the total page number */ ~|r'2V*
privateint totalPage; eC+"mhB
jsNH`"
/** the number of current page */ =.qm8+
privateint currentPage; 9k=U0]!ch
7g A08M[O
/** the begin index of the records by the current I9[1U
kb"_6,[Ms
query */ |2
YubAIZ(
privateint beginIndex; "'z,[v50&
u{OS6Ky
X6LhM
/** The default constructor */ q3AJwELXw
public Page(){ 9lZAa8Rx i
nOAJ9
} fr}1_0DDz
,?xLT2>J_
/** construct the page by everyPage )h>\05|T
* @param everyPage ,]PyDq6
* */ M#\ <
public Page(int everyPage){ %1-K);SJ
this.everyPage = everyPage; YGq=8p7.R
} ;~Q
A9\]3 LY
/** The whole constructor */ P+)qE6\
public Page(boolean hasPrePage, boolean hasNextPage, ibd$%;bX3
KP[NuXA`
GI2eJK
int everyPage, int totalPage, "3{#d9Gs
int currentPage, int beginIndex){ >63)z I
this.hasPrePage = hasPrePage; <*s"e)XeqF
this.hasNextPage = hasNextPage; ^[{`q9A#d
this.everyPage = everyPage;
G"o!}
this.totalPage = totalPage; {fGd:2dh
this.currentPage = currentPage; \H Wcd|
this.beginIndex = beginIndex; EJf #f
} :]P~.PD5,
YSR mt/
/** !_CX2|
* @return kzZDtI)
* Returns the beginIndex. q"gqO%Wb|
*/ {]wIM^$6+
publicint getBeginIndex(){ ~7dM!g{W
return beginIndex; G'ij?^?
} R)0N0gH
NFk}3w:
/** )E'Fke
* @param beginIndex $&cz$jyY
* The beginIndex to set. :J^qj AV
*/ #O2wyG)oU
publicvoid setBeginIndex(int beginIndex){ vU=9ydAj?
this.beginIndex = beginIndex; "$XYIuT
} 2v0!` &?M{
~I{EE[F>qL
/** )v[XmJ>H~o
* @return e^j<jV`1
* Returns the currentPage. c_
La^HS
*/ r55qmPhg
publicint getCurrentPage(){ z;i4N3-:
return currentPage; &&[zT/]P
} >Bc>IO
0cHfxy3
/** O^5UB~
* @param currentPage KAd_zkUA
* The currentPage to set. +7,8w
*/ '.?^uM
publicvoid setCurrentPage(int currentPage){ b2N6L2~V
this.currentPage = currentPage; 6X/wdk
} #
;K,,ku
x
7ftR4
/** EXuLSzQwv
* @return MkwU<ae AB
* Returns the everyPage. D^Te%qnW
*/ w/ TKRCO3
publicint getEveryPage(){ l , ..5
return everyPage; qu_)`wB
} u*2fP]n
kw*)/$5]
/** pet~[e%!
* @param everyPage JIzY,%`\
* The everyPage to set. }91*4@B7
*/ 3y99O
$EAc
publicvoid setEveryPage(int everyPage){ ZWO)tVw9G
this.everyPage = everyPage; ; e@gO
} Fh K&@@_
z
v>Oh#
/** >OV<_(S4
* @return nX|Q~x]
* Returns the hasNextPage. H@GE)I>^@
*/ NUCiY\td
publicboolean getHasNextPage(){ )l&D]3$6K
return hasNextPage; #%:c0=
} 2-~|Z=eGW
F/>*Ifs
/** |( G2K'Ab
* @param hasNextPage vA=Z=8
* The hasNextPage to set. yGxv?%%2
*/ (&jW}1D
publicvoid setHasNextPage(boolean hasNextPage){ yub{8 f;v
this.hasNextPage = hasNextPage; v5_7r%Hiw
} "+)K |9T#
OOnX`
/** CK0l9#g
* @return 3X;{vO\a1
* Returns the hasPrePage. 8'A72*dhX
*/ >H>gH2qp
publicboolean getHasPrePage(){ q/NY72tj0
return hasPrePage; #EDEYEW7
} 9Hd;353Q
!;S"&mcPDJ
/** `1Zhq+s
* @param hasPrePage OR:[J5M)
* The hasPrePage to set. qz!Ph5(
*/ ]dSK
wxk
publicvoid setHasPrePage(boolean hasPrePage){ p~&BChBl!=
this.hasPrePage = hasPrePage; iib
} 5u r)uz]w8
UZGDdP
/** ]ab#q=
* @return Returns the totalPage. XM/vDdR
* Tkw;pb
*/ LH2PTW\b!6
publicint getTotalPage(){ |Y},V_@d
return totalPage; sYqgXE.
} y500Xs[c
i0:>Nk
/** :]PM_V|
* @param totalPage Dw_D+7>(v
* The totalPage to set. +f>c xA
*/ ]5'
d&f
publicvoid setTotalPage(int totalPage){ ye%iDdf
this.totalPage = totalPage; _OMpIdY,R*
} TW7:q83{l
Z
o=]dBp.
} TJ(K3/)Z
>xqM5#m`E$
(gwj)?:
"0CjP+1k
rkB'Hf
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 e$e#NoN
";x+1R.d
个PageUtil,负责对Page对象进行构造: tnz+bX26
java代码: Ub_4yN;
yHeEobvb
-)jax
/*Created on 2005-4-14*/ c>HK9z{
package org.flyware.util.page; \,&9
@?kM'*mrZM
import org.apache.commons.logging.Log; $g10vF3
import org.apache.commons.logging.LogFactory;
Pm+tQ
kM/Te{<
/** EpYy3^5d
* @author Joa UG;Y^?Ppe5
* x;LzG t:w
*/ JWv{=_2w
publicclass PageUtil { J~#$J&iKh
~Rpm-^
privatestaticfinal Log logger = LogFactory.getLog P[ r];e
uH@FU60
(PageUtil.class); f )Z%pgB
t<j^q`;@v
/** amWD-0V
* Use the origin page to create a new page zR;X*q"T$4
* @param page ?4 S+edX
* @param totalRecords w Q+8\ s=
* @return LD>\#q8a*
*/ *Dmx&F=3,5
publicstatic Page createPage(Page page, int yxt[=
C
dRi5hC$
totalRecords){ B@y(.
return createPage(page.getEveryPage(), <7_KeOLJ
::5E 8919
page.getCurrentPage(), totalRecords); !#2=\LUC
} %JZZ%xc
4|?{VQ
/** BvD5SBa}"
* the basic page utils not including exception bFS>)
Bux [6O%
handler d[D&J
* @param everyPage S6d`ioi-
* @param currentPage 7nU6k%_ %
* @param totalRecords R\|lt)h
* @return page n5-)/R[z
*/ 9BEFr/.
publicstatic Page createPage(int everyPage, int '8 Ztj
(ll*OVL
currentPage, int totalRecords){ p d[ncL
everyPage = getEveryPage(everyPage); LQYy;<K
currentPage = getCurrentPage(currentPage); fvq,,@23
int beginIndex = getBeginIndex(everyPage, OZY, @c
e({9]
currentPage); @f+8%I3D
int totalPage = getTotalPage(everyPage, oR1^/e
N2'qpxOLI
totalRecords); Z?P~z07
boolean hasNextPage = hasNextPage(currentPage, nl aM
j@gMbiu
totalPage);
+=q)
boolean hasPrePage = hasPrePage(currentPage); ~[WF_NU1y
b2,mCfLsv
returnnew Page(hasPrePage, hasNextPage, iIT8H\e
everyPage, totalPage, ^ KK_qC
currentPage, |'O[7uT
D]a:@x`+Bz
beginIndex); wxg^Bq)D*R
} dy__e ^qi
rl#vE's6.e
privatestaticint getEveryPage(int everyPage){ / $ :j
return everyPage == 0 ? 10 : everyPage; "@A![iP
} 0MMEo~dih
s=6}%%q6
privatestaticint getCurrentPage(int currentPage){ B(?Yw>Xd[
return currentPage == 0 ? 1 : currentPage; GQQ.OvEc
} 9>zcBG8f
j$UV/tp5T
privatestaticint getBeginIndex(int everyPage, int 2aw&YZ&Xo
#`TgZKDg2
currentPage){ fKC3-zm
return(currentPage - 1) * everyPage; =<r8fXWZ
} g]c[O*NTL
| Xi%
privatestaticint getTotalPage(int everyPage, int `p
b5*h6r!
RO;Bl:x4
totalRecords){ n<sd!xmqFx
int totalPage = 0; ,;?S\V
=gfI!w
if(totalRecords % everyPage == 0) ?"#%SKm
totalPage = totalRecords / everyPage; QxuhGA
else p.I.iAk%G^
totalPage = totalRecords / everyPage + 1 ; 7(M(7}EKA
w=]Ks'C]
return totalPage; %W,D;?lEo>
} X"gCRn%tn
A[IL
H_w
privatestaticboolean hasPrePage(int currentPage){ '{I_\~*
return currentPage == 1 ? false : true; =deMd`=J
} fDE%R={!n5
C51bc6V
privatestaticboolean hasNextPage(int currentPage, CQ`=V2:"ON
LE5.b]tv2
int totalPage){ ~R$~&x