Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 D@ji1$K
z4nVsgQ$
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 92k}ON
-~HlME*~f
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 Ht'jm (
'\2lWR]ndd
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 Z)U#5|sf
;')T}wuq
。 0CD2o\`8
pw7_j;}l
分页支持类: UI4Xv
Vo%UiVHy
java代码: diLjUC`69
cg,_nG]i
d\ &jl`8*
package com.javaeye.common.util; +(3PY e\
|7CH
import java.util.List; JAA P5ur
_]=` F
l
publicclass PaginationSupport { i`g>Y5
N[$(y}
!s
publicfinalstaticint PAGESIZE = 30; T_}\
vR?L/G^.
privateint pageSize = PAGESIZE; QsmG(1=
V#TA%>
privateList items; ]'aGoR
-BV&u(
privateint totalCount; g(:y_EpmLH
/Ki :6
privateint[] indexes = newint[0]; N[}XLhbt
z^4\?R50yO
privateint startIndex = 0; _W:
S>ij(
TBQ`:`g^m
public PaginationSupport(List items, int \~
RU`TzD
totalCount){
FFgy=F
setPageSize(PAGESIZE); ^3`98y.Q
setTotalCount(totalCount); s8``U~D
setItems(items); is}Fy>9i
setStartIndex(0); f (
`.q
} )^!-Aj\x
U[S;5xeF.j
public PaginationSupport(List items, int Ze$:-7Czl
7l Aa6"Y68
totalCount, int startIndex){ P|.KMtG
setPageSize(PAGESIZE); 8I C((
setTotalCount(totalCount); nm'm*sU\
setItems(items); @D"1}CW
setStartIndex(startIndex); sI`i
} #k=!>%+E
f|VP_o<
public PaginationSupport(List items, int CRWO R pP
)m[!HE`cZ
totalCount, int pageSize, int startIndex){ PyHE>C%
setPageSize(pageSize); d*3R0Q|#{
setTotalCount(totalCount); ?=IbiT
setItems(items); -T{~m6
setStartIndex(startIndex); gr=ke #
} Qb# S)[6s+
VH*j3
publicList getItems(){ y&__2t^u
return items; "_)
} ==(M
vu`
v%aD:%wlY@
publicvoid setItems(List items){ `p^M\!h*O
this.items = items; qrX6FI
} o7 !@WOeZ3
,iPkx(
publicint getPageSize(){ GZ'hj_2%<
return pageSize; {/7'uD\
H
} v;K\#uc_
JmYi&
publicvoid setPageSize(int pageSize){ $]81 s`
this.pageSize = pageSize; &8&WY1cU
} NHc+QMbou(
6-X7C9`C
publicint getTotalCount(){ N&>D/Z;"
return totalCount; n6o}$]H
} 71 /6=aq>n
<E\BKC%M
publicvoid setTotalCount(int totalCount){ sZ4H\
if(totalCount > 0){ tOko %vY8
this.totalCount = totalCount; |E7]69=P
int count = totalCount / ~`N|sI,
OC\C^Yh*U
pageSize; \W@?revK
if(totalCount % pageSize > 0) d'-^VxO0
count++; F37,u|
indexes = newint[count]; <I|ryPU9{X
for(int i = 0; i < count; i++){ jA]xpf6}
indexes = pageSize * v5$zz w
A`r&"i OKA
i; fCVSVn"o
} jN {ED_
}else{ b'{D4/
this.totalCount = 0; cL
WM]\Y
} 9Pb0Olh
} ohh 1DsB
fg1 zT~
publicint[] getIndexes(){ =q"3a9pb7
return indexes; Ahebr{u
} uC;@Yi8
ss2:8up 99
publicvoid setIndexes(int[] indexes){ gh
0\9;h
this.indexes = indexes; G/`_$ c
} P2Eyqd8
0CN.gu
publicint getStartIndex(){ 0bd.ess
return startIndex; >3Y&jsh<
} 1IsR}uLh
*LhR$(F(
publicvoid setStartIndex(int startIndex){ )i>KYg w
if(totalCount <= 0) {l1;&y?
this.startIndex = 0; hmi15VW
elseif(startIndex >= totalCount) [j/-(?+
this.startIndex = indexes (nzzX?`nY
~p 1y+
[indexes.length - 1]; r:o!w7C:a
elseif(startIndex < 0) \4&g5vE
this.startIndex = 0; oyd{}$71d
else{ m 8f_w
this.startIndex = indexes {oZ]1Qf_
PQs9@]w[
[startIndex / pageSize]; KVntBe]I
} NSkI2>+P
} P6?Q;-\q0
w7W-=\Hvh
publicint getNextIndex(){ #nd,c n
int nextIndex = getStartIndex() + _8`|KY
X3>(K1
pageSize; D *tBbV
if(nextIndex >= totalCount) 5u!cA4e"
return getStartIndex(); doa$
;=wg
else Q7s1M&K
return nextIndex; {%$=^XO
} mU_O64
8L@di Y
publicint getPreviousIndex(){ xphqgOc12,
int previousIndex = getStartIndex() - qnlj~]NV
npF[J x[
pageSize; f0uiNy(r$
if(previousIndex < 0) ^m7PXY
return0; ,s)H%
else ~E\CAZ
return previousIndex; ^q6~xC,/
} $OO[C={v[
-/</7I
} v7R&9kU{
^Ve^}|qPc
~Mx
fud
p)ONw"sb
抽象业务类 ~DD/\V
java代码: ,yF)7fN
~:@H6Ke[
4j*}|@x
/** WAEKvM4*i0
* Created on 2005-7-12 qRFN@ID$
*/ ev3x*}d0
package com.javaeye.common.business; wfdFGoy(
F~Li.qF
import java.io.Serializable; We ->d |=
import java.util.List; oK>,MdB
t&xx-4
import org.hibernate.Criteria; C/bttd
import org.hibernate.HibernateException; P8jK
yo
import org.hibernate.Session; YJy*OS_&
import org.hibernate.criterion.DetachedCriteria; HT&0i,`
import org.hibernate.criterion.Projections; MXy{]o_H~
import A>?fbY2n
oxzNV&D[{`
org.springframework.orm.hibernate3.HibernateCallback; 7I|%GA_
import g U?)
*t_&im%E
org.springframework.orm.hibernate3.support.HibernateDaoS =6sXZ"_Tw
s:ruCS
upport; J-}NFWR;t
r)t^qhn
import com.javaeye.common.util.PaginationSupport; )~/U+,
VPHCPGrk
public abstract class AbstractManager extends -:,h8JyMP
r>Ln*R,9D
HibernateDaoSupport { I ?>#neHc6
<%z/6I
Af|
privateboolean cacheQueries = false; !r|X6`g
cabN<a
l
privateString queryCacheRegion; ^6+x0[13
#jX>FXo
publicvoid setCacheQueries(boolean @I&"P:E0F;
=Wf@'~K0k"
cacheQueries){ `T70FsSJ
this.cacheQueries = cacheQueries; Q-F9oZ*0
} "7HB3?2>W
~laZ(Bma);
publicvoid setQueryCacheRegion(String asg>TOW
o >Lk`\
queryCacheRegion){ US4Um>j
this.queryCacheRegion = $ZS9CkN
&f*d FUM]I
queryCacheRegion; {#,FlR2
} aM~fRra7
f2wW2]Fg
publicvoid save(finalObject entity){ W%1S:2+Kl
getHibernateTemplate().save(entity); }>0
Kc=
} ~S3eatM$9
\ax%I)3
publicvoid persist(finalObject entity){ }kj6hnQ
getHibernateTemplate().save(entity); L|X5Ru
} ^NDX4d;
Nj0)/)<r+
publicvoid update(finalObject entity){ aJ8pJ{,P
getHibernateTemplate().update(entity); U3}R^W~eb
} _
^{Ep/ME=
f[b YjIX
publicvoid delete(finalObject entity){ T Rw6$CR
getHibernateTemplate().delete(entity); Aq!['G
} C~qhwwh
{0 ~0
publicObject load(finalClass entity, c*dww
9#<Og>t2y
finalSerializable id){ 5-^%\?,x
return getHibernateTemplate().load 8-:k@W
zc+;VtP|8
(entity, id); >A&@W p1
} F-^HN%
`VtwKt*
publicObject get(finalClass entity, <+gl"lG
` a>vPW
finalSerializable id){ 3J
T3;O
return getHibernateTemplate().get U[b;#Y1X
_m],(J=,z
(entity, id); )\-";?sYky
} (L$~zw5gr
|8 bO5l:
publicList findAll(finalClass entity){ {ah=i8$
return getHibernateTemplate().find("from {yR)}r
Wq(l :W'
" + entity.getName()); R`2A-c
} L]d@D0.Z
N;'HR)
publicList findByNamedQuery(finalString s.` d<(X?
T3./V0]\I
namedQuery){ 8[)]3K x
return getHibernateTemplate 6#M0AG
|QLX..
().findByNamedQuery(namedQuery); aMQjoamz
} A Vm{#^p[(
N?;o_^C
publicList findByNamedQuery(finalString query, `mjx4Lb
7[g;|(G0
finalObject parameter){ rxj@NwAno
return getHibernateTemplate >&QH{!(
Rt^<xXX$
().findByNamedQuery(query, parameter); p{q!jm~Nq
} 4q13xX
c1kxKxE
publicList findByNamedQuery(finalString query, ]<gCq/V #
5xDN&su
finalObject[] parameters){ P0e ""9JOo
return getHibernateTemplate
vt@Us\fI
`t0f L\T
().findByNamedQuery(query, parameters); j yRSEk$
} =nx:GT3&[
-'[(Uzj
publicList find(finalString query){ Wi[m`#
return getHibernateTemplate().find :z.Y$]F@
drKjLo[y
(query); MJ,ZXJXs
} xs!g{~V{
1Xr"h:U_X
publicList find(finalString query, finalObject u\R`IZ&O
lhoq3A
parameter){ d-;9L56{P
return getHibernateTemplate().find .l+~)$
d:hL
)x
(query, parameter); sD8m<
} NOr
<,
}{xN`pZ
public PaginationSupport findPageByCriteria <;cE/W}}
8A^jD(|
(final DetachedCriteria detachedCriteria){ /;&+<
}
return findPageByCriteria C$LRY~\
6_<s=nTX
(detachedCriteria, PaginationSupport.PAGESIZE, 0); c~UAr k S
} $i:||L^8p
u'i%~(:$\)
public PaginationSupport findPageByCriteria LkGf|yd_
s!ZW'`4!z
(final DetachedCriteria detachedCriteria, finalint z8/xGQn
pp]_/46nN
startIndex){ +K%pxuVh
return findPageByCriteria pzq;vMr
{HHh.K
(detachedCriteria, PaginationSupport.PAGESIZE, r1ok u0 o
$54=gRo^
startIndex); <D!c
~*[
} /3Nb
Pc)VK>.fc
public PaginationSupport findPageByCriteria U2V^T'Y[
g[s\~MF@s
(final DetachedCriteria detachedCriteria, finalint Z-SwJtWk
*SkiFEoD
pageSize, j\'+wVyo
finalint startIndex){ px|>v8
return(PaginationSupport) )!k_Gb`#X
8b 8\
getHibernateTemplate().execute(new HibernateCallback(){ N
pXgyD
publicObject doInHibernate }B"|z'u
_t|G@D{
(Session session)throws HibernateException { +Cf0Y2*@hM
Criteria criteria = gf3U#L}P
?Z Rkn+;
detachedCriteria.getExecutableCriteria(session); e(~'pk"mZ
int totalCount = :YqQlr\
6!+X.+
((Integer) criteria.setProjection(Projections.rowCount ^+*GbY$'
hB?,7-
()).uniqueResult()).intValue(); VJN/#
criteria.setProjection O:;OR'N9
-4e)N*VVu
(null); 9K ;k%
List items = 4r1<,{gCS
19F ;oFp
criteria.setFirstResult(startIndex).setMaxResults N )zPxQ
U['JFLF
(pageSize).list(); |
"Jx
PaginationSupport ps = Yz=h"Zr
4YDT%_h0
new PaginationSupport(items, totalCount, pageSize, jj!N39f
}UKgF.
startIndex); WVS$O99Y
return ps; LBmM{Gu
} 9DOkQnnc
}, true); (@)2PO/
} q]"2hLq
F1gt3 ae
public List findAllByCriteria(final ZT) !8
Cf0|Z
DetachedCriteria detachedCriteria){ *$i; o3
return(List) getHibernateTemplate K`Bq(z?/
[x!i*
rW3
().execute(new HibernateCallback(){ (;0$i?3\
publicObject doInHibernate .4Qb5I2#
EqD^/(,L2
(Session session)throws HibernateException { j?:`-\w5
Criteria criteria = 4l lD6&%
AqV09 $
detachedCriteria.getExecutableCriteria(session); e9CP802#2
return criteria.list(); +`;+RDKY*
} 0A#*4ap
}, true); &
u$(NbK
} vG ]GQ#
x37/cu
public int getCountByCriteria(final s0cs'Rg
nJFk4v4:2
DetachedCriteria detachedCriteria){ t=n+3`g
Integer count = (Integer) ud0QZ X
{TyCj?3 B
getHibernateTemplate().execute(new HibernateCallback(){ 1.'(nKoq
publicObject doInHibernate |DN^NhtE
K;oV"KRK
(Session session)throws HibernateException { o]Z
_@VI
Criteria criteria = Hf VHI1f
z)4UMR#b&
detachedCriteria.getExecutableCriteria(session); ;>NP.pnA)
return 9wL!D3e
{Q
q*\NRq
criteria.setProjection(Projections.rowCount :KEq<fEI
C,o:
()).uniqueResult(); VmN}FMGN
} DH5bpg&T
}, true); b,#`n
return count.intValue(); 8y$5oD6g9
} m</]D WJ
} }>2t&+v+
gaQ[3g
Hx$.9'Oq\Q
0 _Q*E3
JXH",""bq
glv ;C/l
用户在web层构造查询条件detachedCriteria,和可选的 ?4^};wDb2
,09DBxQq,
startIndex,调用业务bean的相应findByCriteria方法,返回一个 wGg0hL
}FrEF\}]_7
PaginationSupport的实例ps。 ^6Yd}
6\NvG,8
ps.getItems()得到已分页好的结果集 -*?p F_*w
ps.getIndexes()得到分页索引的数组 R"@7m!IA
ps.getTotalCount()得到总结果数 v@VLVf)>9^
ps.getStartIndex()当前分页索引 HLVQ7
ps.getNextIndex()下一页索引 J*5hf: ?i
ps.getPreviousIndex()上一页索引 14mf}"z\
>K\3*]>J3
o&~dGG4J
;; :">@5
8qn 9|
OY: u',T
>-b&v $
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 *-0>3
".gNeY6)x
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 4Rx~s7l
6Lb{r4^
一下代码重构了。 Uo~T'mA"
>?z:2@Q)B
我把原本我的做法也提供出来供大家讨论吧: u t$c)_
j !`B'{cH
首先,为了实现分页查询,我封装了一个Page类: xA92C
java代码: H( vx/q
C,fY.CeI
cS4DN
/*Created on 2005-4-14*/ x|8^i6xB
package org.flyware.util.page; .46#`4av
vv+km +
/** }MP>]8Aq
* @author Joa ]Ko^G_Rm
* oB
p3JX9_f
*/ ["u#{>(X
publicclass Page { 58: :h.:
~(P&g7u
/** imply if the page has previous page */ 09'oz*v{#
privateboolean hasPrePage; 30s; }
D93gH1z
/** imply if the page has next page */ =J](.78
privateboolean hasNextPage; Q^L)
Vp"
3f"C!l]Xu
/** the number of every page */ +
~"5!
privateint everyPage; \/ErPi=g
eIH$"f;L
/** the total page number */ 6#U^<`
privateint totalPage; X3<K 1/<
P;73Hr[E#
/** the number of current page */ }AlYNEY
privateint currentPage; onwjn+"&
l-<`m#/v
/** the begin index of the records by the current Sm)u9
c;9.KCpwx
query */ [KSH~:h:NR
privateint beginIndex; )qv2)a!H
Tg0CE60"
QOH<]~3J
/** The default constructor */ Ke!'gohv
public Page(){ X3',vey
dxK9:IX
} k=$AhT=e}n
1yMr~Fo
/** construct the page by everyPage 7VAJJv3
* @param everyPage b5<okICD
* */ ~Wei|,w'<
public Page(int everyPage){ /`3#4=5-
this.everyPage = everyPage; FQk!d$BG
} ?{6s58Q{
I`T1Pll
/** The whole constructor */ BJk
Z2=
public Page(boolean hasPrePage, boolean hasNextPage, zU&L.+
2z\e\I
MG{l~|\x)
int everyPage, int totalPage, I-DXb
M
int currentPage, int beginIndex){ 8PBvV[
this.hasPrePage = hasPrePage; :5b0np!
this.hasNextPage = hasNextPage; ~E)fpGJ
this.everyPage = everyPage; 9%tobo@J~n
this.totalPage = totalPage; eM2|c3/
this.currentPage = currentPage; 'RbQj}@x
this.beginIndex = beginIndex; * ?]~
#
} +.kfU)6@
U>a\j2I
/** Jxa4hM0
* @return Yf}xwpuLk
* Returns the beginIndex. *z8|P#@
*/ 0^3+P%(o@
publicint getBeginIndex(){ \~~ }N4
return beginIndex; sI LSey5`
} T^:fn-S}=
@1:0h9%
/** sOpep
* @param beginIndex <%P2qgz5
* The beginIndex to set. D+RiM~LH8
*/ xr%#dVk
publicvoid setBeginIndex(int beginIndex){ Ln!A:dP}c-
this.beginIndex = beginIndex; KC#/Z2A|<
} t e,[f
M{mSd2
/** =Vw
5q},3
* @return hgj <>H|
* Returns the currentPage. Iz@)!3h
*/ ;j%BK(5
publicint getCurrentPage(){ 2=iH$v
return currentPage; Vzl^Ka'
} VIJ<``9[
8gy_Yj&{P
/** gckI.[!b
* @param currentPage IzLQhDJ1
* The currentPage to set. X3%Ic`Lq#
*/ qfoD
publicvoid setCurrentPage(int currentPage){ {d<;BLA
this.currentPage = currentPage; F?-R$<Cn2~
} aZ|=(]
5ZY<JA3
/** oCS2E =O&
* @return nNt1C
* Returns the everyPage. Zd:Taieh@
*/ 0#*Lw }qi
publicint getEveryPage(){ c>"cX&
return everyPage; UVQ7L9%?f
} '#/G,%m<!i
kgi>}
%
/** [U/(<?F{(
* @param everyPage ._O
* The everyPage to set. ACq7dLys,B
*/ p< "3&HA
publicvoid setEveryPage(int everyPage){ eKvV*[Na
this.everyPage = everyPage; cLVe T
} :'iYxhM.V
=#gEB#$x:
/** wU\s;
dK
* @return 4m)OR
* Returns the hasNextPage. \>QF(J [8
*/ \</b4iR)LT
publicboolean getHasNextPage(){ *+)AqKP\Kv
return hasNextPage; XolZonJr
} f"1>bW>R+
*3/T;x.
/** ]n."<qxeT
* @param hasNextPage 6GPp>X
* The hasNextPage to set.
Q6'x\
*/ YH&bD16c3
publicvoid setHasNextPage(boolean hasNextPage){ 9o*,P,j'}
this.hasNextPage = hasNextPage; 6(d }W2GP
} Rp7ntI:
rE9I>|tX
/** 29CINC
* @return a]
=
* Returns the hasPrePage. jO*l3:!~ \
*/ UhA"nt0
publicboolean getHasPrePage(){ @c9^q>Uv
return hasPrePage; Jc&y9]
} lKZB?Kk^w\
s, k
/** Sf5X3,Uw
* @param hasPrePage p~HW5\4
* The hasPrePage to set. evkH05+;W
*/ 4SPy28<f
publicvoid setHasPrePage(boolean hasPrePage){ h.O$]:N
this.hasPrePage = hasPrePage; =0uAE7q(9
} !$N<ds.
EnOU?D
/** ib{-A&
* @return Returns the totalPage. N_:qRpp6i
* _=CZR7:O
*/ ;qH O OT
publicint getTotalPage(){ U!U$x74D5
return totalPage; "BX!
} {ZY+L;eg1
P) 3mX.(}
/** .`>y@p!
* @param totalPage [q !TIq
* The totalPage to set. ^&y$Wd]6
*/ ,|&9M^
publicvoid setTotalPage(int totalPage){ (=~&+z
this.totalPage = totalPage; Xd^\@
} .{y
uo{u
y~()|L[
} 3Zi@A4Wu
RV@*c4KvO+
lz1wO5%h
"*G.EiLq
-D6exTxh"
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 vWGwVH/K
r@ZJ{4\Q
个PageUtil,负责对Page对象进行构造: u\eEh*<7q
java代码: e=O,B8)_
*/|BpakD<
yj^+G
/*Created on 2005-4-14*/ $56,$K`H
package org.flyware.util.page; GnvL'ESa@M
bw\@W{a%q
import org.apache.commons.logging.Log; O)vp~@|
import org.apache.commons.logging.LogFactory; b0oMs=uBn
-[-wkC8a
/** RjN{%YkXe
* @author Joa rtc9wu
* l\C.",CEcc
*/ =UV`.d2[
publicclass PageUtil { u*hSj)vr1
>$4d7.^hb/
privatestaticfinal Log logger = LogFactory.getLog !"Oh36
:0h_K
(PageUtil.class); G37U6PuZi
'3uVkp 6tF
/** 8@tV9+u
* Use the origin page to create a new page kh`"WN Nt
* @param page eH{[C*
* @param totalRecords 8YbE`32
* @return yj\Nkh
*/ :Y [LN
publicstatic Page createPage(Page page, int &Y }N|q-
#'y#"cmQ.
totalRecords){ >rf'-X4n
return createPage(page.getEveryPage(), ~;N^g4s
pej|!oX
page.getCurrentPage(), totalRecords); >6?__v]9G
} ,k;^G><
=
[EKQR>s)
/** "yS _s
* the basic page utils not including exception }"|K(hq
,'u W*kx
handler h D/*h*}T>
* @param everyPage nR-YrR*k
* @param currentPage -X"p:=;j
* @param totalRecords }R{ts
* @return page \pVXimam
*/ r4SXE\
G
publicstatic Page createPage(int everyPage, int #~
)IJ
V{!J-nO
currentPage, int totalRecords){ *+#8mA(
everyPage = getEveryPage(everyPage); J|qZ+A[z
currentPage = getCurrentPage(currentPage); ax<?GjpM
int beginIndex = getBeginIndex(everyPage, LA}Syt\F
9@Jtaq>jf
currentPage); Hhcpp7cr'
int totalPage = getTotalPage(everyPage, rp;b" q
}F#okU
totalRecords); ,Pdf,2
boolean hasNextPage = hasNextPage(currentPage, uo@n(>}EL
'2 PF
totalPage); fR(d
boolean hasPrePage = hasPrePage(currentPage); uc){+'[
3R.W>U
returnnew Page(hasPrePage, hasNextPage, U`2e{>'4t
everyPage, totalPage, T[g[&K1Y
currentPage, 5?]hd*8
T9Nb`sbV]
beginIndex); K/|Z$4S
} x$6^R q>2
`ojoOB^L
privatestaticint getEveryPage(int everyPage){ E2Q[ZoVS
return everyPage == 0 ? 10 : everyPage; !1$])VQWI
} ~Vr.J}]J
)p<ExMIxd
privatestaticint getCurrentPage(int currentPage){ ~?K ~L~f5
return currentPage == 0 ? 1 : currentPage; 0.8 2kl
} }&wUr>=
^c9t'V`IWQ
privatestaticint getBeginIndex(int everyPage, int CEX"D`
t.xxSU5~%
currentPage){ AP'*Nh@Ik(
return(currentPage - 1) * everyPage; I|^;B8[
} B><d9d
iKX-myCz
privatestaticint getTotalPage(int everyPage, int ]&lY%"U$i
^hZ0IM
totalRecords){ )b)-ZS7
int totalPage = 0; xc=b
|:A
^")Q YE
if(totalRecords % everyPage == 0) lh7jux
totalPage = totalRecords / everyPage; Nn!+,;ut
else W*Zkc:{eB
totalPage = totalRecords / everyPage + 1 ; old(i:2
: y%d
return totalPage; g/CSGIIT
} S[PE$tYT#t
0jy2H2
privatestaticboolean hasPrePage(int currentPage){ >0ow7Uw;
return currentPage == 1 ? false : true; 8%A#`)fb
} '>-gi}z7
I ?gSG*m
privatestaticboolean hasNextPage(int currentPage, (nf~x
Z2qW\E^_r
int totalPage){ /5(Yy}
return currentPage == totalPage || totalPage == Azl&m