Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 R("g ]
*{8<4CVv
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 qP{S!Z(
C` ?6`$Y
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 k~Qb"6n2
u;\:#721
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 mX3~rK>@~
vp@ %wxl!:
。 @RGVcfCG)
Y?W"@awE"\
分页支持类: PPSf8-MLW
.|[ZEXq
java代码: EN/>f=%
@ c,KK~{
B f33%I~
package com.javaeye.common.util; '2mR;APz
WBD e`
import java.util.List; Rp$t;=SMD
MF:]J
publicclass PaginationSupport { VN`T:!&
=!u9]3)
publicfinalstaticint PAGESIZE = 30; Rj 2N+59rg
}#}IR5`=E
privateint pageSize = PAGESIZE; q$FwO"dC
AoB~ZWq
privateList items; to{/@^ D
eQ_dO]Q
privateint totalCount; sf )ojq6s
2<HG=iSf
privateint[] indexes = newint[0]; Z0*Lm+d9z
y57]q#k
privateint startIndex = 0; H }w"4s
ReE-I/n8f
public PaginationSupport(List items, int zK`fX
4np,"^c
totalCount){ #RAez:BI
setPageSize(PAGESIZE); V^fSrW]
setTotalCount(totalCount); 7KIOI,qb6
setItems(items); L".Qf|b*
setStartIndex(0); td!WgL,m
} V
;Kzh$^rk
?mKj+Bk2
public PaginationSupport(List items, int *#+e_)d
3]xe7F'`
totalCount, int startIndex){ <Wc98m
setPageSize(PAGESIZE); k$
k/U
setTotalCount(totalCount); 4/YEkD
setItems(items); / *3[9,
setStartIndex(startIndex); G{$(t\>8
} :K&>
@8WG
public PaginationSupport(List items, int i(DoAfYf/q
<cu? g
totalCount, int pageSize, int startIndex){ Q79& Q04XN
setPageSize(pageSize); \Y.&G,?
setTotalCount(totalCount); 5sJi- ^
setItems(items); Pw:(X0@
setStartIndex(startIndex); Hik8u!#P
} <[{Ty+
BG:l Zj'I
publicList getItems(){ 6&/H
XqP
return items; p;Ezmz
} v~^c-]4I
.b]
32Ww
publicvoid setItems(List items){ W+k`^A|@
this.items = items; PZ5BtDm
} 7tWt3
8BZTHlUB
publicint getPageSize(){ 9F+i+(\,b
return pageSize; P|}~=2J
} V_Z ~$
MgJiJ0y
publicvoid setPageSize(int pageSize){ Mda~@)7$
this.pageSize = pageSize; MQ;c'?!5[!
} +C3IP
VB6EM|bphl
publicint getTotalCount(){ `:WVp~fn
return totalCount; n{vp&
} xb#M{EE-.
Co6ghH7T
publicvoid setTotalCount(int totalCount){ weQC9e~d{-
if(totalCount > 0){ I)$` @.
this.totalCount = totalCount; e ='bc7$
int count = totalCount / XVXiiQ^
BLxtS
pageSize; gQy{OU
if(totalCount % pageSize > 0) x`N_tWZ
count++; jR~2mf!h*e
indexes = newint[count]; S"?py=7
for(int i = 0; i < count; i++){ p x;X}Cd
indexes = pageSize * A:Y]<jt
nLK%5C
i; jxA`RSY
} V0hC[Ilr
}else{ cgKK(-$ny
this.totalCount = 0; ca>6r`
} c +Pg[1-
} `>:ozN#)\
7{=<_
publicint[] getIndexes(){ Kj[X1X5
return indexes; hpJ[VKe
} O[+![[N2
KQsS)ju
publicvoid setIndexes(int[] indexes){ 9( ;lcOz
this.indexes = indexes; a<+Qw'
} $<^4G
]'Y
vI!r
publicint getStartIndex(){ 0gNwC~IA8
return startIndex; I}oxwc
} [\N,ow,n
b
62 o
publicvoid setStartIndex(int startIndex){ .<JD'%?"
if(totalCount <= 0) j^A0[:2
this.startIndex = 0; gE8=#%1<
elseif(startIndex >= totalCount) S-[]z*
this.startIndex = indexes w
<zO
x7$U
[indexes.length - 1]; $q#|B3N%
elseif(startIndex < 0) v8!
1"FYL
this.startIndex = 0; X$,#OR
else{ 2YvhzL[um
this.startIndex = indexes 0Eq.l <
9k.LV/Y
[startIndex / pageSize]; @+A`n21,O
} V^Wo%e7#u[
} Alh"G6
b6=.6?H@4f
publicint getNextIndex(){ %XGwQB$zk8
int nextIndex = getStartIndex() + IQ$l!)
Nx4_Oc^hY
pageSize; PN0l#[{EN
if(nextIndex >= totalCount) }vBk,ED
return getStartIndex(); .Ajs0 T2
else ^T\JFzV
return nextIndex; Ikiv+Fq(
} k>#,1GbNZy
,lm.~% }P*
publicint getPreviousIndex(){ e#`wshtN:
int previousIndex = getStartIndex() - T1m097
!Dp4uE:Pq
pageSize; 061@N=p8
if(previousIndex < 0) nIVPh99
return0; _$/(l4\T[
else k^gnOU ;
return previousIndex; NC::;e
} MNip;S_j
+s&+G![
} w2y{3O"p=
KfJF9!U*?
mMO:m8W
_QCspPT' c
抽象业务类 ,vP9oY[n
java代码: P(fTlrb
E@QsuS2&
}8 A]
/** 88Yp0T<1
* Created on 2005-7-12 %w7J0p
*/ " ^~f.N
package com.javaeye.common.business; (PU0\bGA
K'N`rx.7
import java.io.Serializable; |;{^Mci%
import java.util.List; h
&9Ld:p
/yn1MW[.
import org.hibernate.Criteria; y6Xfddd61
import org.hibernate.HibernateException; FCQI fJ#
import org.hibernate.Session; 8^ju=
import org.hibernate.criterion.DetachedCriteria; w#k'RuOw5
import org.hibernate.criterion.Projections; ~$w-I\Q!
import R(@7$
4VLrl8$K
org.springframework.orm.hibernate3.HibernateCallback; cF_`m
import S:{hgi,T*
[r_,BH\nu
org.springframework.orm.hibernate3.support.HibernateDaoS VkFTIyt
Lu}oC2
upport; ~=(?Z2UDA_
7(na?Z$
import com.javaeye.common.util.PaginationSupport; +jzpB*@
\Oh9)X:I
public abstract class AbstractManager extends 0rY<CV;fZ
9ZUG~d7_
HibernateDaoSupport { JE,R[` &
2Xk(3J!!'a
privateboolean cacheQueries = false; Te$/[`<U
r$k
*:A$%
privateString queryCacheRegion; q{yz]H,
&r~~1BnpHm
publicvoid setCacheQueries(boolean $d,30hK
B V+"uF
cacheQueries){ ~M(K{6R
this.cacheQueries = cacheQueries; [xO^\oQa=c
} x"8(j8e
mC>7l7%
publicvoid setQueryCacheRegion(String 1_7x'5GdA
TjD`<k
queryCacheRegion){ %j2YCV7
this.queryCacheRegion = eK/[jxNO
U QXT&w
queryCacheRegion; .X_k[l 9
} .g(yTA
e<~uU9
lg1
publicvoid save(finalObject entity){ }`5%2iG
getHibernateTemplate().save(entity); fAUtqkB
} (}4tj4d
\dIIZSN
publicvoid persist(finalObject entity){ "h$A. S
getHibernateTemplate().save(entity); Bq79Ev
.-
} ptb t
%?X~,
publicvoid update(finalObject entity){ zJ|Ek"R.
getHibernateTemplate().update(entity); Va(R*38k
} =zqOkC
h$
PS`)6yn{_
publicvoid delete(finalObject entity){ ?h1]s&^|2
getHibernateTemplate().delete(entity); hP3I_I[qF}
} 5{,/m"-
zhHQJcQ.
publicObject load(finalClass entity, `u %//m_(
!fzqpl\ze
finalSerializable id){ egx(N
<
return getHibernateTemplate().load e_k1pox]l
fcnbPO0M
(entity, id); a 3R#Bg(
} u;!CQ w/
7k+UCiu>
publicObject get(finalClass entity, lsJ'dS
C<qJnB:B9
finalSerializable id){ uDH)0#
return getHibernateTemplate().get |
2p\M?@
sl |S9Ix
(entity, id); @8n0GCv
} MI',E?#yB
=*8"ci$
publicList findAll(finalClass entity){ !Q cgTW)T
return getHibernateTemplate().find("from lSXhHy
}! zjj\g^
" + entity.getName()); kJJQcjAP:
} d@,q6R}!MP
JXUO?9
publicList findByNamedQuery(finalString 9dqD(S#C;"
2=F_<Jh|+
namedQuery){ I?bL4u$\
return getHibernateTemplate %b@>riR(y
LO#{
().findByNamedQuery(namedQuery); -aKk#fd
} mUcHsCszH
<0v'IHlZ8
publicList findByNamedQuery(finalString query, .N/4+[2p(
/~gM,*
finalObject parameter){ <pK;D
return getHibernateTemplate gJvc<]W8!
2kCJqyWy
().findByNamedQuery(query, parameter); 6K?+ad Klc
} &/=xtO/Z{
5>h2WL
publicList findByNamedQuery(finalString query, '["Y;/>
=wS:)%u
finalObject[] parameters){ ]vKxgfF
return getHibernateTemplate 7F}I.,<W
rrbCg(
().findByNamedQuery(query, parameters); -W+dsZ Sv8
} {oBVb{<
q.Z0Q
publicList find(finalString query){ NmOQ7T
return getHibernateTemplate().find I0Wn?Qq=@
Haq23K
(query); zx=A3I%7 A
} 1REq.%/=
Gp32\^H|<
publicList find(finalString query, finalObject R`TM@aaS:
_@?]!J[
parameter){ w:z_EV!&
return getHibernateTemplate().find r'xa'6&
-J? df
(query, parameter); f4@Dn
>BJ
} {a%T <WW
&S3szhe
public PaginationSupport findPageByCriteria @H7dQ,%
`I6)e{5t
(final DetachedCriteria detachedCriteria){ !X[lNtO
return findPageByCriteria IO v4Zx<)
b-~`A;pr
(detachedCriteria, PaginationSupport.PAGESIZE, 0); :4(7W[r6
} e5veq!*C?
yKDg
~zsh
public PaginationSupport findPageByCriteria 2Q1* Xq{
.JQR5R |Q
(final DetachedCriteria detachedCriteria, finalint 3bE^[V8/
VMHiuBz:
startIndex){ $JX_e
return findPageByCriteria %,6@Uu#%6
N_/&xHw
(detachedCriteria, PaginationSupport.PAGESIZE, H~x0-q<8
I>9rfmmTI
startIndex); ;Y K^&!N
} dQ;rO$co
M}38uxP
public PaginationSupport findPageByCriteria ^@{'! N
^0X86
(final DetachedCriteria detachedCriteria, finalint ] +Gi~
[DjdR_9*I
pageSize, ;9u6]%hQTX
finalint startIndex){ W]6Y
buP:
return(PaginationSupport) Yng9_w9Y
b3Y9
getHibernateTemplate().execute(new HibernateCallback(){ L$7v;R3
publicObject doInHibernate 0{A VH/S
;h
(Session session)throws HibernateException { BMFpkK9|
Criteria criteria = I"<~!krt%
ps<JKHC/c
detachedCriteria.getExecutableCriteria(session); |mmIu_
int totalCount = ?P"ht
m;Sw`nw?
((Integer) criteria.setProjection(Projections.rowCount -R6z/P(}
?*}V>h 8m)
()).uniqueResult()).intValue(); VZ_4B *D
criteria.setProjection J5|Dduv
o^DiIoor
(null); yDy3;*lE
List items = 27,WP-qie
0 w@~ynW[
criteria.setFirstResult(startIndex).setMaxResults -*?a*q/#nQ
,$}v_-:[l
(pageSize).list(); $lV0TCgba8
PaginationSupport ps = \>,{)j q;
7F+w o
new PaginationSupport(items, totalCount, pageSize, = @ph
m0=CD
startIndex); E\RQm}Z09
return ps; n:k~\-&WJ
} [!bTko>rSB
}, true); I?F^c6M=
} 3~Ipcr
B
%li'j|
public List findAllByCriteria(final <([o4%
u!{P{C
DetachedCriteria detachedCriteria){ nM}X1^PiK"
return(List) getHibernateTemplate #C!8a
#kma)_X
().execute(new HibernateCallback(){ V3I&0P k
publicObject doInHibernate O a-ZeCq
9"MC<
(Session session)throws HibernateException { E;-R<X5n
Criteria criteria = ^dqyX(
p|AIz3
detachedCriteria.getExecutableCriteria(session); ! daXF&q
return criteria.list();
]9A9q<lZ
} ]^aece
t
}, true); -V4@BKI8
} o*r\&!NIw
v?d~H`L
public int getCountByCriteria(final JNX7]j\
$ n
7dIE
DetachedCriteria detachedCriteria){ $i~DUT(
Integer count = (Integer) W W==
WnHf)(J`"
getHibernateTemplate().execute(new HibernateCallback(){ `wk#5[Y_
publicObject doInHibernate fdp/cwd
\7("bB=
(Session session)throws HibernateException { q]
,&$d^@
Criteria criteria = 3G5i+9Nt.L
Ij{{Z;o3
detachedCriteria.getExecutableCriteria(session); WERK JA
return X}Fc0Oo
)v
['p
criteria.setProjection(Projections.rowCount uCUQxFp
Hyq|%\A
()).uniqueResult(); C Q3;NY=o
} s*(Y<Ap7d
}, true); *qKwu?]?>
return count.intValue(); SV8rZWJ
} M}M.
} qw"`NubX
:5h&f
l'-iIbKX
ogjm6;
dos$d3B4
rD<@$KpP
用户在web层构造查询条件detachedCriteria,和可选的 gD&%$&q
zy5@K)
startIndex,调用业务bean的相应findByCriteria方法,返回一个 e2/&X;2
h r t\
PaginationSupport的实例ps。 [/5>)HK} C
`iQyKZS/+
ps.getItems()得到已分页好的结果集 wIi(p5*
ps.getIndexes()得到分页索引的数组 m<"1*d~
ps.getTotalCount()得到总结果数 `2S%l,>)#
ps.getStartIndex()当前分页索引 M,cI0i
ps.getNextIndex()下一页索引 eMWY[f3
ps.getPreviousIndex()上一页索引 mn
8A%6W
T6AFwo,Q
{WFYNEQ[
4*m\Zoq>
E})PNf;
C{Aeud #5
y>Nlj%XH
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 .;*0odxv
i,* DWD+
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 #lV&U
m,)Re8W-
一下代码重构了。 97$y,a{6
^B]M- XG
我把原本我的做法也提供出来供大家讨论吧: inR8m 4c]P
hQHV]xW
首先,为了实现分页查询,我封装了一个Page类: h2uO+qEsu
java代码: zif()i
Wq"pKI#x
ap_(/W
/*Created on 2005-4-14*/ CEI#x~Oq
package org.flyware.util.page; 8kO|t!?:U
b4,yLVi<T
/** tEf-BV;\y
* @author Joa 2R|2yAh
* 0/-[k
*/ R,6?1Z:J
publicclass Page { HHg=:>L z
MZ% P(5
/** imply if the page has previous page */ qK(?\t$
privateboolean hasPrePage; S}fIZ1
t{x&|%u
/** imply if the page has next page */ M{hA`
privateboolean hasNextPage; '4N[bRCn
(lt/ t
/** the number of every page */ !X
|Tf
privateint everyPage; %T1(3T{Li
]+fL6"OD/2
/** the total page number */ ){8^l0b
privateint totalPage; ~#) DJ
~-'nEA TE
/** the number of current page */ Yckl,g_
privateint currentPage; srg#<oH|{c
P#76ehR]K
/** the begin index of the records by the current Lo9+#ITyx
MF%9
query */ :)mV-(+o
privateint beginIndex; t'R&$;z@b
U'Vz
Z(.p=Wg
/** The default constructor */ mxDy!:@=
public Page(){ INcJXlv
U_oMR$/Z
} l_QpPo!a
|bB..b
/** construct the page by everyPage b\6w[52m
* @param everyPage MUVp8!*@
* */ <qv:7@
public Page(int everyPage){ M62V NYt
this.everyPage = everyPage; .VWH
} S@T>u,t'
+gK7`:v4O*
/** The whole constructor */ dHd{9ftyF
public Page(boolean hasPrePage, boolean hasNextPage, 5RZAs63t
<R_3;5J%
e$Md?Pq
int everyPage, int totalPage, H|75, !<
int currentPage, int beginIndex){ u9k##a4.E
this.hasPrePage = hasPrePage; 5?6ATP:[
this.hasNextPage = hasNextPage; -u)06C*39
this.everyPage = everyPage; |p3]9H
this.totalPage = totalPage; Rp9uUJ 6o
this.currentPage = currentPage; k6G23p[9
this.beginIndex = beginIndex; KHdj#3<AR
} 8Ck:c45v
$6ITa }o
/** K Rm4r
* @return >Li
~Og@
* Returns the beginIndex. r ZGA9duy
*/ =cqaA^HQL
publicint getBeginIndex(){ Mt-y{*6!k
return beginIndex; l
^$$d8
} &Sc0l/
"T#c#?
/** h`Y t4-Y
* @param beginIndex ?Yz.tg
* The beginIndex to set. IKAF%0[R|j
*/ cUS2*7h
publicvoid setBeginIndex(int beginIndex){ `(Ei-$
>U&
this.beginIndex = beginIndex; 6n;ew l}
} @(Q4
&X +@,!
/** sOVaQ&+y
* @return #N,\c@Gy
* Returns the currentPage. (Z6[a{}1i
*/ x$6-7<p
publicint getCurrentPage(){ X9zTz2 Fy
return currentPage; gy~M]u{
} :n>:*e@w%
r\_aux^z
/** 'VR5>r
* @param currentPage l.b
* The currentPage to set. .r]n<
*/ .hZ =8y9
publicvoid setCurrentPage(int currentPage){ =a7m^e7
this.currentPage = currentPage; aLhTaB-va
} zKgW9j<(
LF{ qI?LG
/** )pJ}o&J
* @return ?MO'WB9+JR
* Returns the everyPage. `4Nc(aUr
*/ `4l>%S8y:
publicint getEveryPage(){ [NaU\;w\
return everyPage; Gf]oRNP,N
} <1_?.gSi
Fv e,&~
/** QDxL y aL
* @param everyPage d v@6wp:
* The everyPage to set. 3/]J
i^+
*/ !A!zG)Ue<
publicvoid setEveryPage(int everyPage){ uA\A4
this.everyPage = everyPage; v }P~g
} cS{ l2}E
iHQFieZ.E
/** I%{U~
* @return KAEf4/
* Returns the hasNextPage. cF,u)+2b|6
*/ D {>,2hC
publicboolean getHasNextPage(){ 0Wv9K~F
return hasNextPage; Tz%l9aC
} ,3N8
ZFrK'BvbR
/** |!IJ/ivEgw
* @param hasNextPage d5sGt#
* The hasNextPage to set. BWw7o{d
*/ |%zhwDQ.
publicvoid setHasNextPage(boolean hasNextPage){ lWnV{/q\X
this.hasNextPage = hasNextPage; TSE(Kt
} C8NbxP
L\hPw{)
/** `1pri0!
* @return )?Jj#HtW
* Returns the hasPrePage. /?2yo{Fg
*/ %;^6W7
publicboolean getHasPrePage(){ f\/};a
return hasPrePage; 7_q"%xH
} Uf_w
o
a ,W5T8
/** <8-I:o]mF
* @param hasPrePage 9x{T"'
* The hasPrePage to set. 15 nc
*/ qxd{c8
publicvoid setHasPrePage(boolean hasPrePage){ Fi*6ud\n!
this.hasPrePage = hasPrePage; r@s, cCK9?
} ]l+2Ca:-[j
ub.pJJlC
/** yu}4L'e
* @return Returns the totalPage. ,{zvGZ|
* MQ,$'Y5~H
*/ | b@?]M
publicint getTotalPage(){ |Zkcs]8M!
return totalPage; P+"#xH
} F(SeD)ml
FcfN]!
/** /D)@y548~~
* @param totalPage /<|J \G21
* The totalPage to set. mc9$"
*/ <-FZ-asem
publicvoid setTotalPage(int totalPage){ kC LeHH|K
this.totalPage = totalPage; j|+B|
} ;O5NZa!.73
j7"E0Wc^o_
} 9(u2jbA
TD\QX2m
Lg9ktRKK
xx/DD%IZ
|k?,4
Pk
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 [C7:Yg7
.fQDj{
个PageUtil,负责对Page对象进行构造: )xTp7YnZ;
java代码: bh+R9~
ed\,FWR
'7_'s1
/*Created on 2005-4-14*/ _^&oNm1
package org.flyware.util.page; NK"y@)%0
QRt(?96
import org.apache.commons.logging.Log; }14.u&4
import org.apache.commons.logging.LogFactory; ]G|@F
:
>E)UmO{S
/** I<[(hPQUf
* @author Joa qn4Dm ^
* B=n]N+
*/ 14zo0ANM
publicclass PageUtil { fI}-?@
LJI&j \
privatestaticfinal Log logger = LogFactory.getLog I-;JDC?
qD`')=
(PageUtil.class); @6t3Us~/
Zsf<)Vx
/** /B}]{bcp$
* Use the origin page to create a new page Fb-NG.Z#
* @param page LM*9b
* @param totalRecords CR,
Y%0vQ
* @return a?+) K
*/ tK8\Ib J
publicstatic Page createPage(Page page, int E}"&?oY
%M'"%Yn@(y
totalRecords){ X}p4yR7'
return createPage(page.getEveryPage(), BAzqdG
^!kvgm<{$
page.getCurrentPage(), totalRecords); 1b_->_9
} z|pH>R?:
hpAIIgn
/** gvsS:4N"Nq
* the basic page utils not including exception ZE}m\|$
nNQ\rO
handler J!yc9Q
* @param everyPage aIqNNR
* @param currentPage dIM:U:c
* @param totalRecords 7&HP2r
* @return page HjV^6oP
*/ 1f}S:Z
publicstatic Page createPage(int everyPage, int q)@.f.
R`
X$@iM
currentPage, int totalRecords){ %81tVhg
everyPage = getEveryPage(everyPage); `_<AZ{&&
currentPage = getCurrentPage(currentPage); qTffh{q V
int beginIndex = getBeginIndex(everyPage, dB_\,%vAd
MTLcLmdO
currentPage); v,>q]!
|a
int totalPage = getTotalPage(everyPage, br'~SXl
RA\H?1;8C
totalRecords); e3(0L I
boolean hasNextPage = hasNextPage(currentPage, n,AN&BZ
^//N-?Fx
totalPage); u2Rmp4]
boolean hasPrePage = hasPrePage(currentPage); (:[><-h.
zIdQ^vm8Q
returnnew Page(hasPrePage, hasNextPage, -u8@ .
everyPage, totalPage, OgOu$.
currentPage, czHO)uQ?d`
G~m(&,:Mu
beginIndex); V8,$<1Fi;-
} pw(`+x]
kWoy%?|RRa
privatestaticint getEveryPage(int everyPage){ />f`X+d
return everyPage == 0 ? 10 : everyPage; Nwu#,f=X
} *b.>pY?2|
,eZ'pxt
privatestaticint getCurrentPage(int currentPage){ ]v9<^!
return currentPage == 0 ? 1 : currentPage; @aj"12
} 5_`.9@eh.
/&kTVuN"(
privatestaticint getBeginIndex(int everyPage, int ,'ndQ{\9
XeZv%` ?
currentPage){ q<;9!2py
return(currentPage - 1) * everyPage; ly^F?.e-
} yGN<.IP75
"CZ`hx1|^
privatestaticint getTotalPage(int everyPage, int `qfVgT=2
jj.yB#T
totalRecords){ >,~JQ%1
int totalPage = 0; xQmk2S`
y
Kvk;D ]$
if(totalRecords % everyPage == 0) if`/LJsa
totalPage = totalRecords / everyPage; :$94y{
else ^ro?.,c T
totalPage = totalRecords / everyPage + 1 ; S++}kR);
ZZeqOu7^
return totalPage; Z#oo8
} 9Y/c<gbY
HVk3F|]V
privatestaticboolean hasPrePage(int currentPage){ KUly"B
return currentPage == 1 ? false : true; wefQmRK
} 1p{\jCi,2
^&cI+xZ2Y
privatestaticboolean hasNextPage(int currentPage, mBnC]$<R
uF<F4m;
int totalPage){ @V<