Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 KKMzhvf]#
nT7{`aaQl
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 3Ee8_(E\
6AS'MD%&
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 ?l\1n,!:8
9iMQq40
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 P
"S=RX#+
>)5=6{x
。 2 uuI_9 "^
>| d^
分页支持类: +a'QHtg
ZHPsGHA
java代码: TTNgnP
a2:Tu
RX]x3-
package com.javaeye.common.util; Zmx[u_NG
aFkxR\x
6%
import java.util.List; *7L*:g
/D9FjOP
publicclass PaginationSupport { OBF3)L]
}h+_kRQ
publicfinalstaticint PAGESIZE = 30; TWv${m zE
g 4n&k
privateint pageSize = PAGESIZE; F[aow$",+}
b0\'JZ
privateList items; B@ab[dm280
&p?Oo^
privateint totalCount; H<$.AC\zn
G5^gwG+
privateint[] indexes = newint[0]; WZ.d"EE"
>v4k_JX
privateint startIndex = 0; GPqF>
#
SmM5%
public PaginationSupport(List items, int ~cE; k@
3J\NkaSR
totalCount){ ^RN1?dXA
setPageSize(PAGESIZE); 6r"PtHr
setTotalCount(totalCount); *%0f^~!G<p
setItems(items); A<6V$e$:2
setStartIndex(0); H>AzxhX[n
} 8ad!.
dhW; |
public PaginationSupport(List items, int ~;ink
j/zD`ydj
totalCount, int startIndex){ IBwquw+
setPageSize(PAGESIZE); a
S-
rng
setTotalCount(totalCount); NJYx.TL
setItems(items); E(G=~>P
setStartIndex(startIndex); r#{r]q_E*
} ?e|'I"
D3^[OHi~a
public PaginationSupport(List items, int Q9K+k*?{N
':,6s
totalCount, int pageSize, int startIndex){ )k&pp^q\
setPageSize(pageSize); ujcS>XN,1
setTotalCount(totalCount); fgxsC7P$
setItems(items); c$f|a$$b
setStartIndex(startIndex); `R@24 )
} lY}mrb
39!o!_g
publicList getItems(){ ^H+j;K{5,
return items; 0w >DU^+
} $,k SR}
QN(f8t(
publicvoid setItems(List items){ &%pB; dk
this.items = items; #( nheL
} X$JO<@x
{nQ}t
}B
publicint getPageSize(){ 1A23G$D
return pageSize; JxQwxey{
} <$.KCLP
4Uz:zB
publicvoid setPageSize(int pageSize){ :C42yQAP
this.pageSize = pageSize; Y51XpcXQ
} PiB)pUYj
Y6A]dk
publicint getTotalCount(){ Ja-D}|;
return totalCount; DT&[W<oN
} MW9B
-x
tYfhKJzGC
publicvoid setTotalCount(int totalCount){ k?Jzy
if(totalCount > 0){ 4qda!%
this.totalCount = totalCount; #f|-l$a)3a
int count = totalCount / 1elx~5v1.=
y_"GMw
pageSize; )EO/P+&
if(totalCount % pageSize > 0) I#l9
count++; %9mCgHQ9
indexes = newint[count]; Kw'Dzz%kN
for(int i = 0; i < count; i++){ "!)8bTW
indexes = pageSize * +2oZB]GPL
\Y9=dE}
i; ^J>28Q\S
} c7\bA7.
}else{ !U`T;\,v5
this.totalCount = 0; p)ZlQ.d#Y
} mUy/lo'4
} Ao96[2U6
f.jAJ; N>
publicint[] getIndexes(){ JXj`
return indexes; ^
+{ ~
^y7
} 7\ff=L-b
?p5RSt
publicvoid setIndexes(int[] indexes){ u\qyh9s
this.indexes = indexes; -lL*WA`
} %8o(x 0
QBto$!})
publicint getStartIndex(){ 3|:uIoR{
return startIndex; Op3 IL/
} |ry;'[*
|0f\>X I
publicvoid setStartIndex(int startIndex){ qw87B!D
if(totalCount <= 0) 8zj09T[
this.startIndex = 0; \g4\a?i
elseif(startIndex >= totalCount) &s/aJgJhp
this.startIndex = indexes ?5mVC]W?]
^Hq}9OyS9
[indexes.length - 1]; V2/+SvB2
elseif(startIndex < 0) 6lT'%ho}B
this.startIndex = 0; FA{I
S0
else{ uy\YJ.WMQ
this.startIndex = indexes [9?=&O#*
{OAy@6
+
[startIndex / pageSize]; $Z28nPd/
} }Tc)M_
} `"ie57-
A94VSUDA:
publicint getNextIndex(){ .h+<m7
int nextIndex = getStartIndex() + YSrFHVq
M~662]Ekk
pageSize; FeV=4tsy
if(nextIndex >= totalCount) UjKHGsDi4
return getStartIndex(); D'nV
&m
else &I(|aZx?J
return nextIndex; )%j)*Ymz;
} ==FzkRA)
l3g6y9;
publicint getPreviousIndex(){ 30H:x@='9
int previousIndex = getStartIndex() - %\b5)p
6AQ;P
pageSize; #-lk=>
if(previousIndex < 0) [/#n+sz.A
return0; %7|qnh6
else 3b&W=1J
return previousIndex; }= <!j5:
} RTl7vzG
/asyj="N7
} &H4UVI
u|:VQzPd-
#kb(2Td
!-MG"\#Wq
抽象业务类 1~`gfHI4
java代码: ]lO$oO
A`N;vq,
;,4J:zvZdQ
/** PPq*_Cf
* Created on 2005-7-12 ptDA))7M/
*/ uk'<9g^
package com.javaeye.common.business; Cza)s
O3BU.X1'%
import java.io.Serializable; to?"{
import java.util.List; z:fhq:R(
U_8I$v-~
import org.hibernate.Criteria; d?{2A84S
import org.hibernate.HibernateException; '\_)\`a|
import org.hibernate.Session; fglZjT
import org.hibernate.criterion.DetachedCriteria; }E1Eq
import org.hibernate.criterion.Projections; 50R+D0^mh
import e5XikLu
[&`>&u@MK
org.springframework.orm.hibernate3.HibernateCallback; l|up3A3)
import a0LX<}
T ]zjJwa
org.springframework.orm.hibernate3.support.HibernateDaoS '+QgZ>q"
# xoFIH
upport; /nmfp&@
mn4;$1~e>H
import com.javaeye.common.util.PaginationSupport; k m|wB4
$7bmUQ|
public abstract class AbstractManager extends CKR9APkv
JR>B<{xB
HibernateDaoSupport { .z4FuG,R
T6,lk1S'=
privateboolean cacheQueries = false; 0ND7F
O0l;Qi
privateString queryCacheRegion; v}mmY>M%
c]&VUWQ
publicvoid setCacheQueries(boolean PJ.jgN(r
pxC5a i
cacheQueries){ a|53E<5X
this.cacheQueries = cacheQueries; r 1a{Y8?
} ropiyT9;
k %rP*b*
publicvoid setQueryCacheRegion(String e/3hb)#;
#3$|PM7,_
queryCacheRegion){ 0`thND)?O
this.queryCacheRegion = ;Dgp
!*v=
#P@r[VZ{6
queryCacheRegion; Dm^kuTIG
} {2Ibd i
18HHEW{
publicvoid save(finalObject entity){ CKur$$B
getHibernateTemplate().save(entity); l85"C
} 0cbF.Um8
J|q_&MX/
publicvoid persist(finalObject entity){ mNYz7N
getHibernateTemplate().save(entity); _L72Ae(_
} %G
SSy_c
wz#n$W3mGf
publicvoid update(finalObject entity){ e+WVN5"ID>
getHibernateTemplate().update(entity); U,S286
}
p[GyQ2k)
<am7t[G."
publicvoid delete(finalObject entity){ ZM.g+-9
getHibernateTemplate().delete(entity); f$'D2o, O
} Y|~>(
TK>}$.c%+
publicObject load(finalClass entity, ;v'Y'!-J
T{M:)}V
finalSerializable id){ F&~vD
return getHibernateTemplate().load pp`U]Q5"gX
G<eJ0S
(entity, id); t*#&y:RG
} I$LO0avvH2
=R"tnjR
publicObject get(finalClass entity, N-|Jj?c
5S?yj
finalSerializable id){ m t^1[
return getHibernateTemplate().get }{y$$X<:
BSf"'0I&
(entity, id); u\wd<<I']
} \nWpV7TSN
p'4P2
publicList findAll(finalClass entity){ J_@4J7
return getHibernateTemplate().find("from M2S|$6t:
yw<xv-Q=i
" + entity.getName()); Jx<
} -tdG}Gu
wp*1HnWj8Y
publicList findByNamedQuery(finalString tK
H!xit
Zv\b`Cf}
namedQuery){ WGx>{'LJ
return getHibernateTemplate #w@Pa L iS
aB)DX
().findByNamedQuery(namedQuery); '
^^K#f8
} U*TN/6Qy.
xW4+)F5P(
publicList findByNamedQuery(finalString query, Fm':sd)'X
mg(56)
finalObject parameter){ k]iS3+nD
return getHibernateTemplate cFvx*n
#VE$C3<
().findByNamedQuery(query, parameter); Biy 9jIWI
} bg}77Y'^
qI^jwl|k
publicList findByNamedQuery(finalString query, -c@ 5qe>
;I'/.gW;{
finalObject[] parameters){ nL!@#{z
return getHibernateTemplate Q^rW^d
}C1wfZ~F~
().findByNamedQuery(query, parameters); K;y\&'E
} ?g4|EV-56
du,-]fF
publicList find(finalString query){ y9hZ2iT
return getHibernateTemplate().find w#,v n8
)}!'VIe^!
(query); T7~v40jn|
} uek3Y[n
G |^X:+
publicList find(finalString query, finalObject |GQ$UB
\k_3IP?o=
parameter){ !ei20@
return getHibernateTemplate().find 4?&a?*M
M3 u8NRd5|
(query, parameter); 5I,X#}K[
} ew$Z5N:
AHY)#|/)
public PaginationSupport findPageByCriteria q?4uH;h:^G
A5ID I<a
(final DetachedCriteria detachedCriteria){ :<8V2
return findPageByCriteria 8v
1%H8
HPKyAcS\
(detachedCriteria, PaginationSupport.PAGESIZE, 0); vq7%SEkES
} 7F:;3c
3+5\xRq
public PaginationSupport findPageByCriteria i%8&g2
J*X.0&Toc
(final DetachedCriteria detachedCriteria, finalint J9.p8A^^2
E(_I3mftm
startIndex){ z{L;)U B^
return findPageByCriteria zEfD{I
_ n4ma
(detachedCriteria, PaginationSupport.PAGESIZE, F@bCm+z-
E}/|Lja
startIndex); b'5pQ2Mq
} 'LLx$y.Ei[
#%"TU,[+
public PaginationSupport findPageByCriteria {OrE1WHB
RsfTUb)<
(final DetachedCriteria detachedCriteria, finalint 5udoZ>T
2{I z
pageSize, ^X%4@,AE
finalint startIndex){ d}cJ5!d
return(PaginationSupport) ldvxYq<:
O>5 u5n
getHibernateTemplate().execute(new HibernateCallback(){ NOp=/
publicObject doInHibernate e*6` dz@
G%jJ>T4
(Session session)throws HibernateException { <" l;l~Y1
Criteria criteria = , %O3^7i
`f+g A
detachedCriteria.getExecutableCriteria(session); +/86w59
int totalCount = 1|w:xG^
%E7.$Gj%
((Integer) criteria.setProjection(Projections.rowCount z2V8NUn
HCkqh4
()).uniqueResult()).intValue(); $!!=fFX*y
criteria.setProjection *"{Z?< 3
\1C!,C
(null); bk9~63tN+>
List items = ]mo<qWRc>p
Rha3
criteria.setFirstResult(startIndex).setMaxResults c$:=d4t5$
Nw&}qSN
(pageSize).list(); (G%gVk]
PaginationSupport ps = [Ms{J!^q
KqUSTR1e[
new PaginationSupport(items, totalCount, pageSize, @/NZ>.
i=H>D
startIndex); NZW)X[nXM
return ps; :42;c:8 5
} Mqf}Aiqk;
}, true); '=G
Ce%A
} cYy@
lT!$\E$1
public List findAllByCriteria(final x&oBO{LNK,
^_h7!=W
DetachedCriteria detachedCriteria){ YkAWKCOni
return(List) getHibernateTemplate `Mp7})
Bp{`%86SE
().execute(new HibernateCallback(){ 7+hF;
publicObject doInHibernate YGV#.
m&~Dj#%(w
(Session session)throws HibernateException { #33RhJu5,
Criteria criteria = ~'QeN%qadP
k+r9h'd
detachedCriteria.getExecutableCriteria(session); cPaWJ+c
return criteria.list(); (My$@l973
} )u )$ `a
}, true); a:^Gr%
} G$|;~'E
J}_Dpb [L
public int getCountByCriteria(final q;0&idYC
;(0$~O$3u
DetachedCriteria detachedCriteria){ AD%D ,l
Integer count = (Integer) Dzjt|U0ru9
\j})Kul
getHibernateTemplate().execute(new HibernateCallback(){ _ u|FJTk
publicObject doInHibernate c^bk:=uj
H?(SSL
(Session session)throws HibernateException { KPd C9H
Criteria criteria = "zIq)PY
KW7?: x
detachedCriteria.getExecutableCriteria(session); ZMMo6;
return ?(ls<&s{w
D<3V#Opw
criteria.setProjection(Projections.rowCount ie~fQ!rf
h k!,
()).uniqueResult(); [H:GKhPC`
} sqpOS!]
}, true); hB}h-i(u
return count.intValue(); ]baaOD$Z
} ]F*a PV
} m_Ac/ctf
Ao,!z
O][Nl^dl
[+MX$y
Xz.Y-5)
"3i80R\w`F
用户在web层构造查询条件detachedCriteria,和可选的 _X2EBpZp
-llx:
startIndex,调用业务bean的相应findByCriteria方法,返回一个 Ag4Ga?&8ec
-6~y$c&c
PaginationSupport的实例ps。 1.95 ^8
7kX$wQZ_
ps.getItems()得到已分页好的结果集 YaNH.$.:
ps.getIndexes()得到分页索引的数组 #W%)$kc
ps.getTotalCount()得到总结果数 ^?7dOW
ps.getStartIndex()当前分页索引 vG<pc_ak
ps.getNextIndex()下一页索引 ?9gTk
\s?R
ps.getPreviousIndex()上一页索引 %V(N U_o
uJam
$V
~l*?D7[o
pjHRV[`AP
v]{uxlh
o%WjJ~!zL
6(J4IzZ
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 yB4H3Q )
*fH_lG%
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 pba8=Z
,s><kHJ
一下代码重构了。 'uKkl(==%
%t`SSW7I
我把原本我的做法也提供出来供大家讨论吧: ZG@M%|>
VwOG?5W/
首先,为了实现分页查询,我封装了一个Page类: (e8G
(
java代码: ]Q4PbW
WfDX"rA
% nmY:}um
/*Created on 2005-4-14*/ M .)}e7
package org.flyware.util.page; 45+%K@@x
hH1lgc
/** gM3]%L_
* @author Joa /$9BPjO{
* 1 O7]3&L@
*/ 0Ws;|Yg
publicclass Page { :/v,r=Y9p
cZgMA8
F
/** imply if the page has previous page */ n|x$vgb
privateboolean hasPrePage; 7k]RO
l 70,Jo?78
/** imply if the page has next page */ i>Fvmw
privateboolean hasNextPage; e`Co,>W/
?jri!]ux#
/** the number of every page */ *!g 24
privateint everyPage; /BMtcCPG!
ms}f>f=
/** the total page number */ @GG(7r\/B
privateint totalPage; V \6(d
WgA`kT
/** the number of current page */ ^Ue0mC7m
privateint currentPage; H\fcY p6
[6; N3?+
/** the begin index of the records by the current 69C8-fF0[I
hI|/>4<
query */ ,{?q^"
privateint beginIndex; _\dt?(m|
20UqJM8Ot
aXdf>2c{JD
/** The default constructor */ #e.jY_
public Page(){ [IX*sr
wfxOx$]zK
} 4l&"]9D
k7^R,.c@
/** construct the page by everyPage !TP6=ks
* @param everyPage ohrw\<xsu
* */ g4:VR:o
public Page(int everyPage){ %5JW<9
this.everyPage = everyPage; 9<|m4
} co5y"yj_
xfq]9<
/** The whole constructor */ F#(.v7Za
public Page(boolean hasPrePage, boolean hasNextPage, ch@x]@-;A3
N5nvL)a~
>dpbCPJ9[
int everyPage, int totalPage, Ag0]U
int currentPage, int beginIndex){ ~ww?Emrw
this.hasPrePage = hasPrePage; d5DP^u
this.hasNextPage = hasNextPage; D@8jGcz62
this.everyPage = everyPage; UvkJ?Bu
this.totalPage = totalPage; *Ph]F$ZP
this.currentPage = currentPage; dG&2,n'f
this.beginIndex = beginIndex; "~u_\STn <
} h|bqyu
,>;!%Ui/p
/** %O#)Nq>mp
* @return HWqLcQ d:P
* Returns the beginIndex. N-[n\}'
*/ "JkZJ#
publicint getBeginIndex(){ ZCm1+Y$
return beginIndex; 31~hlp;
} wms1IV%;
Zta$R,[9h
/** I[#U`9Dt
* @param beginIndex 9Z&?R++?
* The beginIndex to set. /ZHO>LNN|
*/ ||uZ bP@
publicvoid setBeginIndex(int beginIndex){ ~&1KrUu&
this.beginIndex = beginIndex; *^'wFbaBO
} ezp<@'0ZT
~32Pjk~
/** 6wPeb~{
* @return FbveI4
* Returns the currentPage. /H')~!Yz
*/ 2Ok?@ZdjA{
publicint getCurrentPage(){ Bg-VCJI<
return currentPage; #c-b}.R
} MDk*j,5V
+%P t_
/** Vo%Yf9C
* @param currentPage TfJL+a0
* The currentPage to set. kLJlS,nh\r
*/ wG+=}1X
publicvoid setCurrentPage(int currentPage){ o]A XT8
this.currentPage = currentPage; yI8 SQ$w0y
} =f>HiF
B={/nC}G~
/** kl"
]Nw'C
* @return W9dYljnZ8i
* Returns the everyPage. q69H^E=
*/ Q uB+vL
publicint getEveryPage(){ Vt'L1Wr0v
return everyPage; @rF/]UJ
} MEEAQd<*
RcQ>eZHl
/**
G+U3wF],
* @param everyPage !2z!8kI
* The everyPage to set. l]H0g[
*/ ``!G I'^
publicvoid setEveryPage(int everyPage){ QZ&4:K+{
this.everyPage = everyPage; YgEM:'1f
} ?w*yW;V`
yO=p3PV d
/** <;%0T
xK|U
* @return E/ijvuO
* Returns the hasNextPage. rj 3YTu`
*/ 4.8nY\_WF
publicboolean getHasNextPage(){ P*YK9Hl<
return hasNextPage; \m f*ge\
} "A;s56 }'&
2JVxzj<~`
/** :j@8L.<U
* @param hasNextPage l7z6i*R
* The hasNextPage to set. atyu/+U'}
*/ 1Y#HcW&
publicvoid setHasNextPage(boolean hasNextPage){ SG:bM7*1'
this.hasNextPage = hasNextPage; {b1UX9y
} "}@i+oS
FI8k;4|V
/** n$4|PO$X
* @return <c+K3P'3?
* Returns the hasPrePage. X8b|]Nr
*/ [SkKz>rC
publicboolean getHasPrePage(){ qgx?"$ Z
return hasPrePage; 0 " y%9
} >Q=Ukn;k
d8E,o7$m
/** |g<* Rk0
* @param hasPrePage i?;R}%~
* The hasPrePage to set. {^J!<k,R\;
*/ ]dG\j^e|
publicvoid setHasPrePage(boolean hasPrePage){ z1vw'VT>
this.hasPrePage = hasPrePage; Ql &0O27
} `4V"s-T'
\vCGU>UY
/** DI,K(_@G
* @return Returns the totalPage. XX2h(-
* h0Ee?=
*/ EY=FDl V
publicint getTotalPage(){ 7)^:8I(
return totalPage; i)8N(HN
} \5TxE
FW#P*}#
/** cwe1^SJ6y
* @param totalPage vc8?I."?
* The totalPage to set. W8]V
*/ PK4`5uT
publicvoid setTotalPage(int totalPage){ 'eyJS`
this.totalPage = totalPage; ? gSSli[
} G 4qy*.
&Jy)U
} [
]^X`R
FRZs[\I|iT
g$FEEDF
{U"^UuU]
Qf
xH9_
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 d"ZU y!a
;Lo&}U3F,!
个PageUtil,负责对Page对象进行构造: HI`q1m.
java代码: dlD ki.
ufrqsv]=
Bu3T/m
/*Created on 2005-4-14*/ `#Kx|x6
package org.flyware.util.page; ^aF8wbuZ
\?Mf _
import org.apache.commons.logging.Log; l?8)6z#Zl
import org.apache.commons.logging.LogFactory; f:wd&V
c0ez/q1S
/** v+=k-;-
* @author Joa e;VIL 2|
* Kesy2mE
*/ s+Q;pRZW{
publicclass PageUtil { " xR[mJ@U
*hdC?m._
privatestaticfinal Log logger = LogFactory.getLog <7XT\?%F
,*Z.
(PageUtil.class); HjA_g0u
p'f%%#I
/** ys'T~Cs
* Use the origin page to create a new page @hif$
* @param page LA%bq_>f
* @param totalRecords VK:8 Nk_y
* @return --fFpM3EvS
*/ 1J}8sG2`
publicstatic Page createPage(Page page, int y(a!YicA?
eV7u*d?
totalRecords){ ;%!B[+ut"
return createPage(page.getEveryPage(), wO.iKX;
Q@-ovuxi
page.getCurrentPage(), totalRecords); XK
ApLz
} >cN~U3
h}L}[
/** P"3*lk+w
* the basic page utils not including exception P0Z!?`e=M
Zy0aJN>
handler +4qU>
* @param everyPage ZA(T
* @param currentPage :I1_X
* @param totalRecords \or G63T:
* @return page .*YD&(
*/ ?okx<'"[
publicstatic Page createPage(int everyPage, int jS<_ )
tPfFqqT
currentPage, int totalRecords){ ]zfG~^.
everyPage = getEveryPage(everyPage); 8K"+,s(%R
currentPage = getCurrentPage(currentPage); bKDA!R2
int beginIndex = getBeginIndex(everyPage, 89~ =eY
(% _n!ip^
currentPage); f)Xr!7
int totalPage = getTotalPage(everyPage, <F=9*.@D
1HT_
totalRecords); E?)656F[
boolean hasNextPage = hasNextPage(currentPage, mQ~:Y
W# US#<9Y
totalPage); Te,$M3|
boolean hasPrePage = hasPrePage(currentPage); ;GGK`V
'gso'&Uaj
returnnew Page(hasPrePage, hasNextPage, :dI\z]Y(
everyPage, totalPage, CC^E_j T
currentPage, %^]?5a!
As&vFt P
beginIndex); ++-{]wB3=.
} w
ej[+y-
%A/_5;PZ/
privatestaticint getEveryPage(int everyPage){ 1|r,dE2k9
return everyPage == 0 ? 10 : everyPage; sTRJ:fR
} @Xp~2@I=ls
3AcD,,M>>
privatestaticint getCurrentPage(int currentPage){ eqAW+Ptx
return currentPage == 0 ? 1 : currentPage; zDTv\3rZ4X
} xdvh-%A4
&>g'$a<[
privatestaticint getBeginIndex(int everyPage, int 0k,-; j,
bM,1 f/^
currentPage){ 2";SJF'5\
return(currentPage - 1) * everyPage; a2 +~;{?g
} J% H;%ROx
(la[KqqCO
privatestaticint getTotalPage(int everyPage, int p[AO'
xx
>slm$~rv
totalRecords){ o=J9
int totalPage = 0; }J:+{4Yn
5N[9
vW
if(totalRecords % everyPage == 0) Z;l`YK^-
totalPage = totalRecords / everyPage; Ev"|FTI/
else \55VqGyxu9
totalPage = totalRecords / everyPage + 1 ; Vr[czfROz'
_nh[(F<hz
return totalPage; yp.[HMRD
} v"& pQ
j=?'4sF
privatestaticboolean hasPrePage(int currentPage){ SMH<'F7i
return currentPage == 1 ? false : true; 2{Vcb
} M$4[)6Y
DV)3
privatestaticboolean hasNextPage(int currentPage, pCh2SQ(Q>
-s|8<A||"
int totalPage){ ]i<[d,
return currentPage == totalPage || totalPage == KnhoaBB
5q9s,r_
0 ? false : true; rKH:[lKm
} ew _-Eb
?<Wb@6kh`
w;UqEC V
} /H7&AiA