Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 o(d_uJOB
4)odFq:
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 9 yW~79n
p17|ld`
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 eC^0I78x
v(Bp1~PPZM
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 wCU&Xb$F
J|"nwY}a9
。 ZO%fS'n
N(_
.N6
分页支持类: Q@e*$<3
>FY&-4+v
java代码: e>,9]{N+$
9QOr,~~s
h8#5vO2
package com.javaeye.common.util; dE5 5
~~xyFT+{F
import java.util.List; lRv#1'Y
X"TUe>cM
publicclass PaginationSupport { Sqdc1zC
z{`6#
publicfinalstaticint PAGESIZE = 30; <;z[+6T
$#G6m`V
privateint pageSize = PAGESIZE; 'Vm5Cs$
z)&naw.
privateList items; 4/HY[FT
D%;wVnUw
privateint totalCount; !c4)pMd
sP6 ):h
privateint[] indexes = newint[0]; ZTh?^}/
1Nl&4 YLO
privateint startIndex = 0; Q/QQ:t<XUi
q ab)
1ft
public PaginationSupport(List items, int VBbUl|X\
%="~\1y
totalCount){ u>,lf\Fgz
setPageSize(PAGESIZE); XN~#gm#
setTotalCount(totalCount); g{A3W) [ b
setItems(items); <ELziE~>V
setStartIndex(0); BcZEa^^~os
} 42Aje
TV1e
bH7q
public PaginationSupport(List items, int 6K4`;
MtZt8s
totalCount, int startIndex){ i!SW?\
setPageSize(PAGESIZE); wGOMUWAt
setTotalCount(totalCount); FG>;P]mvp
setItems(items); 8^<c,!DM
setStartIndex(startIndex); pAJ=f}",]E
} j*;*Ka w
Z7/vrME6
public PaginationSupport(List items, int bK$/,,0=X/
JHvFIo
totalCount, int pageSize, int startIndex){ j<l#qho{h
setPageSize(pageSize);
8qFUYZtY
setTotalCount(totalCount); 69[V <1
setItems(items); -O~C m}e
setStartIndex(startIndex); A$9q!Ui#d
} |u^)RB
0(Y%,q
publicList getItems(){ wUru1_zjO
return items; Ud>`@2
} !sg%6H?}
HCX!P4Hj
publicvoid setItems(List items){ zQL!(2
this.items = items;
UfK4eZx*`
} &Q'\WA'
lQh
E]m>+
publicint getPageSize(){ =w',-+@
return pageSize; WdTbt
} 4r_!>['`"
uIYcmF\?
publicvoid setPageSize(int pageSize){ /Y;+PAy
this.pageSize = pageSize; (oLpnjJ(,
} 9"WRI Ht'c
y0scL7/
publicint getTotalCount(){ I$aXnd6)
return totalCount; /J1S@-
} 9M1a*frxZ
((-aC`
publicvoid setTotalCount(int totalCount){ -;+m%"k5
if(totalCount > 0){ X!U]`Qh
this.totalCount = totalCount; _wm~}_Q
int count = totalCount / McT\ R{/
/\TQc-k?2
pageSize; }7iUagN
if(totalCount % pageSize > 0) 3xBN10R#
count++; 5c<b|
indexes = newint[count]; MS{Hz,I,
for(int i = 0; i < count; i++){ m3U+ du
indexes = pageSize * ^D9
/
i'M^ez)u
i; !?BW_vY
}
AGh~8[
}else{ 536^PcJlN
this.totalCount = 0; S8*^ss>?^R
} i Bi7|
} )2)Zz +<
D8k*0ei&
publicint[] getIndexes(){ =Ml|l$
return indexes; a;56k
} uAp
-$?
q|n97.vD
publicvoid setIndexes(int[] indexes){ ~@%(RMJm&
this.indexes = indexes; C}Rs[
} z8g=;><
btUq
publicint getStartIndex(){ jVX._bEGX
return startIndex;
s0gJ f[
} <Cu'!h_nL
;JAK[o8i
publicvoid setStartIndex(int startIndex){ i B%XBR
if(totalCount <= 0) dj3|f{kg{
this.startIndex = 0; &K06}[J
elseif(startIndex >= totalCount) +*n]tlk
this.startIndex = indexes USE [N
ah 4kA LO
[indexes.length - 1]; P\.WXe#j
elseif(startIndex < 0) .H
Fc9^.*
this.startIndex = 0; cL?\^K)
else{ D._{E*vg
this.startIndex = indexes U%Dit
j -#E?&2
[startIndex / pageSize]; vZ:G8K)o(
} w-J"zC
} <H<!ht%q3
\.5F](:
publicint getNextIndex(){ .H ,pO#{;
int nextIndex = getStartIndex() + Dp^"J85}
E
yd$fcRK
pageSize; @o`sf-8x
if(nextIndex >= totalCount) +IvNyj|
return getStartIndex(); "Lb fF
else n.@#rBKZ
return nextIndex; aZP2R"
} z|uOJ0uK
3*G5F}7%=
publicint getPreviousIndex(){ {!lNL[x
int previousIndex = getStartIndex() - P_Z M'[
P2O\!'aEh
pageSize; uG4$2
if(previousIndex < 0) O97VdNT8
return0; bk.*k~_
else w_\nB}_
return previousIndex; c2/"KT
} j]AekI4I
?'Cb-C_
} hMv2"V-X
Ocyb c%
'[%jjUU
1bd$XnU
抽象业务类 dQ,Q+ON>
java代码: CdZnD#F2
i)=m7i
X|,["Az
8
/** Pv~: gP
* Created on 2005-7-12 )5U!>,fT
*/ L"4]Tm>zq
package com.javaeye.common.business; \Ps5H5Qk;
VDG|>#[!
import java.io.Serializable; &0s*PG
import java.util.List; lbd(j{h>4
F9%,MSt
import org.hibernate.Criteria; : g5(HH
import org.hibernate.HibernateException; UnP|]]o:I
import org.hibernate.Session; uN8/Q2
import org.hibernate.criterion.DetachedCriteria; { E^U6@
import org.hibernate.criterion.Projections; oI*d/*
import DjY8nePyE
P`tyBe#=
org.springframework.orm.hibernate3.HibernateCallback; \Fq1^ 8qa
import hv3;irK]&
<Kg2$lu(_`
org.springframework.orm.hibernate3.support.HibernateDaoS ><cU7 ja[^
hzv3F9.x
upport; N0nj`
"$r1$mBi
import com.javaeye.common.util.PaginationSupport; +N7"EROc
w~]T<^fW~
public abstract class AbstractManager extends ndqckT@93
eIsT!V"7
HibernateDaoSupport { Z0aUHWms
wE?CvL
privateboolean cacheQueries = false; 4oV
{=~V
Q<1L`_.>
privateString queryCacheRegion; bf1)M>g,O
7 I@";d8~
publicvoid setCacheQueries(boolean
,%kmXh
0t+])>
cacheQueries){ 7|Xe&o<n
this.cacheQueries = cacheQueries; g>_OuQ|c
} b;*c:{W)
EZ/^nG
publicvoid setQueryCacheRegion(String W+K.r?G<j
Xo\S9,s{
queryCacheRegion){ $2Q YxY9s
this.queryCacheRegion = cW; H!:&
9)Ly}Kzx
queryCacheRegion; R#ya,L
} TU%bOAKF\
"T7>)fbu
publicvoid save(finalObject entity){ NZ+7p{&AN
getHibernateTemplate().save(entity); sDX/zF6t
} =HS4I.@c_5
[ZD[a6(94
publicvoid persist(finalObject entity){ hXc}r6<B
getHibernateTemplate().save(entity); AX;c}0g
} '$?du~L-
'AWp6L @
publicvoid update(finalObject entity){ F 5U|9<
getHibernateTemplate().update(entity); sBU_Ft
} N}DL(-SQ3
' Rc#^U*n
publicvoid delete(finalObject entity){ Z%OW5]q
getHibernateTemplate().delete(entity); b)`pZiQP
} >Mw'eQ0(y
_4v"")Xe
publicObject load(finalClass entity, !VRo*[yD@
TM-Fu([LMV
finalSerializable id){ AuXs B
return getHibernateTemplate().load jM @?<1
V'I T1~
(entity, id); !3V{2-y$-
} )b0];&hw]
7h`^N5H.q
publicObject get(finalClass entity, '60//"9>k/
`;cz;"
finalSerializable id){ :3O5ET'1
return getHibernateTemplate().get eF5;[v
^BiPLQ
(entity, id); n]iyFZ`9
} %J!NL0x_
+ {e`]t>_
publicList findAll(finalClass entity){ R5ZIC4p
return getHibernateTemplate().find("from -=mwy
VE$t%QT
" + entity.getName()); 6@YH#{~Zpv
} zSXA=
7 >bMzdH
publicList findByNamedQuery(finalString $w/E9EJ)3A
mX;H((
namedQuery){ Cfv]VQQE
return getHibernateTemplate p/&HUQQk
P0 b4Hq3
().findByNamedQuery(namedQuery); ({ k7#1
h8
} jkt6/H
(A4&k{C_
publicList findByNamedQuery(finalString query, P,ydt
^V.'^=l
finalObject parameter){ h/?6=D{
return getHibernateTemplate SY T$3|a
;MPKJS68@
().findByNamedQuery(query, parameter); 9go))&`PJL
} T?rH
,$:
CmnHh~%
publicList findByNamedQuery(finalString query, F>-}*o
m#n]Wgp'
finalObject[] parameters){ 8wmQ4){
return getHibernateTemplate b 4OnZ;FI
^{[[Z.&R?
().findByNamedQuery(query, parameters); ,hvc``j
S8
} |r !G,
f3#X0.':
publicList find(finalString query){ hZU1O
return getHibernateTemplate().find kceyuD$3G
]r959+\$
(query); 8UM0vNk
} nNQ-"t
ShGp^xVj
publicList find(finalString query, finalObject oY.\)eJ~>
iRt*A6`m+
parameter){ vQHpf>o
return getHibernateTemplate().find {SdO9Yy?@7
b# ='^W3
(query, parameter); EO:avH.*0
} 5v|EAjB6o
JC2*$qu J
public PaginationSupport findPageByCriteria u"Y]P*[k
kOI
!~Qk
(final DetachedCriteria detachedCriteria){ 1-o V-K
return findPageByCriteria o;J;k_[MX
!_x*m@/
(detachedCriteria, PaginationSupport.PAGESIZE, 0); vRr9%zx
} X<euD9?
Z@M6!;y#
public PaginationSupport findPageByCriteria ~ffwLgu!
X-/Ban
(final DetachedCriteria detachedCriteria, finalint -;Uj|^
ir&.Z5=
startIndex){ 1~Mn'O%
return findPageByCriteria |' ;7v)CIG
,LUTHWEo"I
(detachedCriteria, PaginationSupport.PAGESIZE, k|B2@{
-oh7d$~
startIndex); 8xTix1u0
} qm%nIU \*
>>7aw" 0
public PaginationSupport findPageByCriteria BY(
eV!
9)lZyE}
(final DetachedCriteria detachedCriteria, finalint rQj~[Y.c
1exfCm
pageSize, 0>@[o8
finalint startIndex){ $$4W}Ug3U
return(PaginationSupport) c-*2dV[@
6+PGwCS
getHibernateTemplate().execute(new HibernateCallback(){ W[|[;{
publicObject doInHibernate 7' eh)[T
u-.L^!k
(Session session)throws HibernateException { '[fZt#
Criteria criteria = [cpNiw4e
a.,_4;'UE1
detachedCriteria.getExecutableCriteria(session); +)gB9DoK
int totalCount = [ {cC
`{}@@]
((Integer) criteria.setProjection(Projections.rowCount &J(!8y*QyE
v3-?CQb(
()).uniqueResult()).intValue(); I%xn,u
criteria.setProjection Xw^X&Pp
"&-C$J5
Id
(null); uvv.WbZ
List items = ,Rz}=j
o;QZe&
criteria.setFirstResult(startIndex).setMaxResults SdI1}&
P4 6,o
(pageSize).list(); ~ 5"J(
PaginationSupport ps = [hHG.
jVYH;B%%z
new PaginationSupport(items, totalCount, pageSize, %g w{[
/[A
g^j7@dum
startIndex); Funj!x'uE
return ps; j@ v-|
}
TQ' e
}, true); p;`N\.ld
} ' ^a!`"Bc
;rHz;]si
public List findAllByCriteria(final /b{HG7i\
/aOlYqM(>
DetachedCriteria detachedCriteria){ C +@ i
return(List) getHibernateTemplate fSI %c3
* nCx[
().execute(new HibernateCallback(){ I?M@5u
publicObject doInHibernate ^'W%X
x+^Vg3 q
(Session session)throws HibernateException { ,sI35I J
Criteria criteria = 5;Ia$lm=y
%6i=lyH-
detachedCriteria.getExecutableCriteria(session); 5~l2!PY
return criteria.list(); PEzia}m
} @?a4i
}, true); W~NYU
} }n[Bq#
7I3 :u+
public int getCountByCriteria(final Jck"Ks
kl<g;3
DetachedCriteria detachedCriteria){ )
,Npv3(
Integer count = (Integer) ?Aw3lH#:
Qlh?iA
getHibernateTemplate().execute(new HibernateCallback(){ $G3@< BIN
publicObject doInHibernate f3n~{a,[
u[EK#%
(Session session)throws HibernateException { yjpz_<7a=
Criteria criteria = EfKntrom[
+-ewE-:|L
detachedCriteria.getExecutableCriteria(session); z!Hx @){|
return 8ds}+TtbY
)X%oXc&C|
criteria.setProjection(Projections.rowCount P`
]ps?l
fIkT"?
()).uniqueResult(); 3EOyq^I%
} }]GbUC!Zb
}, true); J6auUm` `
return count.intValue(); 4J}3,+
} L[. <o{
} rr )/`Kmv%
u){S$</
~U%j{8uH
OG}KqG!n
?O7iK<5N
@_Sp3nWdu
用户在web层构造查询条件detachedCriteria,和可选的 h2;l1G,
QgZJ`G--
startIndex,调用业务bean的相应findByCriteria方法,返回一个 vJThU$s-
vZk9gGjk
PaginationSupport的实例ps。 BS.=
C P&o%Uc*
ps.getItems()得到已分页好的结果集 )_Iz>)
ps.getIndexes()得到分页索引的数组 {aIZFe}B
ps.getTotalCount()得到总结果数 3'^S3W%
ps.getStartIndex()当前分页索引 ?i%nMlcc
ps.getNextIndex()下一页索引 r?$&Z^
ps.getPreviousIndex()上一页索引 acae=c|X
}.t^D|
^O \q3HA_4
:D4];d>1
8]]@S"ZM,\
5Pqt_ZWy
O!
(85rp/
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 xT=ySa$|>
TrQm]9 @
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 ^'YHJEK
r0u J$/!
一下代码重构了。 S}mm\<=1
CjV7q y
我把原本我的做法也提供出来供大家讨论吧: D!me%;
D 2$^"
首先,为了实现分页查询,我封装了一个Page类: WKOI\
java代码: c/RT0xql*
eA&t%
z}3di5+P
/*Created on 2005-4-14*/ ^XNw$@&',
package org.flyware.util.page; -;ER`Jqs,
b=G4MZQ
/** Yx 3|G
* @author Joa /N%zwj/*
* g/B\ObY
*/ v^\JWPR/
publicclass Page { DZ2Fl>7
f-&ATTx`J
/** imply if the page has previous page */ O$U}d-Xnx
privateboolean hasPrePage; UQnBqkE
jm+blB^%K
/** imply if the page has next page */ Bs@:rhDi
privateboolean hasNextPage; 8W@dtZ,d
p9Z].5Pd"
/** the number of every page */ BjB&[5?z
privateint everyPage; "]<w x_!+}
sX!3_'-
/** the total page number */ Wt"ww~h`(
privateint totalPage; z6 a,0&;-L
bl`D+/V
/** the number of current page */ i)[kubM
privateint currentPage; LS{bg.e
0W_mCV
/** the begin index of the records by the current X*)?LxTj
'9"%@AFxZ
query */
}Zt.*%
privateint beginIndex; R)Q/Ff@o0
l[Tt[n
@wMQC\Z
/** The default constructor */ 6UO$z- e
public Page(){ OelU
D/[$
G"{4'LlA
} \Vz,wy%-
!"`Jqs
/** construct the page by everyPage u?H@C)P
* @param everyPage C_-%*]*,j
* */ l\_x(BH
public Page(int everyPage){ m^'~&!ba
this.everyPage = everyPage; :q(D(mK
} B_!wutV@
'OG{*TDPu
/** The whole constructor */ t@6w$5:}
public Page(boolean hasPrePage, boolean hasNextPage, *.:! Ax
1y 1_6TZ+
p1kl LX
int everyPage, int totalPage, ^] i"
H|(x
int currentPage, int beginIndex){ ?P%|P
this.hasPrePage = hasPrePage; %n4@[fG%K
this.hasNextPage = hasNextPage;
[A|(A$jl
this.everyPage = everyPage; 4`$5
_}
j!
this.totalPage = totalPage; O/(3 87= U
this.currentPage = currentPage; Shs')Zsbv
this.beginIndex = beginIndex; \zBd<H4S:
} +)?, {eE|
gji*Wq
/** Qg[heND
* @return b$dBV}0 L
* Returns the beginIndex. 8>ESD}(
*/ xC'mPcU8
publicint getBeginIndex(){ hr%U>U9F
return beginIndex; ) sRN!~
} j{)fC]8H
l},dQ4R
/** ijE<spG
* @param beginIndex akMJ4EF/
* The beginIndex to set.
ccRlql(
*/ x!OWJ/O
publicvoid setBeginIndex(int beginIndex){ EG%I1F%
this.beginIndex = beginIndex; mZ]P[lQ'5
} ?n2C
*3!(*F@M,
/** X{#bJ
* @return 7qpzk7X?pR
* Returns the currentPage. 9z+vFk`
*/ Ih(:HFRMq6
publicint getCurrentPage(){ $|rCrak;
return currentPage; ={\![{L
} G aha Z
F
oN_S}o
/** #,t2*tM
* @param currentPage P`7ojXy
* The currentPage to set. J0&zb'1
*/ Tc9&mKVE%(
publicvoid setCurrentPage(int currentPage){ ,?Ok[G!cm
this.currentPage = currentPage; TFNUv<>X
} j[_t6Z
)uANmThOz
/** _MGNKA6JI
* @return ;9}w|!/
* Returns the everyPage. D% oueW
*/ ,<7"K&
publicint getEveryPage(){ [SK2 x4
return everyPage; ] gH
wfqx
} TViBCed40
{F<)z%^
/** )>ug{M%g
* @param everyPage "w>rlsT<O
* The everyPage to set. joxS+P5#
*/ Tnf&pu#5
publicvoid setEveryPage(int everyPage){ MKV=m8G=
this.everyPage = everyPage; 2r
%>]y
} 9
aY'0wa
?$UH9T9)
/** #E*@/ p/
* @return nUiS<D2
* Returns the hasNextPage. 8w03{H
0
*/ O5g}2
publicboolean getHasNextPage(){ SL6mNn9c
return hasNextPage; Xq+!eOT
} VEL:JsY
FX{~"
/** " ]aQ Hh]f
* @param hasNextPage AEB/8%l};v
* The hasNextPage to set. gmXy>{T
*/ UAnB=L,.\
publicvoid setHasNextPage(boolean hasNextPage){
fn4=
this.hasNextPage = hasNextPage; 5T~3$kuO
} s;vWR^Ll
98X!uh'
/** n/ui<&(
* @return {CW1t5$*
* Returns the hasPrePage. 0eQ~#~j&
*/ 3"^a
rK^N
publicboolean getHasPrePage(){ M' &J_g
return hasPrePage; ~sZqa+jB0
} ='7er.~\
K#_~
!C4L
/** :&xz5c`"04
* @param hasPrePage 83mlZ1jQz
* The hasPrePage to set. NYWG#4D
*/ Ll008.#
publicvoid setHasPrePage(boolean hasPrePage){ Q2JdO 6[96
this.hasPrePage = hasPrePage; pYYqGv^oa
} kqj;l\N
<8}KEe4
/** Dm7Y#)%8
* @return Returns the totalPage. qzuQq94k
* pWWL{@ J
*/ %4?SY82
publicint getTotalPage(){ 'CP/ym f/a
return totalPage; 9V|E1-")E
} 1~["{u
|
\ s2
/** &p/S>qKu#
* @param totalPage \hjk$Gq
* The totalPage to set. s-QM6*
*/ nAQyxP%
publicvoid setTotalPage(int totalPage){ 3!i.Fmo
this.totalPage = totalPage; Gg
7WmL
} ^+(A&PyP?
*>H M$.?Q
} r]8wOu-'
Q%M'[L?[
+ ")qi=
{DKXn`V
<C7M";54-
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 5*s1qA0^
sN}s61
个PageUtil,负责对Page对象进行构造: +)/Rql(lY
java代码: 08TaFzP81
!!?+M @
Y|{r
vBKjf
/*Created on 2005-4-14*/ -ET*M<
package org.flyware.util.page; $=e&q
u=p ;A1oy
import org.apache.commons.logging.Log; ]_^"|RJ
import org.apache.commons.logging.LogFactory; \_m\U.*
.V5q$5j
/** FRl3\ZDqrb
* @author Joa 'hwV
* U%mkhWn
*/ [}W^4,
publicclass PageUtil { ?noETH z)
y3
({(URU
privatestaticfinal Log logger = LogFactory.getLog {0NsDi>(2
Q3<bC6$r
(PageUtil.class); ,!o\),N
XM$5S+e
/** m#5|J@]
* Use the origin page to create a new page sDLVYD
* @param page =oL8d6nI
* @param totalRecords YtwmlIar`
* @return \Dvl%:8
*/ /0B07B
publicstatic Page createPage(Page page, int no~O R Q
nx!qCgo
totalRecords){ yj}bY?4I
return createPage(page.getEveryPage(), AijPN
"E@NZ*"u
page.getCurrentPage(), totalRecords); [
4?cM\_u@
} Uv
@!i0W
.4S^nP
/** _aXP
;kFMi
* the basic page utils not including exception ?D*Hl+iu
?$"x^=te7
handler T..N*6<X
* @param everyPage y1,?ZWTayr
* @param currentPage ]y1$F
Ir+
* @param totalRecords wQo6!H"K
* @return page ..P=D <'f
*/ &^CL]&/
publicstatic Page createPage(int everyPage, int +z]:CF
aJuj7y-
currentPage, int totalRecords){ <3SFP3^:
everyPage = getEveryPage(everyPage); 2 pM
currentPage = getCurrentPage(currentPage); kcq9p2zKv
int beginIndex = getBeginIndex(everyPage, >:Rt>po8|w
z")3_5Br
currentPage); p0}+071o%
int totalPage = getTotalPage(everyPage, >cwJl@wx-
<r_P?
lZW
totalRecords); >5Q^9 9V
boolean hasNextPage = hasNextPage(currentPage, [OFTP#}c
)1ZJ
totalPage); W,9k0t
boolean hasPrePage = hasPrePage(currentPage); &.cGj@1!J
LW83Y/7
returnnew Page(hasPrePage, hasNextPage, _Ep{|]:gw
everyPage, totalPage, Z`-)1!
currentPage, ^F0k2pB
2- Npw%;
beginIndex); j:rs+1bc
} K^z5x#Yj
Y0P}KPD
privatestaticint getEveryPage(int everyPage){ bl:a&<F
return everyPage == 0 ? 10 : everyPage; ~cO?S2!W
} 9}%~w(P
|kBg8).B
privatestaticint getCurrentPage(int currentPage){ r)9i1rI+
return currentPage == 0 ? 1 : currentPage; u):%5F/
} mC{!8WC@k
mFgb_Cd
privatestaticint getBeginIndex(int everyPage, int ),D`ZRXS
gZ`#tlA~
currentPage){ iGEQXIr3
return(currentPage - 1) * everyPage; :)A.E}G
} VV0EgfJ
%9~kA5Qj
privatestaticint getTotalPage(int everyPage, int KV^:sxU
^-e3=&
totalRecords){ ~WYE"(
int totalPage = 0; 75hFyh;u
:w
{M6mM>
if(totalRecords % everyPage == 0) #GDh/t2@
totalPage = totalRecords / everyPage; /H\^l.|vk
else 0]:*v?
totalPage = totalRecords / everyPage + 1 ; J-eA,9J
9:CVN@E
return totalPage; ~
X]"P4 u
} o5*74Mv
h|c:!VN@
privatestaticboolean hasPrePage(int currentPage){ =B/s HN
return currentPage == 1 ? false : true; (?*mh?
} Y-neD?V N
ySr091Q
privatestaticboolean hasNextPage(int currentPage, m 1'&{O:
K*HVn2OV
int totalPage){ &|'Kut?8
return currentPage == totalPage || totalPage == "EOk^1,y
eSvc/ CU
0 ? false : true; ;4S
[ba1/
} ?v )"%.
$X.'W\o|
(zM+7tJH
} 43}&w