Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 |&"/u7^
1%$t;R
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 4wKQs&:
enGZb&
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 BZQ"[-V{
M
~;]d
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 |(<A)C
-zg 6^f_pW
。 /HH_Zi0?N|
.wV-g:2
分页支持类: ;il+C!6zpf
A]laS7Q
java代码: 00B,1Q HP
w~C\5 i
p;qFMzyS9
package com.javaeye.common.util; ,. zHG
I`77[
import java.util.List; @;G%7&ps
-lqD
publicclass PaginationSupport { q`VkA
\
j[,XJ,5=
publicfinalstaticint PAGESIZE = 30; I5*<J n
m\oxS;fxWi
privateint pageSize = PAGESIZE; uZTbJ3$$
2KlVj]!7
privateList items; &^`[$LtYd
mlYkn
privateint totalCount; \sAkKPI
o@ m7@$7
privateint[] indexes = newint[0]; !K-qoBqKM
X$Shi
*U[
privateint startIndex = 0; Mp QsM-iW
*JRM(V+IEv
public PaginationSupport(List items, int j0^1BVcj
ZkWMo=vL
totalCount){ "574%\#4z
setPageSize(PAGESIZE); 0Bt>JbGs4
setTotalCount(totalCount); ;VzdlCZ@
setItems(items);
jM-7
setStartIndex(0); @QMU$]&i]
} 8=@f lK
NFy V02.
public PaginationSupport(List items, int NoMlTh(O
v.ow`MO=;
totalCount, int startIndex){ e,xJ%f
setPageSize(PAGESIZE); Zt&
7p
setTotalCount(totalCount); LSR0yCU
setItems(items); i= R%MH+
setStartIndex(startIndex); K8/jfm
} E9b>wP
Y(] W+k<
public PaginationSupport(List items, int qpQiMiB#g'
9K;g\? 3
totalCount, int pageSize, int startIndex){ ]4/C19Fe!
setPageSize(pageSize); IB$i^
setTotalCount(totalCount); 7^V`B^Vu
setItems(items); xU2i&il^!
setStartIndex(startIndex); Jz4;7/
} odDVdVx0
8>G5VhCm~o
publicList getItems(){ yf[1?{iVo
return items; beBv|kI4
} Ci 'V
7xM4=\~OG
publicvoid setItems(List items){ :]4s;q:m
this.items = items; IAWs}xIly
} ^F
qs,^~W
\PD%=~
publicint getPageSize(){ mo9(2@~<
return pageSize; @HTs.4
} f*:N*cC
wy^mh.= UX
publicvoid setPageSize(int pageSize){ vTo+jQs^
this.pageSize = pageSize; bxPJ5oT
} OLWn0
S(Z\h_m(
publicint getTotalCount(){ :fDzMD
return totalCount; q6hH]Q>w*
} U# IPYyV
+U<.MVOo.
publicvoid setTotalCount(int totalCount){ belBdxa{"
if(totalCount > 0){ LN)yQ-
this.totalCount = totalCount; tJ*/5k
&
int count = totalCount / [?=DPE%
W6`_lGTj
pageSize; A~v[6*~>
if(totalCount % pageSize > 0) &G[W$2`@
count++; Lp3pJE
indexes = newint[count]; FRL;fF
for(int i = 0; i < count; i++){ txm6[Io
indexes = pageSize *
'SXLnoeTa
;1s;"
i; Vx:uqzw#
} I?nU+t;
}else{ 6kMEm)YjT
this.totalCount = 0; -7XaS&.4
} ,S
m?2<
} _dECAk
&b
C^LxJG{L5
publicint[] getIndexes(){ 4]E1x l
return indexes; Pqj\vdzx
} R6`mmJ+'
QpiDBJCL
publicvoid setIndexes(int[] indexes){ ~}/_QlX` K
this.indexes = indexes; *NM*
} oiM['iDK
\II^&xSF
publicint getStartIndex(){ NGRXNh+
return startIndex; FjI1'Ah\
} d|`8\fq
<Fv7JPN%
publicvoid setStartIndex(int startIndex){ cp"{W-Q{$
if(totalCount <= 0) t'yh&44_
this.startIndex = 0; 7*%}=.
elseif(startIndex >= totalCount) _{
2`sL)
this.startIndex = indexes [,;O$j}
ONZ(0H{ 1$
[indexes.length - 1]; l^%52m@{
elseif(startIndex < 0) Bs|#7mA[
this.startIndex = 0;
hhhxsGyv
else{ &_s^C?x
this.startIndex = indexes 6(7dr?^eGT
;mr*$Iu 7|
[startIndex / pageSize]; >L8 &6aU
} 0+)1KU)I
} knzo 6
D51s)?
publicint getNextIndex(){ Z^Wv(:Nr
int nextIndex = getStartIndex() + %tPy]{S..
aI|X~b
pageSize; KU Mk:5
c
if(nextIndex >= totalCount) M$Rh]3vqR
return getStartIndex(); ar S@l<79
else 5E 9R+N
return nextIndex; c/=\YeR
} EY.m,@{
* *oDQwW]*
publicint getPreviousIndex(){ =s*4y$%I
int previousIndex = getStartIndex() - Q
\SSv;3_
+VJyGbOcC
pageSize; W<TfDEEa
if(previousIndex < 0) sHV?njZd
return0; loHMQKy@
else \4
+HNy3
return previousIndex; `,Y3(=3Xe?
} 90-s@a3B-j
R:ecLbC
} A;6ew4
) 3V1aC
meXwmO
^; }Y ZBy
抽象业务类 gKmF#Z"\
java代码: $Y\7E/T
%Na`\`L{F
cBU3Q<^
/** hBifn\dFr
* Created on 2005-7-12 ah(k!0PV
*/
9l |*E
package com.javaeye.common.business; ,|;\)tT
&m]jYvRc
import java.io.Serializable; Q4Qf/q;U
import java.util.List; k'sPA_|
e~9g~k]s
import org.hibernate.Criteria; FF7?|V!Q
import org.hibernate.HibernateException; :~ 	
import org.hibernate.Session; tO D}&
import org.hibernate.criterion.DetachedCriteria; fQ-IM/z
import org.hibernate.criterion.Projections; B?e]
Ht
import r%>7n,+o
OHnsfXO_V
org.springframework.orm.hibernate3.HibernateCallback; kbbHa_;aqV
import rt?*eC1b+Z
?k@;,l :s
org.springframework.orm.hibernate3.support.HibernateDaoS MX+gc$Y
O
w4&\-S#
upport; b `}hw"f
Z Y5Pf
1
import com.javaeye.common.util.PaginationSupport; x2/ciC
/^gu&xnS
public abstract class AbstractManager extends (h[.
Ie
cK\?wZ| Y
HibernateDaoSupport { QF22_D<.}J
0HQTe>!
privateboolean cacheQueries = false; }I#_H
v-"nyy-&Z
privateString queryCacheRegion; !kH 1|
0,8RA_Ca}
publicvoid setCacheQueries(boolean C~nL3w
3{Zd<JYg4-
cacheQueries){ |@f\[v9`
this.cacheQueries = cacheQueries; ICc:k%wE7
} 1CJAFi>%D
mgodvX
publicvoid setQueryCacheRegion(String x cZF_elt7
SP>&+5AydX
queryCacheRegion){ N-Bw&hEZ
this.queryCacheRegion = )wdd"*hv
5)0'$Xxqa0
queryCacheRegion; ~LP5hL
} %F}d'TPx
T&:~=
publicvoid save(finalObject entity){ Um*&S.y
getHibernateTemplate().save(entity); S0LaQ<9.
} NQcg}y
C0>L<*C
publicvoid persist(finalObject entity){ ^V]IPGV
getHibernateTemplate().save(entity); A ^zd:h-
} Mp[2A uf
TZ}y%iU:mB
publicvoid update(finalObject entity){ m}>Q#IVZ
getHibernateTemplate().update(entity); YOA)paq+
} ?V(+Cc
i.KRw6
publicvoid delete(finalObject entity){ Qv]rj]%
getHibernateTemplate().delete(entity); lg{/5gQG
} !-&;t7R
)@=fGN Dt
publicObject load(finalClass entity, [dqh-7
yb0Mn*X+
N
finalSerializable id){ P{: 5i%qC
return getHibernateTemplate().load Wdga(8t
U8,pe;/ln`
(entity, id); ep*8*GmP
} ^f,%dM=i=
9oG)\M.6w
publicObject get(finalClass entity, \6aisK
8]bLp
finalSerializable id){ h2i1w^f
return getHibernateTemplate().get IABF_GwF
CT'#~~QB
(entity, id); XPnHi@x
} lB8gD
NK:! U
publicList findAll(finalClass entity){ gg Nvm
return getHibernateTemplate().find("from Yn0iu$;n
:-(qqC:
" + entity.getName()); .SNg2.
} EW+QVu@
jx
?"`;a
publicList findByNamedQuery(finalString IlB*JJnl
vkeZ!klYB
namedQuery){ o1-_BlZ
return getHibernateTemplate #qK5i1<
IA`Lp3Z
().findByNamedQuery(namedQuery); SDs#w
} nUisC5HW
J=HN~B1
publicList findByNamedQuery(finalString query, 0F
2p4!@W
NYzBfL
x
finalObject parameter){ VSh&Y_%
return getHibernateTemplate wyLyPJv
\eRct_
().findByNamedQuery(query, parameter); /Ba/gq0j
} *>xCX
t
>.=q:
publicList findByNamedQuery(finalString query, EG3u)}vI
Dt iM}=:
finalObject[] parameters){ 0]^gT'
return getHibernateTemplate o%0To{MAF-
iO2jT+i
().findByNamedQuery(query, parameters); wrsr U
} JC;&]S.
Jje!*?&8X
publicList find(finalString query){ W! J@30
return getHibernateTemplate().find 7<Y aw,G
=F
%lx[9Ye
(query); r d)W+W9
} u1\r:q
#Jr4LQ@A9
publicList find(finalString query, finalObject O{Z${TC[
Iv*u#]{t
parameter){ wz BI<0]z
return getHibernateTemplate().find QGE0pWL-a
sa"}9IE*8
(query, parameter); \0&F'V
} Sl@Ucc31
z<.?8bd
public PaginationSupport findPageByCriteria )lq+Gv[%F
i?7?I
(final DetachedCriteria detachedCriteria){ IaU%L6Q]
return findPageByCriteria }<*KM)%
MV07RjeS
(detachedCriteria, PaginationSupport.PAGESIZE, 0); i4XiwjCHN
} k|U2Mp
aM(x--UR=
public PaginationSupport findPageByCriteria DKkilqVM
:T<5Tq*+x
(final DetachedCriteria detachedCriteria, finalint hVui.]
.N`*jT
startIndex){ T)',}=
return findPageByCriteria 9Hd_sNUu\
y*p02\)
(detachedCriteria, PaginationSupport.PAGESIZE, E=`/}2
c5:X$k\
startIndex); 9PMIF9"
} |--Jd$ dj
''3I0X*!
public PaginationSupport findPageByCriteria q%dbx:y#
?0?3yD-!9
(final DetachedCriteria detachedCriteria, finalint [1 O{yPV3s
8 )n g> l
pageSize, ?GW}:'z
finalint startIndex){ O~Bh(_R&
return(PaginationSupport) W!Fc60>p@f
ZDov2W
getHibernateTemplate().execute(new HibernateCallback(){ ia_lP
publicObject doInHibernate "M3;>"`G
W+5. lf=2>
(Session session)throws HibernateException {
90K&oof?M
Criteria criteria = U]@?[+I0]
m;t&P58f
detachedCriteria.getExecutableCriteria(session); \-f/\P/ w
int totalCount = ,Q0H)//~
M|fV7g
((Integer) criteria.setProjection(Projections.rowCount V Ew| N)
t[@>u'YKt
()).uniqueResult()).intValue(); =|8hG*D8
criteria.setProjection `csZ*$7
ga(k2Q;y
(null); *ZxurbX#
List items = }r!hm?e
#<EYO
criteria.setFirstResult(startIndex).setMaxResults
SvrUXf
e`OQ6|.k8
(pageSize).list(); tw&v@HUP
PaginationSupport ps = 5$+ssR_?k
iRbe$v&N
new PaginationSupport(items, totalCount, pageSize, *>1^q9M
P{yb%@I~J
startIndex); <HzL%DX
return ps; Aa4Tq2G
} j4+Px%sW
}, true); JodD6;P
} e<[ ] W4"A
;_2+Y^Qb
public List findAllByCriteria(final QR _h#N2h
Vzo<ma^
DetachedCriteria detachedCriteria){ ;BYuNQr
return(List) getHibernateTemplate I~&9c/&
-esQyLx
().execute(new HibernateCallback(){ -6~.;M 5
publicObject doInHibernate WqF$-rBJG^
=0 !j"z=
(Session session)throws HibernateException { RZ;s_16GQ
Criteria criteria = |"I)1[7
yMTO 5~U{
detachedCriteria.getExecutableCriteria(session); `48Ql
return criteria.list(); Y]](.\ff
} _SJ:|I
}, true); u6Lx3
} l;L_A@B<
Pg{1' -
public int getCountByCriteria(final S#$Kmm
|
T ~(Sc'8
DetachedCriteria detachedCriteria){ /jGV[_Q=P
Integer count = (Integer) >#k-
~|w
W5=)B`v
getHibernateTemplate().execute(new HibernateCallback(){
o?m/
publicObject doInHibernate U+@U/s%8
[.1MElM
(Session session)throws HibernateException { ;i'[c`
Criteria criteria = Z7RBJK7|.
:GO"bsjL
detachedCriteria.getExecutableCriteria(session); Y[dq"
return %dv?n#Uf
%W)pZN}
criteria.setProjection(Projections.rowCount $(Mz@#%
7.6L1srV
()).uniqueResult(); ?Ve IlD
} `fTM/"
}, true); ,"XiI$Le
return count.intValue(); +yHz7^6-5
} c38XM]Jeq
} 4=MjyH|[Jx
CgrQ"N5
J}:.I>
XNv2xuOc J
^W,5A;*3
(6Z^0GL
用户在web层构造查询条件detachedCriteria,和可选的 +E_yEH7_)
{svo!pN:
startIndex,调用业务bean的相应findByCriteria方法,返回一个 [nP s
/:'>-253
PaginationSupport的实例ps。 n2hV}t9O
>( [,yMIY
ps.getItems()得到已分页好的结果集 3m`>D
e
ps.getIndexes()得到分页索引的数组 ~IS8DW$;
ps.getTotalCount()得到总结果数 fyA-*)oHv
ps.getStartIndex()当前分页索引 ~"CGur P
ps.getNextIndex()下一页索引 $i5J}
ps.getPreviousIndex()上一页索引 W>)0=8#\
HP1QI/*v
(rkg0
X3X_=qzc
]p3f54!
Jt@lH
(Y@T5-!D
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 U/QgO
?(R3%fU
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 a[(OeVQ5
G~YZ(+V%~
一下代码重构了。 dkZe.pv$j
>m,hna]RZ
我把原本我的做法也提供出来供大家讨论吧: |uqI}6h.
9ziFjP+1
首先,为了实现分页查询,我封装了一个Page类: I/MY4?(T
java代码: bYnq,JRA
$2?AJ/2r$b
0!_?\)X
/*Created on 2005-4-14*/ R=lw}jH [Z
package org.flyware.util.page; ;*M@LP{*L
"J 1A9|
/** ?<TJ}("/
* @author Joa 49$<:{ ~
* 7upko9d/
*/ h@!p:]
publicclass Page { hx$61E=
:Kwu{<rJ!(
/** imply if the page has previous page */ <f>w"r
privateboolean hasPrePage; \7r0]& _
Wye* ~t
/** imply if the page has next page */ !m+Pd.4TaB
privateboolean hasNextPage; >|E]??v
5M0Q'"`F:
/** the number of every page */ L(VFzPkY%
privateint everyPage; f
+{=##'0
gwRB6m$
/** the total page number */ alaL/p{O
privateint totalPage; Yi*F;V
&>,;ye>A
/** the number of current page */ K8;SE!
privateint currentPage; Z~~6y6p
3R+%C* 7
/** the begin index of the records by the current b0{i +R
?<EzILM
query */ P 0,]`w
privateint beginIndex; IR6W'vA
@MES.g
/\w4k
/** The default constructor */ sFTAE1|
public Page(){ tQ|c.`)W
olE(#}7V
} u
]e-IYH
&Q883A
J
/** construct the page by everyPage Lt't
* @param everyPage N}?|ik
* */ GfE>?mG
public Page(int everyPage){ d:(Ex^^
this.everyPage = everyPage; L,[Q/$S8
} ny5P*yWEh
[iub}e0
/** The whole constructor */ S4x9k{Xn
public Page(boolean hasPrePage, boolean hasNextPage, Q)DEcx-|,
cag 5w~Px
Lq2Q:w'
int everyPage, int totalPage, e= IdqkJ%
int currentPage, int beginIndex){ ]F4QZV(
M
this.hasPrePage = hasPrePage; ,|:.0g[n
this.hasNextPage = hasNextPage; qzUiBwUi@
this.everyPage = everyPage; y2jv84
M
this.totalPage = totalPage; .\R9tt}
this.currentPage = currentPage; mWT+15\5r(
this.beginIndex = beginIndex; o5o myMN
} P%aqY~yF3
xsZG(Tz
/** x77L"5g
* @return 2/&=:,"t,B
* Returns the beginIndex. pl`4&y%Me
*/ &n6{wtBP
publicint getBeginIndex(){ Z<nNk.G
return beginIndex; lYG`)#T
} NN*L3yx
jIubJQR~
/** }?s-$@$R
* @param beginIndex 23gN;eD+m6
* The beginIndex to set. >n"0>[:4
*/ NnLK!Q
publicvoid setBeginIndex(int beginIndex){ oy^-?+
this.beginIndex = beginIndex; FS1\`#Bm)
} |>;PV4])(
,*|Q=
/** 4$xVm,n|
* @return (U:-z=E#1
* Returns the currentPage. cRLw)"|
*/ ,HZ%q]*:~
publicint getCurrentPage(){ wQ+pVu?6_
return currentPage; rl|'.~mc
} ?^Rp"
H
e
)0 ]WJ
/** & FhJ%JK
* @param currentPage t1w5U+z
* The currentPage to set. COh#/-`\1
*/ q\EYsN</;
publicvoid setCurrentPage(int currentPage){ !mlfG"FE
this.currentPage = currentPage; hVzyvpw
} @_ %RQO_X
cMY}Y
[2c
/** rN}pi@
* @return &
kC
* Returns the everyPage. /~NX<Ye&
*/ /vSGmW-*
publicint getEveryPage(){
d$$5&a
return everyPage; q} e#L6cM
} )'+[,z ;s
_
$F=A
/** xX<f4H\'
* @param everyPage "\o#YC
* The everyPage to set. w6vbYPCN
*/ KuJ)alD;1
publicvoid setEveryPage(int everyPage){ }4C_r'd6
this.everyPage = everyPage; 1-y8Hy_a2
} 6>]_H(z7
V4,Gt]4
/** rfwJLl/
* @return )\1>)BJq
* Returns the hasNextPage. ~B;}jI]d[
*/ PuNL%D
publicboolean getHasNextPage(){ X:W\EeH
return hasNextPage; ; J W]b]
} Hu|Tj<S
vb>F)X?b_
/** Ae>+Fcv
* @param hasNextPage poQ_r<I
* The hasNextPage to set. r2RJb6
*/ *:L"#20:R
publicvoid setHasNextPage(boolean hasNextPage){ Z<X=00,wg
this.hasNextPage = hasNextPage; f;'*((
} rH7Cv/Y
_lv{ 8vf1B
/** z*},N$2=
* @return FyEKqYl
* Returns the hasPrePage. 1/-3m Po
*/ %0Ur3
publicboolean getHasPrePage(){ &~_F2]oM
return hasPrePage; -}6ew@GE
} IW\^-LI.
_[6sr7H!
/** 3 yx[*'e$
* @param hasPrePage ljbAfd
* The hasPrePage to set. 1V2]@VQF
*/ |=q~X}DA
publicvoid setHasPrePage(boolean hasPrePage){ M(C">L]8
this.hasPrePage = hasPrePage; );!ND%
} \TP$2i%W
Q:P)g#suc
/** %6Gg&Y$j!
* @return Returns the totalPage. _HwA%=>7
* c6:uM1V{
*/ IHEbT
publicint getTotalPage(){ XUP{]w`.Z
return totalPage; HT.,BF
} chICc</l&
xNIrmqm5]
/** $@Vn+|
Ix
* @param totalPage cSPQ
NYU:
* The totalPage to set. %"{P?V<-V
*/ mqZK1<r
publicvoid setTotalPage(int totalPage){ hV@ N-u^
this.totalPage = totalPage; ZUI6VM
} qx#M6\L!
YrL(4 Nt8
} UBL{3s^"
Z1fY' f
()aCE^C
GQ1/pys
e=&~6bs1U
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 ~xqiasE#K
&PJ;B)b
个PageUtil,负责对Page对象进行构造: !.UE} ^TV
java代码: $`lWW6>P
W` x.qumN
,7wYa&
/*Created on 2005-4-14*/ xKu#OH
package org.flyware.util.page; znrO~OK
D9+qT<ojN
import org.apache.commons.logging.Log; WaB0?jI
import org.apache.commons.logging.LogFactory; [63\2{_^v
4. R(`#f
/** ,&BNN]k
* @author Joa +2iD9X{$MX
* 1{N+B#*<[X
*/ .2%t3ul[
publicclass PageUtil { =AO
(
]njNSn
privatestaticfinal Log logger = LogFactory.getLog mh8fJ6j29N
L-(bw3Yr>
(PageUtil.class); gY7sf1\wX
EK# 11@0%
/** Phi5;U!
* Use the origin page to create a new page QD7KE6KP'
* @param page =DdPwr 0Op
* @param totalRecords Rrh6-]A
* @return 4 bk`i*-O
*/ [RXLR#
publicstatic Page createPage(Page page, int Fv]6an.
uzHMQp
totalRecords){ azZtuDfv
return createPage(page.getEveryPage(), O84:ejro
(GF}c\=T7
page.getCurrentPage(), totalRecords); _;3,
} pFH.beY
e%e.|+
/** L;0
NR(b!
* the basic page utils not including exception Dn)yBA%
_.9 5>`
handler dU3A:uS^
* @param everyPage T^4 dHG-(
* @param currentPage ;B@#,6t/
* @param totalRecords \:+\H0Bz
* @return page :!_l@ =l
*/ 8gavcsVE[
publicstatic Page createPage(int everyPage, int 0U7Gl9~
[~8U],?1
currentPage, int totalRecords){ 'd2
:a2C]
everyPage = getEveryPage(everyPage); <TVJ9l
currentPage = getCurrentPage(currentPage); ;j9%D`u<
int beginIndex = getBeginIndex(everyPage, :;_}Gxx
B& @ pZYl
currentPage); 81EEYf
int totalPage = getTotalPage(everyPage, ,f^fr&6jb
v7pu
totalRecords); (kR
NqfX
boolean hasNextPage = hasNextPage(currentPage, \0~?i6o
rf=l1GW
totalPage); <P#BQt f
boolean hasPrePage = hasPrePage(currentPage); [y8(v ~H
3:GwX4yW
returnnew Page(hasPrePage, hasNextPage, CzG[S\{+
everyPage, totalPage, jOT/|k
currentPage, bit|L7*14
/Pextj<
beginIndex); E0I/]0
} _]@u)$
$ ,K@xq5
privatestaticint getEveryPage(int everyPage){ rG?5z"
return everyPage == 0 ? 10 : everyPage; q;#AlquY @
} ;SE*En
qh.F}9o
privatestaticint getCurrentPage(int currentPage){ 'o)Y!VYnJF
return currentPage == 0 ? 1 : currentPage; 1 ?BLL;[a8
} c1E{J<pZ
Yeg<MrS4D
privatestaticint getBeginIndex(int everyPage, int ?;oJ=.T
`xx.,;S
currentPage){ pnuo;r s
return(currentPage - 1) * everyPage; ~qZ6I)?
} $e+4Kt
,
uD(C jHM>
privatestaticint getTotalPage(int everyPage, int .nZKy't
0UJ6>Rj
totalRecords){ yf&_l^!
int totalPage = 0; f?:=@35
/ckkqk"
if(totalRecords % everyPage == 0) rGQD+ d
totalPage = totalRecords / everyPage; >TglX t+
else kcUn GiP
totalPage = totalRecords / everyPage + 1 ; k.b=EX|
9ye!kYF,
return totalPage; \FfqIc9;
} +@]k[9
\ n2MP
privatestaticboolean hasPrePage(int currentPage){ :rM2G@{
return currentPage == 1 ? false : true; 2 T} >9X
} 4!Radl3`
c3GBY@m
privatestaticboolean hasNextPage(int currentPage, @k{q[6c2n
9n is8
int totalPage){ C&Qt*V#,
return currentPage == totalPage || totalPage == i#4+l$q
f/c&Ya(D~
0 ? false : true; C$0u-Nx8
} bM"?^\a&Q