Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 LLKYc y
<kk!ns I
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 1xr2x;
(I#mo2
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 BT`g'#O
os7xwI;T
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 ia (&$a8X
ROXa/
。 ~uV(/?o%
FU(2,Vl
分页支持类: gLRDd~H
Omi/sKFMi
java代码: gZiwXb
X:lStO#5
Y^nm{ ;G+
package com.javaeye.common.util; 8rjD1<
tyWDa$u,u
import java.util.List; d0i|^
lwz\"8
publicclass PaginationSupport { a;v4R[lQ
;!C_}P
publicfinalstaticint PAGESIZE = 30; +&dkJ 4g[
{5fL!`6w
privateint pageSize = PAGESIZE; O~v~s
'c&
!
,0
privateList items; :[CEHRc7x
mlPvF%Ba
privateint totalCount; ` Z/ MQ
e0#t
privateint[] indexes = newint[0]; (L1F],Au
>_\[C?8
privateint startIndex = 0; 4*D"*kR;
/2
hk 9XM
public PaginationSupport(List items, int V/:2xT
9 r&JsCc
totalCount){ $$uMu{?0i
setPageSize(PAGESIZE); )Ay 90Wt
setTotalCount(totalCount); 1J72*`4OK
setItems(items); S;y4Z:!
setStartIndex(0); E [6:}z<
} 'kco.
1{
f$ tm<:)Y
public PaginationSupport(List items, int T:Ovh.$
mYj)![
totalCount, int startIndex){ GwfC l{l
setPageSize(PAGESIZE); ksCF"o/@V
setTotalCount(totalCount); ;4(}e{
setItems(items); x7Gf):,LK
setStartIndex(startIndex); ktS^^!,l%
} L|}s Z\2!
aj,o<J
public PaginationSupport(List items, int qGX#(,E9;
B^]PKjLNZ
totalCount, int pageSize, int startIndex){ ;TS%e[lFhQ
setPageSize(pageSize); H
cyoNY
setTotalCount(totalCount); [qC0YM
setItems(items); Nd+1r|e'
setStartIndex(startIndex); ?Pa(e)8\
} u>G9r#~`k
9zS
publicList getItems(){ =*I|z+
return items; 8]exsnZ
} ,Si{]y
*nHuGla
publicvoid setItems(List items){ D,R',(3
this.items = items; Wy*+8~@A
} dgIH`<U$
9X%:
){
publicint getPageSize(){ 0?(uqjD:
return pageSize; Goc?HR
} w^ OB
096Yd=3h
publicvoid setPageSize(int pageSize){ H1 7I"5N
this.pageSize = pageSize; "bDj00nwh
} }]PHE(}7
\D(3~y>
publicint getTotalCount(){ ajtH1Z#
return totalCount; <nN.$4~X
} 5OtdB'UITd
oC*a;o
publicvoid setTotalCount(int totalCount){ # =tw
,S
if(totalCount > 0){ Z/:F)c,x
this.totalCount = totalCount; )5LT!14
int count = totalCount / 6_])(F3+w.
y(MB_B7j
pageSize; o5
fV,BJZO
if(totalCount % pageSize > 0) [U8/nT
count++; '?mF,Co{
indexes = newint[count]; V-@4s}zX
for(int i = 0; i < count; i++){ e,VF;Br
indexes = pageSize * U1X"UN)
86N,04
i; fZ5 UFq_~s
} 83SK<V6
}else{ IQ~qiFCf
this.totalCount = 0; 9#@s(s
} bT&{8a
} ` =P_ed%&'
R:YVmqd
publicint[] getIndexes(){ FZ?eX`,
return indexes; !C05;x8{
} Zfcf?&><
i9XpP(mf
publicvoid setIndexes(int[] indexes){ Z#-N$%^F
this.indexes = indexes; kx?Yin8K
} [M,4qe8,}
`D
|/g;
publicint getStartIndex(){ =CRptk6tS
return startIndex; b<~-s sL7a
} bTmhz
8K?}!$fz
publicvoid setStartIndex(int startIndex){ ThgJ
'
if(totalCount <= 0) g:a[N%[C
this.startIndex = 0; W
h 9L!5
elseif(startIndex >= totalCount) ;"x+V gS'
this.startIndex = indexes S-88m/"]s
qbfX(`nS
[indexes.length - 1]; q%e'WM G~n
elseif(startIndex < 0) (C#0
ML
this.startIndex = 0; >MN"87U6
else{ ;Vat\,45pg
this.startIndex = indexes JJ
?'<)EF
(0b\%;}
[startIndex / pageSize]; 7=^}{
} a-Y6ghs
} un_NBv}
|
U"fhG=g
publicint getNextIndex(){ EI6kBRMo
int nextIndex = getStartIndex() + J(d[05x0
Ih|4ISI
pageSize; a;Y:UwD9*
if(nextIndex >= totalCount) &RARK8^
return getStartIndex(); 1Ub=RyB
else 9QXsbd6
return nextIndex; aH?Ygzw
} <_<zrXc]
g"5Kth
publicint getPreviousIndex(){ T=tW'tlT\v
int previousIndex = getStartIndex() - v0oVbHO5<
'QG`^@Z
pageSize; >pLJ ,Z
if(previousIndex < 0) )MF@'zRK
return0; SfC* ZM}<
else ||QK)$"
return previousIndex; O}Pqbx&
} cMZy~>
2SC-c `9)
} YR-G:-(#b
$M,<=.oT
7)jN:+4N
ZH;4e<gg
抽象业务类 MWA,3I\.
java代码: sIf]e'@AC
F&R*njJcc
zgEN2d
/** 0a{hCx|$J
* Created on 2005-7-12 7`J2/(
*/ 'hU5]}=
package com.javaeye.common.business; )~=8Ssu
U'ctO%
import java.io.Serializable; 2K};-}eW
import java.util.List; <hCO-r#
Vf pT5W<
import org.hibernate.Criteria; ydYsmTr
import org.hibernate.HibernateException; ?8H{AuLB
import org.hibernate.Session; Y?J/KW3
import org.hibernate.criterion.DetachedCriteria; lr~
|=}^
import org.hibernate.criterion.Projections; "/e)v{
import 4x[_lsj
rIcgf1v70
org.springframework.orm.hibernate3.HibernateCallback; \z.bORy
import ~:7y!=8#
R)JH D7
1
org.springframework.orm.hibernate3.support.HibernateDaoS Dh2Cj-|
~
U52V1b
upport; L}rZ1wV6
27ZqdHd
import com.javaeye.common.util.PaginationSupport; 4!!PrXE
Zw0KV%7hD
public abstract class AbstractManager extends =YgH-{
9h\RXVk{tA
HibernateDaoSupport { Jk>vn+q8P^
_|I8+(~)
privateboolean cacheQueries = false; ["Ts7;q9[
Y,0Z&6 <
privateString queryCacheRegion; 2H.g!( Oza
/}~=)QHH
publicvoid setCacheQueries(boolean E7iAN\vo
3W[?D8yi)
cacheQueries){ ,Kj>F2{
this.cacheQueries = cacheQueries; a)pc+w#
} mbkt7. ,P
/Z:NoTGn
publicvoid setQueryCacheRegion(String KF+r25uy[+
aUEr& $
queryCacheRegion){ AH&RabH2
this.queryCacheRegion = uthW
AT &
r+C4<-dT
queryCacheRegion; z8t;jw
} Fnak:R0
Ez|NQ:o
publicvoid save(finalObject entity){ 3JQ7Cc>
getHibernateTemplate().save(entity); xtP:Q9!N
} zw15r" R
) dk|S\
publicvoid persist(finalObject entity){ 9!X3Cv|+L
getHibernateTemplate().save(entity); v%cCJ SO#
} B_ict)}ld
!xck
~EAS
publicvoid update(finalObject entity){ Z[*unIk
getHibernateTemplate().update(entity); p=nbsS~":
} 5Z_C(5)/Y
zTB&Wlt
publicvoid delete(finalObject entity){ ^zV_vB)n
getHibernateTemplate().delete(entity); C\5G43`
} QyVAs ;
bVU4H$k
publicObject load(finalClass entity, /_m)D;!y
&^#iS<s1
finalSerializable id){ Fdhgm{Y2s
return getHibernateTemplate().load R`<2DC>h9
kVWcf-f
(entity, id); gyAJ#N|
} [G$ #jUt/O
Rmmu#-{Y
publicObject get(finalClass entity, 4t(/F`
hH5~T5?\
finalSerializable id){ g?"QahHG
return getHibernateTemplate().get 7!cLTq
\_,p@r]Q
(entity, id); q,)V0Ffe[|
} V5ZC2H
E} XmZxHV
publicList findAll(finalClass entity){ 0ex.~S_Oj4
return getHibernateTemplate().find("from \7b, Mz!
[k%hl`}
" + entity.getName()); 3E;@.jD
} KHZ[drb6$
.kU^)H"l
publicList findByNamedQuery(finalString $|g1 _;(G
~)_Nh
namedQuery){ K0(
S%v|,}
return getHibernateTemplate e%)iDt\j
n?cC]k;P~
().findByNamedQuery(namedQuery); $Okmurnn
} .5a>!B.I
_2G _Io
publicList findByNamedQuery(finalString query, -W^{)%4g
$]_SPu
finalObject parameter){ rwXpB<@l@
return getHibernateTemplate 03 gbcNo
#T8o+tv
().findByNamedQuery(query, parameter); 7uc\AhOk6
} W
!j-/ql
7mYcO3{5{
publicList findByNamedQuery(finalString query, +^(_S9CO
-(?/95 Y
finalObject[] parameters){ @-[}pZ/
return getHibernateTemplate 9#U]?^DJ@
qzNb\y9G
().findByNamedQuery(query, parameters); Jyg1z,B <
} ?SgFD4<~P
WeRDaG
publicList find(finalString query){ #d$zW4ur2
return getHibernateTemplate().find GalSqtbmDt
gNP1UH4m
(query); Z(|$[GZP[
} nm#23@uZ4K
WRu(F54Sk
publicList find(finalString query, finalObject 9R8q+2
0,RYO :`
parameter){ 5@>hjXi"Y
return getHibernateTemplate().find r2\%/9uO
r]cq|Nv8:
(query, parameter); h +B7BjA>G
} Rw0|q
^yB]_*WJ
public PaginationSupport findPageByCriteria lgiKNZgB?
x+4K ,r;
(final DetachedCriteria detachedCriteria){ |x1OWm1:<
return findPageByCriteria t'eu>a1D
i
kfJ! f
(detachedCriteria, PaginationSupport.PAGESIZE, 0); K_L7a>Fr
} $7AsMlq[(
I1>f2/$z*
public PaginationSupport findPageByCriteria Cydo~/
u|}\Af
(final DetachedCriteria detachedCriteria, finalint 3>VL>;75[
GYQ:G=
startIndex){ A@<
! '
return findPageByCriteria #1$4<o#M
M5:.\0_
(detachedCriteria, PaginationSupport.PAGESIZE, 3Ed
?P[:,0_
startIndex); q-Z<.GTq
} m-uXQS^@G
Vc9Bg2f5
public PaginationSupport findPageByCriteria 1(Vv-bq$
heIys.p
(final DetachedCriteria detachedCriteria, finalint D+uo gRS61
v[uVAbfQ
pageSize, j;}-x1R
finalint startIndex){ s:6K'*
return(PaginationSupport) d)uuA;n
ZVH 9je
getHibernateTemplate().execute(new HibernateCallback(){ )x\%*ewY
publicObject doInHibernate P<R^eLZ<&
DI8I'c-P
(Session session)throws HibernateException { Wtu-g**KN
Criteria criteria = [VXQ&
Ao?b1VYy/
detachedCriteria.getExecutableCriteria(session); @xo8"kl
int totalCount = |GQq:MB;z
W gyRK2#!
((Integer) criteria.setProjection(Projections.rowCount `?=3[
bTeuOpp
()).uniqueResult()).intValue(); I(VqtC:K.
criteria.setProjection KB~[nZs7
'v Vt^h2
(null); b&`~%f-
List items = >(H:eRKq
x/{-U05
criteria.setFirstResult(startIndex).setMaxResults m_Hg!Lg
:a&M]+!
(pageSize).list();
5:gpynE|
PaginationSupport ps = 2&S^\kf
qfT9g>EF
new PaginationSupport(items, totalCount, pageSize, c}OveR$'&
[F*yh9%\
startIndex); ^n~Kr1}nj
return ps; *<cRQfA1
} e:-pqZT`
}, true); ]~
N.
} "Fmq$.$%
=AaF$R
public List findAllByCriteria(final JQbaD-
+?6]Vu&|f
DetachedCriteria detachedCriteria){ SPb`Q"
return(List) getHibernateTemplate ?3DFm
5u9 lKno
().execute(new HibernateCallback(){ ("=q-6$G
publicObject doInHibernate J ##a;6@
Y_]y :H
(Session session)throws HibernateException { h/C{
Criteria criteria = AUF[hzA
do^=Oq07$
detachedCriteria.getExecutableCriteria(session); /z^v%l
return criteria.list(); th*!EFA^o
} vh2/d.MO
}, true); tlO=>
} ES,JdImZ|
k"[AV2UW1
public int getCountByCriteria(final !Usmm8!K
8?L-3/
DetachedCriteria detachedCriteria){ ,~$sJ2
g7
Integer count = (Integer) h-(NWxK+
+ rB3\R"d
getHibernateTemplate().execute(new HibernateCallback(){ p
Cx_[#DrP
publicObject doInHibernate EK>x\]O%T
4Kj8i
(Session session)throws HibernateException { =zAFsRoD_B
Criteria criteria = ?8grK
=\8 x
detachedCriteria.getExecutableCriteria(session); )$Ib6tYY
return ]Y$Wv9S6
\l0!si
criteria.setProjection(Projections.rowCount h] )&mFiE"
G$*=9`
()).uniqueResult(); jm&[8ApW
} .3+8Ip#z
}, true); ,>(X}Q
return count.intValue(); zuMz6#aCC8
} `TF3Ho\MC
} a>#$&&oQ0
sDgo G
.yTo)t
3k6Dbz
ZiKO|U@/
uHf1b?W
用户在web层构造查询条件detachedCriteria,和可选的 .I{u[
"
K
..Pn17t
startIndex,调用业务bean的相应findByCriteria方法,返回一个 l8M}82_
'Eia=@
PaginationSupport的实例ps。 DfkGNBY
@CR<&^s5V
ps.getItems()得到已分页好的结果集 #l)o<Z
ps.getIndexes()得到分页索引的数组 wk'(g_DP
ps.getTotalCount()得到总结果数 D)L~vA/8b
ps.getStartIndex()当前分页索引 jbg9EtQ!*
ps.getNextIndex()下一页索引 6U|"d[
ps.getPreviousIndex()上一页索引 c;29GHs2
#WDpiV7B
;gaTSYVe
-1d$w`
KIuj;|!q
k%-y\WM
JeVbFZ8
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 wuCZz{c7
y4n~gTo(?
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 pIm ]WNX(
'Q7t5v@FF
一下代码重构了。 jfvlkE-uK
|d42?7}
我把原本我的做法也提供出来供大家讨论吧: Kzt:rhiB
rmX5-k
首先,为了实现分页查询,我封装了一个Page类: (Ww
SisC~
java代码: 4,)QV_?
# NK{]H$fd
#"C*dNAB
/*Created on 2005-4-14*/ ~h +B&F+5
package org.flyware.util.page; =fy.'+
]t17= Lr?
/** ^LSD_R^N
* @author Joa \ X6y".|-
* zuJ` 704
*/ GXv2B%i8
publicclass Page { h52+f
Pa; *%7
/** imply if the page has previous page */ Cx) N;x
privateboolean hasPrePage; geM`O|Np
LBpAR|
/** imply if the page has next page */ URh5ajoR%
privateboolean hasNextPage; E}36
YSZ[~?+
/** the number of every page */ oqK:
5|
privateint everyPage; ``Um$i~e%
Ex}TDmTu
/** the total page number */ H0Sm4
privateint totalPage; b?9'-hK<
(d
<pxx
/** the number of current page */ >qI:
privateint currentPage; ZkMHy1
(Zy=e?E,
/** the begin index of the records by the current hL;??h,!_
1mEW]z
query */ O1]XoUH<
privateint beginIndex; m1 p%,
T(q Hi?Y
(ke<^sv7!
/** The default constructor */ b]8\%=d
public Page(){ I= z+`o8
.lcgM
} ,*p(q/kJh~
!<-+}X+o8$
/** construct the page by everyPage x||b:2
* @param everyPage lnxA/[`a
* */ Oo\~'I
public Page(int everyPage){ @zix%x
this.everyPage = everyPage; sg]g;U
} @[rlwwG,
[9p@uRE
/** The whole constructor */ E?mW4?
public Page(boolean hasPrePage, boolean hasNextPage, .e:+Ek+
NXE1v~9V
"yXqf%CGE
int everyPage, int totalPage, Y}x_ud,
int currentPage, int beginIndex){ zWdz9;=_
this.hasPrePage = hasPrePage; m]\d9%-AT&
this.hasNextPage = hasNextPage; Pb :6nH=
this.everyPage = everyPage; =gB{(
this.totalPage = totalPage; G~4|]^`g
this.currentPage = currentPage; ht5:kt`F
this.beginIndex = beginIndex; 7nPm{=BG
} wi:d!,P`e
@qsOWx`l$
/** hP1;$
* @return C4C!-12
* Returns the beginIndex. pq5bK0NQ
*/ JDMsco+j5
publicint getBeginIndex(){ +d6Jrd*
return beginIndex; sy9Yd PPE
} Y9(BxDP_+Y
ewinG-hX_
/** *-_joAWTG
* @param beginIndex IG@@CH
* The beginIndex to set. (b1rd
*/ X`daaG_l
publicvoid setBeginIndex(int beginIndex){ "w{,ndZ
this.beginIndex = beginIndex; ,H su;I~
} ~U4;YlQP
0k|/]zfb
/** *;(GL
* @return (WS<6j[q
* Returns the currentPage. SYK?5_804
*/ (pQ$<c
publicint getCurrentPage(){ ^m^,:]I0P
return currentPage; '8Lc}-M4
} p WKpc
&[}5yos
r
/** %u$dN9cw
* @param currentPage nHF
* The currentPage to set. Jc9^Hyqu&
*/ $2*&\/;-E!
publicvoid setCurrentPage(int currentPage){ SB!m&;Tb
this.currentPage = currentPage; o&:n>:im
} CQ%yki
>qIZ
/** SVyJUd_
* @return =}4lx^`oeT
* Returns the everyPage. l'Z `%}R
*/ mc5$-}1V,
publicint getEveryPage(){ `?Xt ,
return everyPage; }A_>J7w
} 2$QuR~
t!vlZNc
/** o)6udRzBv
* @param everyPage Z{.L_]$I
* The everyPage to set. \U'TL_Ql
*/ 5'O.l$)y
publicvoid setEveryPage(int everyPage){ 7llEB*dSA
this.everyPage = everyPage; SxCzI$SGu
} _b 8XF&O
38q0iAH
/** / k8;k56
* @return su]ywVoRT
* Returns the hasNextPage. (wsvj61
*/ mkmVDRK
publicboolean getHasNextPage(){ 4&LoE~
return hasNextPage; x@>^ c:-f
} =Hs~fHa)
cYEe`?*
/** ud.Bzg:/
* @param hasNextPage 3# T_(
* The hasNextPage to set. V5ihplAk
*/ OKq={l
publicvoid setHasNextPage(boolean hasNextPage){ Y_Lsmq2!
this.hasNextPage = hasNextPage; 7QkAr
} ,s1n!@9
ui6B
/** <ByDT$E_
* @return IN9o$CZ:
* Returns the hasPrePage. MRHkQE+K@8
*/ P1l@K2r
publicboolean getHasPrePage(){ `Lu\zR%<
return hasPrePage; }UWRH.;v
} eL!G, W
/C}fE]n{X
/** Kq0hT4w
* @param hasPrePage XUT\nN-N
* The hasPrePage to set. L:F:ZOM6`
*/ jNNl5.
publicvoid setHasPrePage(boolean hasPrePage){ t|zLR
this.hasPrePage = hasPrePage; 6Gs,-Kb:
} Cx/duodp
#0 WO~wL
/** cBA2;5E
* @return Returns the totalPage. $T0|zPK5
* [%8+Fa~Wa
*/ "]`QQT-{0
publicint getTotalPage(){ DDhc ^(
return totalPage; h@D4~(r
} 9? W38EF
.tb~f@xL
/** ARu^hz=
* @param totalPage 5+O#5"v_
* The totalPage to set. 4[&6yHJ^
*/ wB(
igPi
publicvoid setTotalPage(int totalPage){ l9.wMs*`X
this.totalPage = totalPage; ),6Z1 K1
} c$'UfW
*WgP+"h
} .ODtduURe
!<2*B^
':w6{b
2h6F j&
hTn
}AsfLY
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 F<w/@.&m
&,&oTd.
个PageUtil,负责对Page对象进行构造: a~~ "2LE`
java代码: /aJl0GL4!
D-4PEf
Dx[t?-
/*Created on 2005-4-14*/ {ersXQ:
package org.flyware.util.page; %GS)9{T&
UrxgKTry
import org.apache.commons.logging.Log; &/, BFx"
import org.apache.commons.logging.LogFactory; 3)g1e=\i$
X6<HNLgra
/** ;o3
.<"
* @author Joa ?t}[Wi}7
* ]yVB66l
*/ XW Y0WDh:
publicclass PageUtil { ^J~}KOH
.[Sv|;x"E
privatestaticfinal Log logger = LogFactory.getLog *<#&ne8
a}c(#ZLs
(PageUtil.class); 1
)j%]zd2
r% '2a+}D
/** 5#f&WL*U@
* Use the origin page to create a new page D#m+w
* @param page D0k7)\puQ
* @param totalRecords 8a)EL*LH`
* @return +-~;?wA
*/ 28BiuxVW
publicstatic Page createPage(Page page, int >k\*NW
ccm <rZ7
totalRecords){ Ruk6+U
return createPage(page.getEveryPage(), SqTm/ t
u X0wg
page.getCurrentPage(), totalRecords); KQ9:lJKr
} 3 ^su%z_%
f(n{7
/** d)o<R;F
* the basic page utils not including exception JrL/LGY
"iZ-AG!C
handler IW BVfN->}
* @param everyPage ?n@PZL= ]
* @param currentPage (%fGS.TR
* @param totalRecords vP~F+z
@g
* @return page "
^eq5?L
*/ Q#g
s)2
publicstatic Page createPage(int everyPage, int ci^-0l_O
4GHIRH
C%[
currentPage, int totalRecords){ 63u'-Z"4
everyPage = getEveryPage(everyPage); )sS<%Xf
currentPage = getCurrentPage(currentPage); @e0Q+ t
int beginIndex = getBeginIndex(everyPage, $0W0+A$
'b^:"\t'Rh
currentPage); t=e0z^2i+
int totalPage = getTotalPage(everyPage, 2iG(v._x
D@JHi'F
totalRecords); 6|dUz*Pr|\
boolean hasNextPage = hasNextPage(currentPage, >Ia(g0
<0LB]zDWe6
totalPage); wFd*6%
boolean hasPrePage = hasPrePage(currentPage); 4r zioIk
462ae`
6l
returnnew Page(hasPrePage, hasNextPage, *r%mqAx(
everyPage, totalPage, <s7{6n')
currentPage, g<dCUIbcQ
~!nd'{{9
beginIndex); #U_u~7?H$
} `Ys })Pl
m5x>._7le
privatestaticint getEveryPage(int everyPage){ Vut.oB$
~
return everyPage == 0 ? 10 : everyPage; R{rV1j#@!a
} =}"hC`3e
0F~9t!
privatestaticint getCurrentPage(int currentPage){ :<v$vER,&
return currentPage == 0 ? 1 : currentPage; q9!#S
} D!sSe|sL^
8|tm`r`*Az
privatestaticint getBeginIndex(int everyPage, int 1aDDl-8,
+8Px` v1L
currentPage){ q7PRJX
return(currentPage - 1) * everyPage; Z{CL!
} .>nd@oU
$tKATL*
privatestaticint getTotalPage(int everyPage, int D8 #q.OR]
&Egn`QU
totalRecords){ %7@H7^s}9
int totalPage = 0; m{5$4v,[
RQ'c~D)X
if(totalRecords % everyPage == 0) dB,#`tc=,
totalPage = totalRecords / everyPage; w:LCm `d
else 4>Y\2O?**
totalPage = totalRecords / everyPage + 1 ; ).boe& .
>>8w(PdTn%
return totalPage; : [9'nR
} ["IJh
!?>)[@2
k6
privatestaticboolean hasPrePage(int currentPage){ H.mG0x`M"E
return currentPage == 1 ? false : true; y,>m#6hx#
} >V$#Um?AXj
2r0!h98
privatestaticboolean hasNextPage(int currentPage, (qP$I:Q4]v
R
_Y&Y-
int totalPage){ 8WGM%n#q
return currentPage == totalPage || totalPage == :V2Q n-N
prs<ZxbQb
0 ? false : true; Xda<TX@-
} iHn]yv3
#
_Kj.
/
IS WC
} 7EO&:b