Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 ua%$r[
^#T@NN0T
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 p^~AbU'6~
qcSlY&6+
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 JgJ4RmH-
0HA`
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 eot]VO:
g?.ls{H
。 3?F*|E_
XjL)WgQ{i
分页支持类: dBKL_'@@}
KErQCBeJ
java代码: Lj"@JF;c
t%$>
X\:;A {
package com.javaeye.common.util; r%*,pN7O
uz6S7I
import java.util.List; S:IhJQ4K
qU(,q/l
publicclass PaginationSupport { 3 xSt -MA
-\OvOkr
publicfinalstaticint PAGESIZE = 30; fz[o;GTc
kQ5mIJ9(
privateint pageSize = PAGESIZE; LD]a!eY
3":vjDq$
privateList items; U_t[J|
.tv'`
privateint totalCount; /gWaxR*m
50#iC@1
privateint[] indexes = newint[0]; uHj"nd13
`52+.*J+%
privateint startIndex = 0; \':'8:E
q#RUL!WF7U
public PaginationSupport(List items, int lxIoP
s9R#rwIc
totalCount){ J!40`8i
setPageSize(PAGESIZE); OIpkXM
setTotalCount(totalCount); zPzy0lx
setItems(items); &\8qN_`
setStartIndex(0); _Mi`]VSq9
} ]}t6V]`Q
J:<mq5[
public PaginationSupport(List items, int .E H&GX
3
q1LIM
totalCount, int startIndex){ l`S2bb6uMR
setPageSize(PAGESIZE); #aX+?z\4
setTotalCount(totalCount); )k)HQcfjD
setItems(items); }H^h~E
setStartIndex(startIndex); h0m+u}oP_H
} z'=8U@P'#
{kCCpU
public PaginationSupport(List items, int a_jw4"Sb
|\/`YRg>
totalCount, int pageSize, int startIndex){ ~m:oJ+:O
setPageSize(pageSize); (}Q(Ux@X
setTotalCount(totalCount); >KPxksFR8
setItems(items); 0, b.;r
setStartIndex(startIndex); vO>Fj
} K/xn4N_UX
99<]~,t=5
publicList getItems(){ Gw!VPFV>W
return items; sIUhk7Cd8
} =35g:fL
/V-uo(n< .
publicvoid setItems(List items){ {zd07!9y
this.items = items; O+iNR9O
} ''t\J^+&
bSa%?laS
publicint getPageSize(){ }
Xbmb8
return pageSize; j<"@Y7
} /e/%mo
E}?n^Zf
publicvoid setPageSize(int pageSize){ R;mA2:W)x
this.pageSize = pageSize; W|X=R?*ZK
} J,iS<lV_
Fru&-T[
publicint getTotalCount(){ ?3[Gh9g`
return totalCount; p**Sd[|
} {KQ-QKxxS
>:o$h2
publicvoid setTotalCount(int totalCount){ {}.M(nPtv;
if(totalCount > 0){ 7+!FZo{?
this.totalCount = totalCount; dC'8orFG+
int count = totalCount / `O+}$wP
qQ&=Z`p!
pageSize; eELLnU{"
if(totalCount % pageSize > 0) d-X6yRjnj
count++; 8dPDs#Zl
indexes = newint[count]; |Y-{)5/5}
for(int i = 0; i < count; i++){ "SMRvi57T
indexes = pageSize * hFMJDGCw>Q
ke2zxX2f
i; ;H' ,PjU
} ys/U.e|)!
}else{ 7%j1=V/
this.totalCount = 0; 1U)U {i7j
} h(~@
nd{
} wH?]kV8Q
dDu8n+(8 L
publicint[] getIndexes(){ > J.q3
return indexes; *XUJv&ZN
} ^;8dl.;
:9H`O!VF
publicvoid setIndexes(int[] indexes){ HNUpgNi
this.indexes = indexes; i'cGB5-j
} ]EN+^i1F[
"]SA4Ud^
publicint getStartIndex(){ rF^H\U:w
return startIndex; .8%&K0
} r+Pfq[z&
R|m!*B~
publicvoid setStartIndex(int startIndex){ ;S_Imf0$v
if(totalCount <= 0) 2y"L&3W
this.startIndex = 0; ]
/"!J6(e
elseif(startIndex >= totalCount) *P01 yW0
this.startIndex = indexes Yt!o
Hn
C1`fJhy
[indexes.length - 1]; &gLXS1O
elseif(startIndex < 0) 9kzJ5}
this.startIndex = 0; V3S"LJ
else{ uQhI)
this.startIndex = indexes c)j60y
1b=,lm
[startIndex / pageSize]; 49o /S2b4z
} W-RqooEv
} lRANXM
/Moyn"Kj{
publicint getNextIndex(){ $6l^::U
int nextIndex = getStartIndex() + N,bH@Q.Ci
Hg~8Td**
pageSize; >qy$W4
if(nextIndex >= totalCount) \b;z$P\+*
return getStartIndex(); qV#,]mX
else cy64xR BB
return nextIndex; Qef5eih
} 6ys|'<?
6vfut$)[{
publicint getPreviousIndex(){ {1"kZL
int previousIndex = getStartIndex() - u0Bz]Ux/Q
`t7z
LC^c
pageSize; K_Pbzj4(P
if(previousIndex < 0) csFLBP
return0; h1~/zM/`
else 7](aPm8
return previousIndex; \zJb}NbnT
} ms&6N']
r0Zj'F_e
} tXCgRU
HGao} @'
/[qLf:rGI
{,=U]^A
抽象业务类 2Rqpok4
java代码: "]bOpk T
$ba*=/{[q
>~l^E!<i-u
/** #[&9~za'"m
* Created on 2005-7-12 (GoxiX l
*/ jL{k!V`s
package com.javaeye.common.business; Bdcs}Ga
I{$TMkh[
import java.io.Serializable; ctoh&5%!n+
import java.util.List; Ub{7 Xk
n
|fB/ hs \
import org.hibernate.Criteria; l h?[wc
import org.hibernate.HibernateException; D4T42L
import org.hibernate.Session; 5FVmk5z]d
import org.hibernate.criterion.DetachedCriteria; q:1n=iEi
import org.hibernate.criterion.Projections; pK"iTc#\X
import v*kX?J#]5
g;7W%v5wqk
org.springframework.orm.hibernate3.HibernateCallback; U
UhlKV|5
import )+Yu7=S
*qJHoP;
org.springframework.orm.hibernate3.support.HibernateDaoS Mn 8|
Knh
V$_.&S?(Y
upport; #h#_xh'
bt"5.nm
import com.javaeye.common.util.PaginationSupport; !ir%Pz^)
Elt"tJ
public abstract class AbstractManager extends 9+b){W
tmQ,>
HibernateDaoSupport { #bS}?fj
!y862oKD
privateboolean cacheQueries = false; t9.| i H
(+nnX7V?I
privateString queryCacheRegion; w5vzj%6i
DH"_.j
publicvoid setCacheQueries(boolean q>6RO2,
~Zw37C9J
cacheQueries){ !iL6 /
this.cacheQueries = cacheQueries; y[/:?O}g4
} vs{VRc
dtBr#Te
publicvoid setQueryCacheRegion(String fRwr}n'
XaaR>HljJ
queryCacheRegion){ q#F+^)DD [
this.queryCacheRegion = hT%
>)71
~wu\j][2
queryCacheRegion; yuhY )T
} xJin%:O
<r)5jf
publicvoid save(finalObject entity){ Zul@aS
!
getHibernateTemplate().save(entity); gX`C76P!
} {*"\68e
N"7BV
publicvoid persist(finalObject entity){ (_Th4'(@Y
getHibernateTemplate().save(entity); /GF"D5
} %Q=rm!Syv
]l"9B'XR
publicvoid update(finalObject entity){ SB:z[kfz|
getHibernateTemplate().update(entity); )K]<\Q[
} " eS-i@
Z?qc4Cg
publicvoid delete(finalObject entity){ lpjby[S
getHibernateTemplate().delete(entity); FjW%M;H
} :|-^et]a8
7HJH9@8V
publicObject load(finalClass entity, #@F
RLO<5L
finalSerializable id){ @cQ
|`
return getHibernateTemplate().load BnG{)\s
d>0 j!+s
(entity, id); ;)vs=DK:)
} 4O4}C#6(4
)"g @"LJ=
publicObject get(finalClass entity, 8mC$p6Okd
(S_1C,
finalSerializable id){ t1p[!53(
return getHibernateTemplate().get @vO~'Xxq!
Hn]6re
(entity, id); ItE)h[86
} D 77$aCt
P)[QC
publicList findAll(finalClass entity){ WHr:M/qD
return getHibernateTemplate().find("from (hIe!"s*
aN';_tGvK
" + entity.getName()); } :T}N]
} gu1n0N`b
!N/?b^y
publicList findByNamedQuery(finalString 0IQ|`C.
]{AHKyA{:
namedQuery){ ~7H?tp.Dw
return getHibernateTemplate T^g i^{
4rypT-%^ ;
().findByNamedQuery(namedQuery); GXR7Ug}k
} \,G19o}`Es
U8eU[|-8O/
publicList findByNamedQuery(finalString query, &D` $YUl@
]_hXg*?
finalObject parameter){ ^AT#A<{1(
return getHibernateTemplate nIl<2H]F`
m@yx6[E#
().findByNamedQuery(query, parameter); #B__-"cRv
} 7 .xejz
7??j}ob>
publicList findByNamedQuery(finalString query, P9]95.j
^mZTki4
finalObject[] parameters){ 9$^v*!<z\
return getHibernateTemplate ?xt${?KP
_mDvRFq
().findByNamedQuery(query, parameters); R/&C}6Gn
} }S9uh-j6l
h=_h,?_
publicList find(finalString query){ _2eL3xXha.
return getHibernateTemplate().find wQU-r|
^ |>)H
(query); wtQ (R4
} TZ:dY x
9-?kamA
publicList find(finalString query, finalObject y9Q"3LLic`
Rp.FG
parameter){ F:-6Htmj
return getHibernateTemplate().find ;W!hl<``d*
!Op18hP$
(query, parameter); gC/-7/}
} fG /wU$B
eS"sd^;R
public PaginationSupport findPageByCriteria Ay\!ohIS3
Mp^U)S+
(final DetachedCriteria detachedCriteria){ mGUl/.;yp-
return findPageByCriteria #J4,mFMr
"#`c\JuR]
(detachedCriteria, PaginationSupport.PAGESIZE, 0); }q~xr3#
} :w4I+*]
z|G 39
public PaginationSupport findPageByCriteria .w)T2(
Jm}zit:o
(final DetachedCriteria detachedCriteria, finalint @_Ly^'
"
Oxf,2r
startIndex){ h_h6@/1l
return findPageByCriteria }u'O<d~z?
Uf-`g>
(detachedCriteria, PaginationSupport.PAGESIZE, DYCXzFAa
(9D,Ukw
startIndex); 3yIC@>&y(8
} cWL7gv\|
{%z}CTf#
public PaginationSupport findPageByCriteria hH@pA:`s
bq`0$c%hN
(final DetachedCriteria detachedCriteria, finalint h>K%OxR
LL=nMoS
pageSize, Jx= v6==7
finalint startIndex){ h2edA#bub
return(PaginationSupport) 6b#J!:?
610hw376B
getHibernateTemplate().execute(new HibernateCallback(){ oNBYJ]t
publicObject doInHibernate Gex%~';+q
(
j~trpe,
(Session session)throws HibernateException { ]6EXaf#
Criteria criteria = 5>[j^g+@
>a1ovKF
detachedCriteria.getExecutableCriteria(session); AT,?dxP J
int totalCount = h3:dO|Z
|CjE}5Op>
((Integer) criteria.setProjection(Projections.rowCount W,)qE^+
dKTUW<C
()).uniqueResult()).intValue(); p uLQ_MNV
criteria.setProjection as| MB
(
`F1 ( v
(null); ;u: }rA)
List items = iG;GAw|E
Xa32p_|5~
criteria.setFirstResult(startIndex).setMaxResults @Y2&v956
]Q\/si&
(pageSize).list(); IK^jzx
PaginationSupport ps = YNi3oG]h
O}_Z"y
new PaginationSupport(items, totalCount, pageSize, >|So`C3:e
nLjo3yvV..
startIndex); h|Uy!?l
return ps; K-*q3oh
G
} u.sn"G-c
}, true); 6~v|pA jY
} /h'b,iYVV
(Dx]!FFz
public List findAllByCriteria(final y|@=j~}Zq
k"2xyzt*
DetachedCriteria detachedCriteria){ *QpKeI
return(List) getHibernateTemplate I|?Z.!I|
5zH?1Z~*
().execute(new HibernateCallback(){ O~AOZ^a:2
publicObject doInHibernate hkL[hD
B]YY[i
(Session session)throws HibernateException { yjP;o`z%
Criteria criteria = (S#4y
?(CMm%(8
detachedCriteria.getExecutableCriteria(session); 8"g.Z*
return criteria.list(); e
RjpR?!\
} N;6WfdA-
}, true); H A(e
} ! G+/8Q^
Q!VPk~~(
public int getCountByCriteria(final xl$#00|y
Y-WYQ{
DetachedCriteria detachedCriteria){ Q[k7taoy
Integer count = (Integer) L_YVe(dT
T+[N-"N
getHibernateTemplate().execute(new HibernateCallback(){ j@b4)t
publicObject doInHibernate *:}NS8hP
ZrFC#wJb
(Session session)throws HibernateException { {^#62Y
Criteria criteria = x1kb]0s<-
DN@T4!
detachedCriteria.getExecutableCriteria(session); kEE8cW3
return \}e1\MiZ
dEp?jJP$;
criteria.setProjection(Projections.rowCount +)fl9>Mb
!:mo2zA
()).uniqueResult(); 0VB~4NNR
} rsR0V+(W
}, true); !s]LWCX+|
return count.intValue(); QMfa~TH#p
} j [h4F"`-
} r^k:$wJbRK
5Qik{cWxBq
6 /Apdn1[
rnVh
]xJ
#U NTD4
TK;*:K8oe
用户在web层构造查询条件detachedCriteria,和可选的 T}X#I'Z
+M6qbIO
startIndex,调用业务bean的相应findByCriteria方法,返回一个 8eSIY17
*Ki ],>_~
PaginationSupport的实例ps。 u9FXZK7
qF(F<$B
ps.getItems()得到已分页好的结果集 )BY\c7SG
ps.getIndexes()得到分页索引的数组 J..>ApX
ps.getTotalCount()得到总结果数 OgfmyYMtc
ps.getStartIndex()当前分页索引 vb}; _/#?
ps.getNextIndex()下一页索引 sSi1;9^o
ps.getPreviousIndex()上一页索引 MX?K3=j @>
"}]1OL S V
pCNihZ~
M ,8r{[2
":*PC[)W
;jTP|q?|{
hp}J_/+4n
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 @U%I 6 t
~n84x
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 Ak$ghb
V$+xJ m
一下代码重构了。 z.:{
JI}(R4uV
我把原本我的做法也提供出来供大家讨论吧: Wr7^
a'ViyTBo
首先,为了实现分页查询,我封装了一个Page类: A:EF#2)g
java代码: DA@YjebP'
s,Cm}4L6
SQ)$>3>C
/*Created on 2005-4-14*/ l'(Cxhf.W
package org.flyware.util.page; {b>tX)Tep
Te~"\`omJ3
/** a$g4)0eS
* @author Joa d(w
$! $"h
* u7&r'rZ1_!
*/ 5DfAL;o!
publicclass Page { <$n%h/2%
WJZW5
Xt
/** imply if the page has previous page */ mk1;22o{TX
privateboolean hasPrePage; H>e?FDs0*R
F9ry?g=h
/** imply if the page has next page */ x{C=r dp__
privateboolean hasNextPage; ?MuM _6
qu8i Jq
/** the number of every page */ REhXW_x
privateint everyPage; Ix%h/=I
LKG],1n-
/** the total page number */ FK{YRt
privateint totalPage; ~!'%m(g
#H(|+WEu
/** the number of current page */ (j+C&*u
privateint currentPage; 7ju7QyR
Gu<3*@Ng
/** the begin index of the records by the current I~MBR2$9
yE-&TW_q:>
query */ @dcT8 YC
privateint beginIndex; _Q/D%7[pa
(^Xp\dyZL
pK4I?=A'
/** The default constructor */ m~#S76!w
public Page(){ '!Vn
*~M=2Fj;i
} <FMW%4
B} gi /
/** construct the page by everyPage nbw&+dcJ8
* @param everyPage F$ x@]
* */ Fg?Gx(g4
public Page(int everyPage){ qI<6% ^i
this.everyPage = everyPage; ,v$gQU2
} X}_}`wIn
Q$W0>bUP
/** The whole constructor */ U
n2xZ[4
public Page(boolean hasPrePage, boolean hasNextPage, JTpKF_Za<
B @UaaWh
'rRo2oTN
int everyPage, int totalPage, rOB-2@-
int currentPage, int beginIndex){ G!oq
;<
this.hasPrePage = hasPrePage; YU[93@mCh
this.hasNextPage = hasNextPage; 8[ 1D4d
this.everyPage = everyPage; a|32Pn
this.totalPage = totalPage; `Qv7aY
this.currentPage = currentPage; O qY8\>f-
this.beginIndex = beginIndex; gCgMmD=AZ
} 18Vtk"j
>c\'4M8Cz
/** i=reJ(y-
* @return ]~87v
* Returns the beginIndex. Us M|OH5k
*/ D<#+ R"
publicint getBeginIndex(){ "4H&wHhT!
return beginIndex; e\ k=T}
} 7<AHQ<#@
[L|H1ll
/** AGn:I??
* @param beginIndex LCRreIIgZ
* The beginIndex to set. @W=#gRqQPy
*/ >z
h
publicvoid setBeginIndex(int beginIndex){ ]o_Z3xXUa
this.beginIndex = beginIndex; ;)5d
wq
} hv}rA,Yd
#wNksh/J^
/** EkEM|<GNd
* @return AASw^A3p
* Returns the currentPage. z*YkD"]B
*/ %z J)mOu
publicint getCurrentPage(){ NM/?jF@j*
return currentPage; 5Qo\0YH
} ~LuZpV
IBf&'/ 8\
/** rv&(yA
* @param currentPage S$+vRX7
* The currentPage to set. ,4jkTQ*@2
*/ <G{m=
publicvoid setCurrentPage(int currentPage){ yd`xmc)
this.currentPage = currentPage; v6HBO#F'V{
} iT%aAVs
Va\dMv-b
/** qWGnIPk
* @return n(/(F`
* Returns the everyPage. V
z8o
*/ 5 1@V""m
publicint getEveryPage(){ |J'@-*5?[8
return everyPage; 0V"r$7(}
} Cv>|>Ob#
)(9>r/bq
/** ?&_ -,\t
* @param everyPage &kHp}\
* The everyPage to set. J i :2P*
*/
VD;Ot<%
publicvoid setEveryPage(int everyPage){ V2,54YE
this.everyPage = everyPage; U voX\
} GX&BUP\
-f#0$Z/0
/** "8&pT^
* @return 7!#x-KR~5
* Returns the hasNextPage. "nU5c4
*/ VljAAt
publicboolean getHasNextPage(){ @R_a'v-
return hasNextPage; 6,G1:BV{K
} BdG~y1%:
"2i{ L '
/** ZvpcjP
* @param hasNextPage sczN0*w&C
* The hasNextPage to set. ,u#uk7V
*/ =GL}\I
publicvoid setHasNextPage(boolean hasNextPage){ cZk?o
this.hasNextPage = hasNextPage; lt|\$Iy(
} |o6
h:g
XpdDIKMmE
/** #25Z,UU
* @return 6B)(kPW
* Returns the hasPrePage. ~.u}v~
F
*/ T(MS,AyD]
publicboolean getHasPrePage(){ Sav]Kxq{
return hasPrePage; -ZlBg~E
} zIi|z}WJ
=dHM)OXD"
/** wOOBW0tj
* @param hasPrePage 7cr@;%#
* The hasPrePage to set. V8ZE(0&II}
*/ wdS^`nz|
publicvoid setHasPrePage(boolean hasPrePage){ );_g2=:#
this.hasPrePage = hasPrePage; ]@Y8 !
,
} b4Br!PL@G
h$)(-_c3
/** ah1d0eP
* @return Returns the totalPage. G+stt(k:
* mp!KPw08':
*/ <{bQl
L
publicint getTotalPage(){ U s86.@|
return totalPage; klxVsx%I{G
} f_}/JF
nT..+J)
/** 9W:oo:dK F
* @param totalPage _T&?H
* The totalPage to set. SUINV_>7
*/ _G|hKk^,
publicvoid setTotalPage(int totalPage){ K 4QJDC8
this.totalPage = totalPage; HYyO/U9z|I
} p~6/+ap
"+/%s#&
} I 8vv
9un]}7^
z}.y
?#
j5,1`7\7B
Umjt~K^Z
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 veAg?N<c
p
RbzSQr>a\
个PageUtil,负责对Page对象进行构造: I|9(*tq)
java代码: HS XS%v/Y
f]`#BE)V
n0F.Um
/*Created on 2005-4-14*/ FRd!UqMXY
package org.flyware.util.page; (+68s9XS7
C93BK)$}
import org.apache.commons.logging.Log; Xf!@uS6<X
import org.apache.commons.logging.LogFactory; NUbw]Y90~
u~[HC)4(0
/** fuSfBtLPR#
* @author Joa LSQWveZz
* 59!yz'feF
*/ t~ruP',~\
publicclass PageUtil { $}V<Um
zI$^yk-vn
privatestaticfinal Log logger = LogFactory.getLog &E0L7?l
6E/>]3~!
(PageUtil.class); wwrP7T+d
dE19_KPm[j
/** "[2CV!_
* Use the origin page to create a new page l*>t@:2J
* @param page $3<,"&;Ecs
* @param totalRecords 6w(Mb~[n
* @return +KgoL a
*/ ZUP\)[~
publicstatic Page createPage(Page page, int M #'br<]
x;)bp7
totalRecords){ KY34Sc
return createPage(page.getEveryPage(), ]E'BFon
XI:8_F;Q
page.getCurrentPage(), totalRecords); pd{W(M78g
} K]ob>wPf
nwswy]e8/
/** +^ a9i5
* the basic page utils not including exception bP\0S@1YL
A]ZCQ49
handler QA>(}u\+
* @param everyPage qzS 9ls>>
* @param currentPage CF"$&+ s9
* @param totalRecords rCfr&>nn
* @return page <6QG7i
*/ uMVM- (g%
publicstatic Page createPage(int everyPage, int %|E'cdvkX
_Z?{&k
currentPage, int totalRecords){ `q|&;wP.
everyPage = getEveryPage(everyPage); mAMi-9
currentPage = getCurrentPage(currentPage); **_`AM~
int beginIndex = getBeginIndex(everyPage, D,q=?~
g?`g+:nug
currentPage); t\~lGG-p
int totalPage = getTotalPage(everyPage, i)9}+M5
;, P-2\V/
totalRecords); arJ4^ d
boolean hasNextPage = hasNextPage(currentPage, :MeshzWK
M2HO!btf
totalPage); K*iy ^}
boolean hasPrePage = hasPrePage(currentPage); Vcn04j#Q
Vij P;
returnnew Page(hasPrePage, hasNextPage, f0p+l-iEv
everyPage, totalPage, = ms(dr^n
currentPage, Rs_0xh
f?8cO#GU
beginIndex); }/~%Ysl
} L#sw@UCK
\{r-e
privatestaticint getEveryPage(int everyPage){ Ft%HWGE
return everyPage == 0 ? 10 : everyPage; vzV,}
S*c
} !wiW#PR
U
|I>CDp
privatestaticint getCurrentPage(int currentPage){ SY\ UuZ
return currentPage == 0 ? 1 : currentPage; S<}2y 9F
} 5v"r>q[
X
uD4=1g6[s
privatestaticint getBeginIndex(int everyPage, int !`5[(lm
pRI<L'
currentPage){ @P=St\;VP
return(currentPage - 1) * everyPage; OS8 ^mC
} I)#=#eI*:
iEx.BQ+
privatestaticint getTotalPage(int everyPage, int &:}e`u@5|
v{{Cj83S+
totalRecords){ L%](C
int totalPage = 0; kwxb~~S}h(
dxqVZksg(9
if(totalRecords % everyPage == 0) @X`~r8&
totalPage = totalRecords / everyPage; b3(pRg[Fp
else BiGB<Jr
totalPage = totalRecords / everyPage + 1 ; p@epl|IZp
VBc[(8o
return totalPage; eduaG,+k7p
} \#4??@+Xf
z_%G{H+:l
privatestaticboolean hasPrePage(int currentPage){ 6k6M&a
return currentPage == 1 ? false : true; / hUuQDJ
} 5G .Fi21
b
Bz}Dgbb
privatestaticboolean hasNextPage(int currentPage, fw>@:m_bK
C${{&$&