Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造
>/{@C
Uq[>_"}
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 X1,I
A8xvo/n$
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 i6R~`0>Q
^pxX]G]
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 RW|`nL
2SD`OABf#
。 [O$Wa:< 0x
dFRsm0T
分页支持类: FFl!\y*0z
?TM,Q
java代码: G"klu
W~6EEyD%
`
w=>I
package com.javaeye.common.util; 6,o~\8ia
//*fSF
import java.util.List; FI[A[*fi
xRJ\E }/7
publicclass PaginationSupport { ;>#wU'
#~#R-
publicfinalstaticint PAGESIZE = 30; ?@BTGUK"C
s&A}
h
privateint pageSize = PAGESIZE; }]e-{C}
5*E]ETo@R
privateList items; #eQJEajv5
?Q sQnQ
privateint totalCount; p%#<D9S
.|hf\1_J
privateint[] indexes = newint[0]; .)RzT9sg
$Oq^jUJ
privateint startIndex = 0; V:qSy#e
6tX q:
public PaginationSupport(List items, int ^]7}YF2|
j\,EO+ZQCv
totalCount){ ?!;7:VIE
setPageSize(PAGESIZE); >v:y?A,
setTotalCount(totalCount); &atuK*W>
setItems(items); H!?c\7adX
setStartIndex(0); 5XO;N s
} M1 :uJkO.
pczug-nB
public PaginationSupport(List items, int 4~y(`\0?4
`)`
n(B
totalCount, int startIndex){ h^?\xm|
setPageSize(PAGESIZE); [f)cL6AeF
setTotalCount(totalCount); *194{ ep
setItems(items); K&bzDzd `
setStartIndex(startIndex); '3_]Gu-D
} O/,aJCe
XaCX!Lr,
public PaginationSupport(List items, int W=vG$
hakKs.U|[
totalCount, int pageSize, int startIndex){ gGr^@=;YC
setPageSize(pageSize); PfreAEv,
setTotalCount(totalCount); K#EvFs`s;
setItems(items); M\sN@+
setStartIndex(startIndex); Rec6c&5_
} s}j{#xT
uxW~uEh
publicList getItems(){ I Y2)?"A
return items; `4(e
} yOphx07 (
)0ea+ib
publicvoid setItems(List items){ H$@`,{M629
this.items = items; }2<r,
} Zw*v
AmaT0tzJC
publicint getPageSize(){ n1~o1
return pageSize; ERpnuMb
} j/>$,
bLe<G
publicvoid setPageSize(int pageSize){ 33#0J$j7
this.pageSize = pageSize; 3AQZRul
} ^.#jF#u~
Qj,]N@7
publicint getTotalCount(){ q[HTnx
return totalCount; PE~G=1x3
} N$h{Yvbn
"SzdDY6
publicvoid setTotalCount(int totalCount){ MOsl_^c
if(totalCount > 0){ \]=7!RQ\
this.totalCount = totalCount; ,=tD8@a<
int count = totalCount / \=uKHNP?#
<1FC%f/
pageSize; %F!1
if(totalCount % pageSize > 0) Gs9:6
count++; v'VD0+3[H
indexes = newint[count]; &Rx{.9
for(int i = 0; i < count; i++){ +)j$|x~(A
indexes = pageSize * C!Rs^/
V>R8GSx
i; )6+eNsxMlC
} I 4,K43|
}else{ I3,= 0z
this.totalCount = 0; $4tWI O
} kB'Fkqwm
} uM_#
f2^r[kPX"
publicint[] getIndexes(){ TYJ:!
return indexes;
0BH_'ZW
} !eEHmRgg4
ZHGC6a!a
publicvoid setIndexes(int[] indexes){ Ttxqf:OMf
this.indexes = indexes; 7Garnd b
} MxGu>r
} p&&_?
publicint getStartIndex(){ blTo5NLX
return startIndex; NR -!VJQ
} 7N:Y?Hi\
F8;dKyT?q
publicvoid setStartIndex(int startIndex){ SzUpWy&
if(totalCount <= 0) >TQH|}|6(y
this.startIndex = 0; D9FJ 1~
elseif(startIndex >= totalCount) $)RNKMZC}A
this.startIndex = indexes _io+YzS
qEpi] =|
[indexes.length - 1]; &_"]5/"(
elseif(startIndex < 0) jBU4F~1y
this.startIndex = 0; [P 06lIO
else{ )('%R|$ /
this.startIndex = indexes pek%08VSEU
uO=aaKG
[startIndex / pageSize]; .h9l7
nZt
} -5T=:2M
} Sqo
:-
iVG-_RsKK
publicint getNextIndex(){ R,|d`)T
int nextIndex = getStartIndex() + 0#ClWynjRO
J41G&$j(
pageSize; ~ug=
{b
if(nextIndex >= totalCount) w9o^s5n
return getStartIndex(); L+'Fs
else 7oq[38zB
return nextIndex; # *TEq
} 1qf!DMcdZ
%-<'QYYP
publicint getPreviousIndex(){ !OT-b>*w
int previousIndex = getStartIndex() - T'LIrf
K^B%/T]d
pageSize; 7}vg.hmZ
if(previousIndex < 0) Rr!Y3)f;
return0; gS:A'@&
else V^\8BVw
return previousIndex; XK: 9r{r{
} e'=MQ,EWd
ET[kpL
} xCYE
B}o9r
q+[SbG&
WdnIp!
6<$Odd
抽象业务类 z^GDJddG
java代码: ;\[(- )f!=
i| ZceX/
2KQoy;
/** g7&9"
* Created on 2005-7-12 La@
+>
*/ .58qL-iC
package com.javaeye.common.business; 1ylk4@`
x ul]m*Z
import java.io.Serializable; [p2H=
import java.util.List; j~FD{%4N
J@OB`2?Zv
import org.hibernate.Criteria; RGK8'i/X
import org.hibernate.HibernateException; 0d3+0EN{
import org.hibernate.Session; l27\diKPJ
import org.hibernate.criterion.DetachedCriteria; 5bA)j!#)|X
import org.hibernate.criterion.Projections; ;/0 Q1-
import cW{1
Pz^_
%eJGte-
org.springframework.orm.hibernate3.HibernateCallback; /"?HZ% W
import LC})ciWa
+z9gbcx
org.springframework.orm.hibernate3.support.HibernateDaoS 9W8]8sUeG
$z$u{
upport; 7Su#Je]
r)T:7zy
import com.javaeye.common.util.PaginationSupport; iA,kX\nK
8&Myva
public abstract class AbstractManager extends Hk7q{`:N
(708H_
HibernateDaoSupport { LPwT^zV&N
NWd<+-pC6
privateboolean cacheQueries = false; Lgz$]Jbl8
z`Hy'{1
privateString queryCacheRegion; ]7Fs$y.
Y $u9%0q|?
publicvoid setCacheQueries(boolean \@>b;4Fb+N
Q.Aw2
cacheQueries){ 0oh]61gC
this.cacheQueries = cacheQueries; lKkN_ (/j
} fGv#s
X
I2a6w<b
publicvoid setQueryCacheRegion(String n$aA)"A #
NjE</Empb%
queryCacheRegion){ huudBc
A[
this.queryCacheRegion = [Px'\nVf
"Pl9 nE
queryCacheRegion; ZvGgmLN
} KvQ,;A
o&hIHfZri
publicvoid save(finalObject entity){ NWfAxkz{/
getHibernateTemplate().save(entity); "C?5f]T
} ~Z ~v
Wy]^Ub gW
publicvoid persist(finalObject entity){ y{9~&r
getHibernateTemplate().save(entity); gq"k<C0
} =V97;kq+v
0e[d=)XG
publicvoid update(finalObject entity){ ^+SkCO
getHibernateTemplate().update(entity); idRD![!UI
} >O/D!j|
U6[ang'l
publicvoid delete(finalObject entity){
LzDI0a.
getHibernateTemplate().delete(entity); %~NH0oFO
} YHV-|UNF
]ALc;lb-}
publicObject load(finalClass entity, $ XBAZ<"hd
+KEkmXZ
finalSerializable id){ ~Cc.cce5
return getHibernateTemplate().load (x;g/!:
WqrgRpM{
(entity, id); zHfP+(ah
} .7ayQp
Oq(VvS/
publicObject get(finalClass entity, rSP_:}
f DgD@YC D
finalSerializable id){ >yJ-4lgZ
return getHibernateTemplate().get l]2r)!Q7
jx_4B%kzq
(entity, id); V+wH?H=
} VyG4(Xva
17g^ALs
publicList findAll(finalClass entity){ c:M$m3Cs?
return getHibernateTemplate().find("from SKY*.IW/Z
%qsvtc`
" + entity.getName()); io4A>>W==/
} RBGlzk
Bz2'=~J
publicList findByNamedQuery(finalString (3,.3)%`
O';ew)tI
namedQuery){ Ek.&Sf$cd'
return getHibernateTemplate u3tZ[Y2 c
E^ h=!RW{
().findByNamedQuery(namedQuery); Y^ve:Z
} KT*:F(4`
M"^K0 .
publicList findByNamedQuery(finalString query, jkrx]`A{~
QBE@(2G}C
finalObject parameter){ R
-elIp
return getHibernateTemplate `m%dX'0E
_94s(~g:
().findByNamedQuery(query, parameter); &bC}3D
} XbvDi+R2A
q{4|Kpx@
publicList findByNamedQuery(finalString query, 1|y$~R.H
!DjT<dxf
finalObject[] parameters){ W 5DbFSgB
return getHibernateTemplate (
76{2
Aa(<L$e!`
().findByNamedQuery(query, parameters); ?KN:r E
} ^3I'y
UsY
,=w!vO5s
publicList find(finalString query){ nTnRGf\T
return getHibernateTemplate().find ?s{C//
} ~enEZ
(query); pz}mF D&[
} XdIah<F2
m3
IP7h'
publicList find(finalString query, finalObject {gkwOMW
b&t[S[P.V
parameter){ wa3F
return getHibernateTemplate().find ]if;A ) '
:k"rhI
(query, parameter); 6Dzs? P
} Kmry=`=A
DzDj)7
public PaginationSupport findPageByCriteria kO3`54
i-13~Dk
(final DetachedCriteria detachedCriteria){ 1Ii| {vR
return findPageByCriteria <?|6*2_=
V/H@vKN2
(detachedCriteria, PaginationSupport.PAGESIZE, 0); !k h{9I>M
} rF8
hr
~/c5hyTx
public PaginationSupport findPageByCriteria bXl8v
r@$B'CsLj
(final DetachedCriteria detachedCriteria, finalint .Vh*Z<9S4
0eA5zFU7
startIndex){ <d!6[,W;
return findPageByCriteria XtW_
6lU|mJ`M
(detachedCriteria, PaginationSupport.PAGESIZE, 8kbBz
Jk*QcEE=
startIndex); Y\8+}g;KR
} #<}kISV0
:@e\'~7sH
public PaginationSupport findPageByCriteria cs5ix"1A
\\iK'|5YG
(final DetachedCriteria detachedCriteria, finalint ^Jtl;Q
00qZw?%K
pageSize, z@`@I
finalint startIndex){ Z!)f*
return(PaginationSupport) NEg>lIu<~
^je528%H
getHibernateTemplate().execute(new HibernateCallback(){ [Pqn3I[
publicObject doInHibernate {c?ymkK
^6&_|f
(Session session)throws HibernateException { ;(`e^IVf
Criteria criteria = -#Jj-t_Fe
(olLB
detachedCriteria.getExecutableCriteria(session); i0i`k^bA
int totalCount = eEie?#Z/6
KT%{G8Y@M
((Integer) criteria.setProjection(Projections.rowCount .r*#OUC
.J:;_4x
()).uniqueResult()).intValue(); H\f/n`@,G
criteria.setProjection UC;=)
ywe5tU
(null); U[Nosh)hu\
List items = Wa{%0inZ
t}c v2S
criteria.setFirstResult(startIndex).setMaxResults z^9E;
~RCg.&[ou
(pageSize).list(); ,aYU$~o#
PaginationSupport ps = *CT.G'bQX
1zR/HT
new PaginationSupport(items, totalCount, pageSize, n8Q*
_?Z/
vQcUaPm\$
startIndex); ?}v}U^
return ps; M.t@@wq
} M(NH9EE
}, true); 8eN%sm
} wU.'_SBfB
BZ}`4W'
public List findAllByCriteria(final !2wETs?
+!G4tA$g
DetachedCriteria detachedCriteria){ ,Z?m`cx
return(List) getHibernateTemplate =J`gGDhGY-
6G$/NW=L
().execute(new HibernateCallback(){
22PGWSQ
publicObject doInHibernate 3m3
EXz
$>|?k$(x
(Session session)throws HibernateException { 8KZ$F>T]>
Criteria criteria = ?${V{=)*X'
C1n??Y[
detachedCriteria.getExecutableCriteria(session); j_(?=7Y3g
return criteria.list(); &Q<EfB
} \I:UC
%
}, true); |^>u<E5
} V;P1nL4L
}Z^FEd"y
public int getCountByCriteria(final QZ#3Bn%B5
MkkA{p
DetachedCriteria detachedCriteria){ RFhU#
Integer count = (Integer) Io2,% !D
JN-D/s
getHibernateTemplate().execute(new HibernateCallback(){
4$..r4@
publicObject doInHibernate LH bZjZ2
o.p+j
(Session session)throws HibernateException { gv`%Z8u(
Criteria criteria = eB)UXOu1
"$# $f
detachedCriteria.getExecutableCriteria(session); /DK*yS
return ="/R5fp
1hF2eNh
criteria.setProjection(Projections.rowCount |:~("rA+v
t)YFTO"Jj
()).uniqueResult(); :8GlyN<E
} jn0t-":
}, true); TXA. 6e
return count.intValue(); ?aP1
} Rc$=+K#
} 'SsPx&)l
Y+|L3'H
/%2:+w
a.5zdoH_
r0rJ.}!
DMy4"2
o
用户在web层构造查询条件detachedCriteria,和可选的 N:m@D][/sW
%:yHMEG]'
startIndex,调用业务bean的相应findByCriteria方法,返回一个 ]9bh+
ZE5-i@1
PaginationSupport的实例ps。 J"m%q\'
}dV9%0s!
ps.getItems()得到已分页好的结果集 }Bv30V2-(
ps.getIndexes()得到分页索引的数组 )Mm;9UA
ps.getTotalCount()得到总结果数 jM|YW*zNZ
ps.getStartIndex()当前分页索引 FCS5@l,'<
ps.getNextIndex()下一页索引 GQEI f$
ps.getPreviousIndex()上一页索引 ^sr:N5~z`
j TB<E=WC
]%vGC^
d()zW7}W
'@3a,pl
,_wm,
%zIl_/s
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 ^Yg|P&e(;
USHlb#*
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 KoxGxHz^Y3
wfU&{7yt
一下代码重构了。 dA_V:HP
VR5e CJ:i
我把原本我的做法也提供出来供大家讨论吧: {GG~E54&B
KV)Hywl`
首先,为了实现分页查询,我封装了一个Page类: JsWq._O{/
java代码: x):k#cu[L
1OfSq1G>v$
*'AS^2'
/*Created on 2005-4-14*/ ZmYSi$B
package org.flyware.util.page; {8*d;[X50
JYVxdvq1
/** kL2Zr
* @author Joa |R
&3/bEr
* 8f6;y1!;
*/ |4?}W ,
publicclass Page { 7B:ZdDj
N.Wdi
/** imply if the page has previous page */ S$kuhK>W!
privateboolean hasPrePage; +|}K5q \
#$vhC u<I
/** imply if the page has next page */ zvK5Zxl
privateboolean hasNextPage; W2W2WyPk
n.)[MC}
/** the number of every page */ j~,LoGuPh
privateint everyPage; CL@h!h554_
GJ^]ER-K
/** the total page number */ ~y-vKCp|
privateint totalPage; Uf2v$Jl+Yh
kT }'"
/** the number of current page */ 'Kso@St`o
privateint currentPage; #@\NdW\
0Z);.l^
/** the begin index of the records by the current "<jEI /
Jn
<^Q7N
query */ ,wb|?>Y
privateint beginIndex; >$S,>d_k`
"aCb;2Rs
UA!Gr3
/** The default constructor */ cLyuCaH>c
public Page(){ Wru
Fp
\gI:`>-
x
} >&TnTv?I
EDidg"0p
/** construct the page by everyPage M6hvi(!X2
* @param everyPage ?#EXG
* */ yL3<X w|
public Page(int everyPage){ 4(0t
GF
this.everyPage = everyPage; sc $QbO c
} r(in]7
)x:j5{>(
/** The whole constructor */ ,8"[ /@
public Page(boolean hasPrePage, boolean hasNextPage, ME10dr
ks#Z~6+3
!|:q@|-
%@
int everyPage, int totalPage, $@qs(Xwr
int currentPage, int beginIndex){ j.'"CU
this.hasPrePage = hasPrePage; $H:h(ia:
this.hasNextPage = hasNextPage; v.2Vg
this.everyPage = everyPage; ]zq_gV8k
this.totalPage = totalPage; ,S0~:c:)
this.currentPage = currentPage; vB YT)S
this.beginIndex = beginIndex; WKIiJ{@L
} 6[|<
^'I5]cRa
/** !4,xQ^
* @return ic]tUOC :
* Returns the beginIndex. 0G\myv
*/
T!xy^n]}
publicint getBeginIndex(){ #Xw[i
return beginIndex; 8!%"/*P$
} ^\kHEM|5v
P ~
pbx
/** [O+^eE6h
* @param beginIndex yqb<<4I
* The beginIndex to set. zcWxyLifl0
*/ e, 0I~:
publicvoid setBeginIndex(int beginIndex){ ZFuJ2 :
this.beginIndex = beginIndex; wYMX1=
} @gjdyz
.QQI~p0:
/** RowiSW
* @return ^t
ldm7{_
* Returns the currentPage. RrpFi'R
*/ :;WDPRx
publicint getCurrentPage(){ k\<Ln
w
return currentPage; LLY;IUK!R
} J+NK+,_*M
^`MDP`M;
/** Hpg;?xAT
* @param currentPage MVd
3*
* The currentPage to set. C$ `Y[w
*/ NP'DuzC
publicvoid setCurrentPage(int currentPage){ 2\tjeg
this.currentPage = currentPage; XK-x*|
} b{>dOI*.}
Hf{%N'4
/** 4^ 6L ])y
* @return
G5f57F
* Returns the everyPage. VX[!Vh
*/ B]F7t4Y!
publicint getEveryPage(){ *9(1:N;#
return everyPage; X3O$Sd(D
} W*`6ero
ld?.o/
/** Hll}8d6[
* @param everyPage ^tcBxDC"]
* The everyPage to set. 2I7`
*/ 9?$!=4
publicvoid setEveryPage(int everyPage){ kK|+W,
this.everyPage = everyPage; <u wCP4E
} 1 ZFSz{
.{Oq)^!ot
/** T@Z{KV"S
* @return %\&dFwb
* Returns the hasNextPage. wu&7#![,
*/ VVl-cU
publicboolean getHasNextPage(){ JW'acD
return hasNextPage; ZUW>{'[K
} beZ| i 1:
yLOLv6g~e
/** }l!_m.#e
* @param hasNextPage 7!nAWlQ&-E
* The hasNextPage to set. 695ppiKU
*/ *7ro [
publicvoid setHasNextPage(boolean hasNextPage){ >{Z=cv/6o
this.hasNextPage = hasNextPage; eJp-s" %
} }8#Czo jt
v ed
Qwzh
/** M[_I16s
* @return )6+W6:
* Returns the hasPrePage. 3y ,?>-
*/ mP[u[|]
publicboolean getHasPrePage(){ E/']M~Q
return hasPrePage; V7_??L%Ct`
} cpnwx1q@
:zRboqe(cc
/** nB0ol-<
* @param hasPrePage {2@96o2}
* The hasPrePage to set. BG=_i#V
*/ .p>8oOp
publicvoid setHasPrePage(boolean hasPrePage){ =LnAMl#9
this.hasPrePage = hasPrePage; ht9b=1wd%s
}
&_j4q
mu sxX58%
/** vrbh+
* @return Returns the totalPage. @CF4:NNHw
* ;xwQzu%M>5
*/ PM7/fv*,
publicint getTotalPage(){ a"0~_=
return totalPage; [=+/
} >`'9V|1
C<>.*wlp=
/** idy:Jei}
* @param totalPage 9l]IE,u
* The totalPage to set. ,qB081hPG
*/ gBu4`M
publicvoid setTotalPage(int totalPage){ ,RQ-w2j?
this.totalPage = totalPage; )K~nZLULY
} ,-)1)R\.
G2D<LRWt4
} MzD0F#Y
B!@0(A
za7wNe(s
PAkW[;GSDh
=P{RHhWy;
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 {'!~j!1'j
BL67sva;
个PageUtil,负责对Page对象进行构造: 6EY4@0%A
java代码: x]Ef}g
uE(w$2Wi
WM26-nR
/*Created on 2005-4-14*/ x5ia<V>=d
package org.flyware.util.page; uk,f}Xc
7~'@m(9e
import org.apache.commons.logging.Log; ?L^ Gu ]y
import org.apache.commons.logging.LogFactory; &kvVMnok
?3#X5WT
/** 8@-US ,|
* @author Joa EcU9Tm`h
* V 6F,X`7
*/ 0W> ",2|z
publicclass PageUtil { <vs.Ucxx
T[~X~dqwn"
privatestaticfinal Log logger = LogFactory.getLog #LiC@>
lxZXz JkqZ
(PageUtil.class); UWI5/R
I8y\D,
/** 8J} J;Ga
* Use the origin page to create a new page c{~*\&
* @param page *3|KbCX
* @param totalRecords sZc<h]L(g
* @return 4y'REC
*/ eIJQ|p<v
publicstatic Page createPage(Page page, int rgr> ;
OR3TRa XD
totalRecords){ "2mVW_k
return createPage(page.getEveryPage(), mYCGGwD
8g\.1<~
page.getCurrentPage(), totalRecords); vsK>?5{C-
} YpJzRm{Ra
y^ohns5{
/** Z,*VRuA
* the basic page utils not including exception HO"(eDW6z
J#\/znT
handler q07>FW R
* @param everyPage !T}`h'
* @param currentPage @B+];lr/-
* @param totalRecords ]BA8[2=m
* @return page F)C8LH
*/ >QYxX<W
publicstatic Page createPage(int everyPage, int "xWC49
=Oy,SX
currentPage, int totalRecords){ 2l9_$evK~
everyPage = getEveryPage(everyPage); k,2%%m
currentPage = getCurrentPage(currentPage); _ v-sb(*
J
int beginIndex = getBeginIndex(everyPage,
FkH4|}1
+ EM '-
currentPage); BzDS
int totalPage = getTotalPage(everyPage, GE>&fG
9rhz#w
totalRecords); W*P/~U=
boolean hasNextPage = hasNextPage(currentPage, $lvpBs
6uD Nqq
totalPage); \eN }V
boolean hasPrePage = hasPrePage(currentPage); ;lGjj9we>
44!bwXz8
returnnew Page(hasPrePage, hasNextPage, [xHK^JP 8F
everyPage, totalPage, xSw ^v6!2
currentPage, &TKB8vx=#
IyMKV$"
beginIndex); #U^@)g6
} 5WEF^1
7uYJ_R
privatestaticint getEveryPage(int everyPage){ Y#KgaZ7N
return everyPage == 0 ? 10 : everyPage; \MnlRBUM,
} vuHqOAFNs
W}Z'zU?[
privatestaticint getCurrentPage(int currentPage){ vFQ'sd]C
return currentPage == 0 ? 1 : currentPage; U\+o$mU^
} %|UCs8EFm
1%H]2@
privatestaticint getBeginIndex(int everyPage, int J@52<.>6
g^=p)h3
currentPage){ <`BUk< uf#
return(currentPage - 1) * everyPage; TeQpmhN
} k<m{Wp;-
JBp^@j{_
privatestaticint getTotalPage(int everyPage, int "Q^Ck7
O",:0<
totalRecords){ LEG
y1L
int totalPage = 0; U5odSR$
K^EW*6vB8O
if(totalRecords % everyPage == 0) +[ !K
totalPage = totalRecords / everyPage; 4;x{@Ln
else 9%pq+?u9
totalPage = totalRecords / everyPage + 1 ; 2]hQ56Yv3
Fc{hzqaP8
return totalPage; K%O%#Kk
} BZe x
)bXiw3'A
privatestaticboolean hasPrePage(int currentPage){ (i1]+.
return currentPage == 1 ? false : true; $)mK]57
} `J#(ffo-
voEg[Gg4%I
privatestaticboolean hasNextPage(int currentPage, ,!Gw40t
4u0=/pfi[
int totalPage){ %N04k8z
return currentPage == totalPage || totalPage == ycTX\.KV
'(r/@%=U
0 ? false : true; f%;8]a9
} l~.ae,|7
J4&d6[40
_SY4Qs`d
} -A^18r
q#$Al
07`hQn)Gc
UiO%y
nep0<&