Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 HX&G
k
01^+HEbm
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 mtunD;_Dek
VvSe`E*
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 $wBF'|eU
THl={,Rw`
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 jF r[T
{Jx-Zo>'
。 W3.(s~)o
*`g'*R
分页支持类: QO&{Jx.^[
;)'@kzi
java代码: <QcQ.b
$t{;- DpNB
[S<1|hk
s(
package com.javaeye.common.util; lH#C:n
=}1)/gcM
import java.util.List; <Mq vGXI
N3rq8Rk
publicclass PaginationSupport { ??u*qO:p
XGCjB{IV
publicfinalstaticint PAGESIZE = 30; pcrarj
;ifPqLkO
privateint pageSize = PAGESIZE; %p t^?
\fD)|
privateList items; :H(wW
FOS5?%J
privateint totalCount; \)'5V!B|s
dWK"Tkf\
privateint[] indexes = newint[0]; # X`t~Y'
JV`"kk/
privateint startIndex = 0; ]H$Trf:L
s,;7m
public PaginationSupport(List items, int 9
7U a,
dMlJ2\]u
totalCount){ &)ED||r,
setPageSize(PAGESIZE); iz-B)^8.
setTotalCount(totalCount); \'9(zb vz9
setItems(items); uy'qIq
setStartIndex(0); Q*54!^l+_r
} #i'wDvhol
vKFEA7
public PaginationSupport(List items, int [fZhfZ)<
rf=oH
}
totalCount, int startIndex){ N eC]MW
setPageSize(PAGESIZE); 9@^N*
E+
setTotalCount(totalCount); ;BmPP,
setItems(items); \`oP\|Z
setStartIndex(startIndex); Is[n7Q
} {TVQ]G%'b
Memb`3
public PaginationSupport(List items, int \f-@L;8#
<Eu/f`8
totalCount, int pageSize, int startIndex){ JH+uBZh6
setPageSize(pageSize); w/,A@fLL
setTotalCount(totalCount); pJo#7rxd6
setItems(items); [O@U@bD9
setStartIndex(startIndex); me
YSW
} U_C[9Z'P
O[j$n
publicList getItems(){ vtw97G
return items; ecMpU8}rR
} Ie7S'.Lmq
q${+I(b,
publicvoid setItems(List items){ n3_|#1Qu
this.items = items; %{B4M#~
} >uP1k.z'I
ufB9\yl{~
publicint getPageSize(){ rKkFflOVO
return pageSize; :/\KVz'fw}
} DCSmEy`.
otmyI;v 7<
publicvoid setPageSize(int pageSize){ qS/
'Kyp_
this.pageSize = pageSize; 4Dw|
I${O
} orZwm9#].
08_<G`r
publicint getTotalCount(){ X- P%^mK
return totalCount; R@
MXwP
} ?.g="{5X
*]>~lO1
publicvoid setTotalCount(int totalCount){ :4x&B^,53
if(totalCount > 0){ ow4|GLU^;
this.totalCount = totalCount; M Ui#3o\f
int count = totalCount / Sd *7jW?
Bp/k{7
pageSize; bo
&QKK
if(totalCount % pageSize > 0) [H=l#W@
count++; <Q@{6
indexes = newint[count]; ?OBB)hj
for(int i = 0; i < count; i++){ 0~Iq9}{*P
indexes = pageSize * G7k.YtW
bW2Msv/H
i; :a*F>S!
} LM*m>n*
}else{ :Tdl84
this.totalCount = 0; ,!bcm
} o@qI!?p&
} `^:
v+!
F>
b<t.yV
publicint[] getIndexes(){ *fp4u_:`
return indexes; J:dNV<A^
} fiQ/ &]|5
F-<c.0;6
publicvoid setIndexes(int[] indexes){ vpP8'f.
this.indexes = indexes; :auq#$B
} -ze@~Z@
NC%)SG \
publicint getStartIndex(){ OyATb{`'
return startIndex; yJ2A!id
} ,ik\MSS
s@K #M
publicvoid setStartIndex(int startIndex){ RJE<1!{
if(totalCount <= 0) [(iJj3s!
this.startIndex = 0; jTN!\RH9NF
elseif(startIndex >= totalCount) 6Z!OD(/e
this.startIndex = indexes 7!q.MOYm
ka<rlh<h
[indexes.length - 1]; }qN
elseif(startIndex < 0) t Z]b0T(e
this.startIndex = 0; ,%]xT>kH
else{ fH 0&Wc3yC
this.startIndex = indexes WZf}1.Mh*
`_E@cZ4
[startIndex / pageSize];
fYzZW
} ,,~|o3cfq
} Zrp9`~_g<!
2rqYm6
publicint getNextIndex(){ ePY69!pO5e
int nextIndex = getStartIndex() + ol@LLT_m
TN.&FDqC9
pageSize; N=;VS-
if(nextIndex >= totalCount) N Bpf
return getStartIndex(); iYz!:TxP
else p}
i5z_tS
return nextIndex; 5uD'Kd$H
} J-Wphc!m
3ms{gZbw
publicint getPreviousIndex(){ AjMx \'(C
int previousIndex = getStartIndex() - S*a_
K2ry@haN
pageSize; 8p.O rdp
if(previousIndex < 0) ek]CTUl*
return0; d1/uI^8>
else Q);^gV
return previousIndex; H:`[$
^
} h7[PU^ m
nX-%qc"
} B#K2?Et!t
<m+$@:cO
5#$5ct
av}pT)]\
抽象业务类 ]y<<zQ_fhY
java代码: zP#%ya:I
1}jwv_0lL
&g5+ |g (
/** ~
H $q
* Created on 2005-7-12 Uv(Uj3D
*/ ^6Y:9+
package com.javaeye.common.business; '>"-e'1m(
X5wYfN
import java.io.Serializable; 9 e0Oj3!B
import java.util.List; ompkDl\E
2B&|0&WI
import org.hibernate.Criteria; s(M8 Y
import org.hibernate.HibernateException; F<N{ x^
import org.hibernate.Session; 3NC-)S
import org.hibernate.criterion.DetachedCriteria; (f?&zQ!+
import org.hibernate.criterion.Projections; L\y>WR%s
import 2?nhkast#=
;c;PNihg
org.springframework.orm.hibernate3.HibernateCallback; A+bU{oLr
import < e7
[";<YR7iRN
org.springframework.orm.hibernate3.support.HibernateDaoS J;cTEB
V-%Am
upport; gTwxmp.,
{h *Pkn1
import com.javaeye.common.util.PaginationSupport; m@^!?/as
VJ$UpqVm
public abstract class AbstractManager extends Ee -yP[2
*
'}$$o1R
HibernateDaoSupport { Ae 3:"
xk$U+8K
privateboolean cacheQueries = false; cG~-OHU
A?/(W_Gt^M
privateString queryCacheRegion; 1VC:o]$
G!3d!$t
publicvoid setCacheQueries(boolean #jNN?,ZK
kZ3w 2=x3v
cacheQueries){ q+Cq&|4
?2
this.cacheQueries = cacheQueries; o$_,2$>mn
} TEi~X2u
]M5w!O!
publicvoid setQueryCacheRegion(String Q`7.-di
?O<D&CvB
queryCacheRegion){ cN\Fgbt
this.queryCacheRegion = {expx<+4F
QSq0{
queryCacheRegion; MUfhk)"
} @>sZ'M2mq
1O,<JrE+-
publicvoid save(finalObject entity){ V,qc[*_3
getHibernateTemplate().save(entity); k(.6K[b
} dCkk5&2n
PhOtSml0
publicvoid persist(finalObject entity){ y,QJy=?
getHibernateTemplate().save(entity); :gJ?3LwTf
} .y~vn[q N
;VAHgIpx;
publicvoid update(finalObject entity){ zwa%$U
getHibernateTemplate().update(entity); K6l{wyMb|
} ~t-!{F
Vy7o}z`
publicvoid delete(finalObject entity){ `gFE/i18
getHibernateTemplate().delete(entity); ~'<ca<Go|
} o)pso\;
>l3iAy!sZ
publicObject load(finalClass entity, j6_tFJT
=xq+r]g6
finalSerializable id){ n^2p jTkl
return getHibernateTemplate().load r1)@ 7Nt
BQfq]ti
(entity, id); t/TWLhx/
} +__PT4ps
^<VJ8jk<
publicObject get(finalClass entity, [|!A3o
K7CrRT3>6
finalSerializable id){ IDIok~B=e
return getHibernateTemplate().get M'D l_dx-
J@vL,C)E6
(entity, id); t5Oeb<REz
} O.% $oV
:]hNw1e
publicList findAll(finalClass entity){ #7}1W[y9}l
return getHibernateTemplate().find("from y:R!E *.L'
86AZ)UP2D
" + entity.getName()); 7}2Aq
} B<" `<oG@|
BrO" _
publicList findByNamedQuery(finalString Dxlpo!
?#
:|tWKA
namedQuery){ yHk}'YP
return getHibernateTemplate \6)]!$F6:
GZwz4=`
().findByNamedQuery(namedQuery); (6Tvu5*4U
} 6SGV}dAx
5v`[c+@F
publicList findByNamedQuery(finalString query, (:P-ef$]C
Gjh8>(
finalObject parameter){ <X b B;
return getHibernateTemplate mhDC1lXF
i=^!?
i
().findByNamedQuery(query, parameter); J )DFH~p
} 74p=uQ
5SNa~
kC&
publicList findByNamedQuery(finalString query, "A]Xe[oS
%qYiE!%&
finalObject[] parameters){ t3//
U#
return getHibernateTemplate P`xQL
!|#W,9
().findByNamedQuery(query, parameters); ?~p]Ey}~9
} c&GVIrJ
[ <,i}z
publicList find(finalString query){ Ump$N#
return getHibernateTemplate().find 4Nun-(q
Ok V*,n
(query); nR(v~_y[V
} nign"r
S[ln||{
publicList find(finalString query, finalObject wJ%;\06
o#~Lb9`@U
parameter){ };Oyv7D+b
return getHibernateTemplate().find +>}LT_
a7@':Rb n
(query, parameter);
<9bfX 91
} BtA_1RO
!ay:h
Iv
public PaginationSupport findPageByCriteria $&~moAl
X;&Iu{&=
(final DetachedCriteria detachedCriteria){ Kt#_Ln_6
return findPageByCriteria K!,T.qA&=
xk*&zAt
(detachedCriteria, PaginationSupport.PAGESIZE, 0); Mm)yabP
} [2$mo;E?
kfV}ta'^S
public PaginationSupport findPageByCriteria RH}i=
QJ,[K_
(final DetachedCriteria detachedCriteria, finalint BICG@
4^Y{ BS fF
startIndex){ 9]Fi2M
return findPageByCriteria ('k9X cTPP
akA7))Q
(detachedCriteria, PaginationSupport.PAGESIZE, xt&4]M
V
'L@kZ
startIndex); >I@VHl O
} 8g0VTY4$jP
X`6"^
xme
public PaginationSupport findPageByCriteria bEKh U\@=J
smUSR4VK
(final DetachedCriteria detachedCriteria, finalint ;=p3L<~c`K
sg8[TFX@Z
pageSize, Yu$QL@
finalint startIndex){ rez)$
return(PaginationSupport) ZXIw^!8@/
GoLK
95"]
getHibernateTemplate().execute(new HibernateCallback(){ V,h}l"
publicObject doInHibernate F)Iz:
3;RQ\{eM
(Session session)throws HibernateException { w^"IR
Criteria criteria = ZZn$N-
PU,%Y_xR
detachedCriteria.getExecutableCriteria(session); Mbp7%^E"A
int totalCount = 6CCm1F{`
iInWw"VbKe
((Integer) criteria.setProjection(Projections.rowCount "<"m}rE?Q
/%mT2
()).uniqueResult()).intValue(); e\em;GTy
criteria.setProjection |h?2~D!+d
byFO^pce
(null); .ht-*
List items = +Bf?3 5LP
&|<f|BMX
criteria.setFirstResult(startIndex).setMaxResults P8(hHuO
)n]"~I^
(pageSize).list(); u"uL,w
1-
PaginationSupport ps = ;I&XG
wFX9F3m
new PaginationSupport(items, totalCount, pageSize, f14^VTzP/#
1ysQvz
startIndex); 8t3m$<7
return ps; Z}TLk^_[
} dU#-;/}o
}, true); ^)wKS]BQ..
} V)5K/ U{
d:kn%L6k_
public List findAllByCriteria(final '4nJ*Xa
o{6q>Jm
DetachedCriteria detachedCriteria){ m8=n `XI
return(List) getHibernateTemplate 8qqN0"{,
>.6|\{*sG
().execute(new HibernateCallback(){ n1JtY75#,/
publicObject doInHibernate $&=xw _
7o0zny3?
(Session session)throws HibernateException { .L+XV y
Criteria criteria = n>?D-)g
>MGWN
detachedCriteria.getExecutableCriteria(session); fd4C8>*7G
return criteria.list(); g@37t @I
} {vGJ}q?Sd"
}, true); .%s
U)$bH
} hbOXR.0z
+Q[uq!<VJk
public int getCountByCriteria(final D8<C7
59O-"Sc[
DetachedCriteria detachedCriteria){ ni&|;"Nt-
Integer count = (Integer) ]q.%_
Km;}xke6
getHibernateTemplate().execute(new HibernateCallback(){ g"Y_!)X
publicObject doInHibernate At"$Cu!k
m/1FVC@*
(Session session)throws HibernateException {
v&|65[<
Criteria criteria = 0muC4
>;^/B R=
detachedCriteria.getExecutableCriteria(session); +?Ii=* 7n
return rNR7}o~ qo
W;'fAohr
criteria.setProjection(Projections.rowCount !JDr58
X58U>4a
()).uniqueResult(); `R$i|,9)
} 755,=U8'wi
}, true); dgjK\pH`h
return count.intValue(); 1>OlBp
} A<ds+0
} )A$"COM4
:YI5O/gsk?
x-m*p^}
kU[hB1D5
>`\.i,X.D
Qds<j{2
用户在web层构造查询条件detachedCriteria,和可选的 /[<F
f
n.&7lg^X
startIndex,调用业务bean的相应findByCriteria方法,返回一个 px<psR5
Cgx:6TRS
PaginationSupport的实例ps。 :QGkYJ
!?nO0Ao-$
ps.getItems()得到已分页好的结果集 2%sZaM
ps.getIndexes()得到分页索引的数组 !+%gJiu:
ps.getTotalCount()得到总结果数 NX&dJ
6a
ps.getStartIndex()当前分页索引 F:!6B b C
ps.getNextIndex()下一页索引 Y(g_h:lf,]
ps.getPreviousIndex()上一页索引 "pM>TMAE
w$:\!FImx
"[N2qJ}p
d}\]!x3t
2g=
6s
cXPpxRXBD
s<zN`&t
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 -qc'J<*^4
"E\vdhk
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 ]q1w@)]n}
EB}B75)x
一下代码重构了。 CPJ21^
ZaYiby@Ci
我把原本我的做法也提供出来供大家讨论吧: SE+hB
9^XZ|`
首先,为了实现分页查询,我封装了一个Page类: LP"g(D2'n
java代码: 98Vv K?
?>;aD
G'\[dwD,u
/*Created on 2005-4-14*/ -TF},V~
package org.flyware.util.page; )/jDt dI
TRi'l #m4
/** rWTaCU^qV
* @author Joa |Q/LC0?
* d_25]B(
*/ G`!,>n 3
publicclass Page { ?{ )'O+s
sE?%;uBb
/** imply if the page has previous page */ uOv<*Jld*
privateboolean hasPrePage; l ms^|?
Fqeqn[,
/** imply if the page has next page */ D`p2a eI
privateboolean hasNextPage; tx5bmF;b)
bo=H-d|
/** the number of every page */ !0l|[c4 e>
privateint everyPage; wO,qFY
ec!e
/** the total page number */ :zU4K=kR
privateint totalPage; BbX$R`f
I0F[Z\U
/** the number of current page */ E:9RskI
privateint currentPage; a?y ucA
"q?(rx;
/** the begin index of the records by the current u0wu\
+PYV-@q
query */ <sC(a7i1
privateint beginIndex; 791v>h
xQZOGq
vE[d& b[
/** The default constructor */ MEI&]qI
public Page(){ [\ku,yd%0
()|e
xWW
} YMw,C:a4
!\'w>y7
/** construct the page by everyPage Jj]<SWh
* @param everyPage >(2;(TbQm0
* */ H2],auBY
public Page(int everyPage){
2po8n_
this.everyPage = everyPage; Ge)G.> c
} J)g
+I
F42^Uoaz
/** The whole constructor */ i`i`Hu>
public Page(boolean hasPrePage, boolean hasNextPage, ~Xx}:@Ld
/*g0M2+OZo
:LuA6
int everyPage, int totalPage, 67/@J)z0%
int currentPage, int beginIndex){ p_xJKQS
this.hasPrePage = hasPrePage; BHpay
this.hasNextPage = hasNextPage; |+h x2?Nv
this.everyPage = everyPage; Y3|_&\v6
this.totalPage = totalPage; ~I")-2"B
this.currentPage = currentPage; p+Yy"wH:h{
this.beginIndex = beginIndex; [?6+ r
} \V~B+e
~&,S xQT
/** oJV dFE
* @return <OiH%:G/1
* Returns the beginIndex. |s#,^SJ0
*/ hAgrs[OFj
publicint getBeginIndex(){ FS7D
return beginIndex; &OvA[<qT
} 8I*yS#
pvWNiW:~k
/** = m|<~t
* @param beginIndex 6ZjUC1
* The beginIndex to set. k(`> (w
*/ :S`12*_g"
publicvoid setBeginIndex(int beginIndex){ )"Ujx`]4r
this.beginIndex = beginIndex; mJ8EiRSE
} 4[Ko|
{#=o4~u%;H
/** (Rs;+S
* @return a'q&[08
* Returns the currentPage. t%y
i3
*/ .'
v$PEy
publicint getCurrentPage(){ 8&hxU@T~
return currentPage; [+@T"2h2b
} 9qq6P!
ZRGe$HaU
/** E.B6u, Te
* @param currentPage Qp@}v7Due
* The currentPage to set. p=[I;U-#H
*/ n-?zH:]GG{
publicvoid setCurrentPage(int currentPage){ A(XX2f!i
this.currentPage = currentPage; ^]/V-!j
} >kuu\
Vo%ikR #
/** juWbd|ad"
* @return 1k%HGQM{
* Returns the everyPage. Ea[SS@'R
*/ .*?-j?U.
publicint getEveryPage(){ ~1Ffu x
return everyPage; ZlMS=<hgFx
} 6m:$RW
p`"Ic2xPJ
/** uowdzJ7
* @param everyPage IUG}Q7w5
* The everyPage to set. X2 <fS~m
*/ ;+3@S`2r
publicvoid setEveryPage(int everyPage){ /*6[Itm_h
this.everyPage = everyPage; A0ZU #"'/
} ASSe;+yp
X=jD^"-
/** ;wHyX)&X$
* @return ey:%Zy
[~
* Returns the hasNextPage. ##"
Hui
*/ bdBLfWe
publicboolean getHasNextPage(){ Nah\4-75&
return hasNextPage; +wGvYr
} 7 $Cv=8
fndH]Yp
/** Rx@0EPV
* @param hasNextPage (V}?y:)
* The hasNextPage to set. )ItW}1[I
*/ nx!+:P ,
publicvoid setHasNextPage(boolean hasNextPage){ wF-H{C'
this.hasNextPage = hasNextPage; H:q;IYE+a
} 5z.Y}
Xag#ZT
/** wO]H+t
* @return usU6,
* Returns the hasPrePage. %mS>v|
*/ bhKe"#m|S
publicboolean getHasPrePage(){ wEl/s P
return hasPrePage; B?d+^sz]
} ;Yt'$D*CP
`@&WELFv{
/** AgOti]`aR
* @param hasPrePage C)cuy7<
* The hasPrePage to set. i2)$%M&
*/ +WCV"m
publicvoid setHasPrePage(boolean hasPrePage){ T|--ZRYn
this.hasPrePage = hasPrePage; i@=(Y~tD`
} Xk :_aJ
a!&<jM
/** wk2Ff*&
* @return Returns the totalPage. &!>.)I`
* <Ug1g0.
*/ =>e>
r~cW
publicint getTotalPage(){ \XbCJJP
return totalPage; }?6gj%$c
} m-9ChF:U
m>DJ w7<
/** SS&G<3Ke
* @param totalPage |-]'~@~
* The totalPage to set. !3ji]q;uF
*/ c`UizZ
publicvoid setTotalPage(int totalPage){ =_$Hn>vO
this.totalPage = totalPage; 4@jX{{^6%
} Upc_"mkI.
DNRWE1P2bg
} o}L\b,])
Vo(bro4ZQi
5QG?*Z~?7
`Js"*[z
M?qvI
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 yh+.Yn=+
Y";KWA}b
个PageUtil,负责对Page对象进行构造: MVDy|i4
java代码: X(;WY^i!
<@>l9_=R
}4q1"iMlO
/*Created on 2005-4-14*/ ' $"RQ=
package org.flyware.util.page; 5C5OLAl v
!wo
import org.apache.commons.logging.Log; G9~ 4?v6:
import org.apache.commons.logging.LogFactory; C|S~>4`
`>HrO}x^
/** kq>I?wg
* @author Joa L1MG("R
* Pu,2a+0N
*/ 3
t+1M
publicclass PageUtil { V?n=yg
7J|nqr`>t
privatestaticfinal Log logger = LogFactory.getLog ]4,eCT
CS;4 ysNf
(PageUtil.class); 5M#LO@U
n}8}:3"
/** $OaxetPH
* Use the origin page to create a new page {Lsl2@22
* @param page Bh65qHQO
* @param totalRecords E_#?;l>
* @return rs0Wy
*/ lB
publicstatic Page createPage(Page page, int HDj260a
Ed1y%mR>
totalRecords){ Am"&ApK
return createPage(page.getEveryPage(), 5wC,:c[H7
}`+9ie7]/
page.getCurrentPage(), totalRecords); Cq}E5M
} 5p~hUP]tT
SnY{|
/** sV]I]DR
* the basic page utils not including exception e_IRF+>
ZQ_AqzT3D
handler mpd?F'V
* @param everyPage gCx#&aXS
* @param currentPage 2u(G:cR
* @param totalRecords gvFCsVv<{
* @return page 7Q?^wx
*/ Yb%#\.M/y
publicstatic Page createPage(int everyPage, int vU9:`@beu
L fZF
currentPage, int totalRecords){ !iW>xo
everyPage = getEveryPage(everyPage); c6VyF=2q
currentPage = getCurrentPage(currentPage); )D&xyC}
int beginIndex = getBeginIndex(everyPage, |u+!CR
#GzowI'
currentPage); OU<v9`<
int totalPage = getTotalPage(everyPage, H`rd bE
(btmg<WT"
totalRecords); H4<Q}([w
boolean hasNextPage = hasNextPage(currentPage, 'i4L.&
cVDcda|PE
totalPage); bP&1tE
boolean hasPrePage = hasPrePage(currentPage); N t\ZM
VPb8dv(a3
returnnew Page(hasPrePage, hasNextPage, Qw<&N$
everyPage, totalPage, 4u#TKr.
currentPage, H^M>(kT#&
Cl!9/l?z
beginIndex); mB"1QtD
} 1o?uf,H7O
#gXxBM
privatestaticint getEveryPage(int everyPage){ iWIq~t*,H]
return everyPage == 0 ? 10 : everyPage; }lGui>/D
} \J(kM,ZJ
9T0g%&
privatestaticint getCurrentPage(int currentPage){ `yO'-(@"gY
return currentPage == 0 ? 1 : currentPage; BO.Db``
} q`UaJ_7
y2=yh30L0E
privatestaticint getBeginIndex(int everyPage, int G"h}6Za;DO
Nt/hF>"7
currentPage){ S q{@4F}d
return(currentPage - 1) * everyPage; .aR9ulS
} z7TyS.z
6w[EJ;=p_
privatestaticint getTotalPage(int everyPage, int wOsg,p;\'
I{=Yuc
totalRecords){ -F MonM
int totalPage = 0; .h(iyCxP
<LN7+7}
if(totalRecords % everyPage == 0) *D.Ajd.G
totalPage = totalRecords / everyPage; <,\U,jU_
else ^9kx3Pw?8
totalPage = totalRecords / everyPage + 1 ; `\f 3Ij,
9*r^1PRc
return totalPage; cZ# %tT#
} uF<?y0t
~0@fK<C)O
privatestaticboolean hasPrePage(int currentPage){ AWJA?
return currentPage == 1 ? false : true; KD?b|y@
} bP> Kx-%q
tS-gaT`T
privatestaticboolean hasNextPage(int currentPage, 73Hm:"Eqd
n#@ Qd!uzM
int totalPage){ ;%;||?'v
return currentPage == totalPage || totalPage == F~eY'~&H}
-+0kay%
0 ? false : true; $m A2AI
} RGrQ>'RL
+}PN+:yV
Je}0KW3G9L
} +wxsAGy_j
c94=>p6
\`E^>6!]q
Ov^##E
~H1<