Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 &Y{F?
c^
l+oDq'[q"
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 ;D:=XA%
"@(58nk
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 OO$|9`a
OthG7+eF
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 61G|?Aax
-H4PRCDH
。 JW-|<CJ
E{<?l 7t
分页支持类: "=FIFf
anLbl#UV
java代码: Q<dba12
*JwFD^<j
*}7U`Aa
package com.javaeye.common.util; nz>K{(
) 9xX
import java.util.List; V):`&@
R3cg2H
publicclass PaginationSupport { +9TV:T
CDJ$hu
publicfinalstaticint PAGESIZE = 30; Il|GCj*N
{Wh BoD
privateint pageSize = PAGESIZE; (Bsw/wv
STw oYn
privateList items; bea|?lK
t~q?lT
privateint totalCount; )TM!ms+K
%U-Qsy8|D)
privateint[] indexes = newint[0]; $]Jf0_
5|5=Y/
privateint startIndex = 0; ad9EG#mD#
f:S}h-AL&
public PaginationSupport(List items, int A3j"/eKi2
[~t yDLC
totalCount){ !W(`<d]68:
setPageSize(PAGESIZE); lelMt=
setTotalCount(totalCount); SGQDro=l
setItems(items); Jlz9E|*qV
setStartIndex(0); ]/a
g*F
} ,?I(/jI
uO"y`$C$_
public PaginationSupport(List items, int /Ad6+cY
v3~FR,Kl
totalCount, int startIndex){ w\p9J0
setPageSize(PAGESIZE); DDWp4`CS|
setTotalCount(totalCount); [Q|M/|mnR1
setItems(items); 9Kx<\)-GMD
setStartIndex(startIndex); *G\=i
A
} 8+&gp$a$
h+5@I%WX
public PaginationSupport(List items, int LGAX"/LX
A4}#U=3tI
totalCount, int pageSize, int startIndex){ .izf#r:<
setPageSize(pageSize); 6vF/e#},
setTotalCount(totalCount); $Vsy%gA<
setItems(items); 9?$RO[vo
setStartIndex(startIndex); x`#22"m
} BK*z 4m
moaodmt]x
publicList getItems(){ V+.Q0$~F5
return items; \<=IMa0
} &lU Ny
L
RNvQ
publicvoid setItems(List items){ g[AA,@p+
this.items = items; j!7Qw 8
} ZRPE-l_3:
my4\mi6P
publicint getPageSize(){ ZzT&$J7]`{
return pageSize; ",T`\8&@e
} i2`#
}DbE4"^K7
publicvoid setPageSize(int pageSize){ 'd+:D'
this.pageSize = pageSize; i0iez9B
} Y|:YrZSC
6W$rY] h!
publicint getTotalCount(){ [1Uz_HY["3
return totalCount; i_NJ -K
} <$Z tik1
Hk~k@Wft
publicvoid setTotalCount(int totalCount){ +
LS3T^
if(totalCount > 0){ 8!;$qVt
this.totalCount = totalCount; ]{Z8
int count = totalCount / l0. FiO@_Q
#3.\j"b
pageSize; IqNpLh|[
if(totalCount % pageSize > 0) rpSr^slr
count++; k8
u%$G
indexes = newint[count]; m9woredS,
for(int i = 0; i < count; i++){ >gnF]<
indexes = pageSize * qfa}3k8et
W"|mpxp
i; 8?kP*tmcZ
} j3{HkcjJG
}else{ Vha'e3o!
this.totalCount = 0; 4T%cTH:.9N
} 8<{;=m8cQ
} 5a6VMqQ6
*<xrp*O
publicint[] getIndexes(){ )@_ugW-j
return indexes; +2Z#M
} =q5@,wN^
G0pBR]_5z$
publicvoid setIndexes(int[] indexes){ x~z_,':
this.indexes = indexes; -p]>Be+^x
} VyY.r#@
hF.6}28U1
publicint getStartIndex(){ 8""mp]o9
return startIndex; !!*;4FK"q
} M7vj^mt?
N ocFvF7\
publicvoid setStartIndex(int startIndex){ S~> 5INud
if(totalCount <= 0) xD4$0Ppu
this.startIndex = 0; ZtR&wk
elseif(startIndex >= totalCount) 26 ?23J
;
this.startIndex = indexes Dp`HeSKU^
0E1=W6UZ
[indexes.length - 1]; ~{P:sjsU
elseif(startIndex < 0) vtZ?X';wh
this.startIndex = 0; >D~w}z/fk
else{ Z(`r -}f I
this.startIndex = indexes |(RZ/d<X\a
"$DldHC
[startIndex / pageSize]; 6rT4iC3Q{
} _Z.cMYN
} {-h, ZdH^
+9C;<f
publicint getNextIndex(){ Z\' wm'
int nextIndex = getStartIndex() + PtqGX=u
8 URj1 W
pageSize; Fg4@On[,i
if(nextIndex >= totalCount) .it2NS
return getStartIndex(); U!0E_J
else hbfsHT
return nextIndex; [;FofuZ
} ?@DNsVwb
nj
publicint getPreviousIndex(){ E(;i>
int previousIndex = getStartIndex() - x2m]Us@LIU
LipxAE?O
pageSize; 9~~UM<66W
if(previousIndex < 0) np=kTJ
return0; `iQqhx
else wVE:X3Ei
return previousIndex; M~p=#V1D
} (Q_2ODKo
K$ AB} Fvc
} "xn|zB
LABNj{=D!
:Y^I]`lR"
]u0Jd#@
抽象业务类 a_{6Qdl
java代码: 1eD.:_t4
:<%vE !$
@)b^^Fp
/** ;(S|cm'>}
* Created on 2005-7-12 r.<JDdj
*/ Uouq>N
package com.javaeye.common.business; wS%zWdsz
8gI\zgS
import java.io.Serializable; 5(#-)rlGj
import java.util.List; VMF|iB
t%$@fjz
import org.hibernate.Criteria; 1a8$f5
import org.hibernate.HibernateException; 5r7h=[N
import org.hibernate.Session; $H;+}VQ
import org.hibernate.criterion.DetachedCriteria; KoF
iQ?
import org.hibernate.criterion.Projections; vYdlSe=6G
import L
{qJ-ln:
H;y}-=J+
org.springframework.orm.hibernate3.HibernateCallback; Up|f=@=
import c3W
BALdh
CC#C
org.springframework.orm.hibernate3.support.HibernateDaoS kc Y,vl
PUCx]5
upport; ~K`1
bjzx!OCpV
import com.javaeye.common.util.PaginationSupport; Bm}iU~(Z`
R&Ci/
public abstract class AbstractManager extends .[(P
T VeJ6
HibernateDaoSupport { q% EC
u*2JUI*
privateboolean cacheQueries = false; ]|
WA#8_|
]EN&S Wh
privateString queryCacheRegion; $20s]ywS
~-<:+9m
publicvoid setCacheQueries(boolean EY$?^iS
DY.58IHg1
cacheQueries){ l{Er+)a
this.cacheQueries = cacheQueries; u E.^w;~2=
} pBU]=[M0
k FLT!k
publicvoid setQueryCacheRegion(String k{-`]qiK
$eX*
queryCacheRegion){ s5AgsMq
this.queryCacheRegion = iC*U $+JG
O^NP0E
queryCacheRegion; Mpm#GdT
} ^*>n4U
-)RJ\V^{9
publicvoid save(finalObject entity){ ]]/lC
getHibernateTemplate().save(entity); xiCN
qk3
} PpFsp( )x
!
Rvn'|!
publicvoid persist(finalObject entity){ X" \}sl5
getHibernateTemplate().save(entity); s OQcx\dK
} &I)\*Ue2t
I.a0[E/,
publicvoid update(finalObject entity){ RJPcn)@l
getHibernateTemplate().update(entity); H+`*Y<F@
} *B{-uc3o
v$3_o :
publicvoid delete(finalObject entity){ #_fY4vEO
getHibernateTemplate().delete(entity); ?gG, t4D
} MD4\QNUa)*
^@"c`
publicObject load(finalClass entity, k>>`fE\K
\ 3G*j`
finalSerializable id){ X:{WZs"[x
return getHibernateTemplate().load ]1}h8/
?4sJw:
(entity, id); 1ktHN: ta
} Z"DW 2k
=G>.-Qfs
publicObject get(finalClass entity, )!a$#"'
=ybGb7?
finalSerializable id){ bpp*
return getHibernateTemplate().get u~}%1
_:%U_U
(entity, id); ^#w{/C/n
} }4vjKSV
G/(*foT8SE
publicList findAll(finalClass entity){ u>|"28y
return getHibernateTemplate().find("from 4=s9A
O9*p0%ug
" + entity.getName()); `p1DaV
} :x+ig5
\xeVDKJH+n
publicList findByNamedQuery(finalString k/bque
6w!e?B2/%
namedQuery){ ^ $wJi9D6
return getHibernateTemplate
"l2bx
$}4K`Iu
().findByNamedQuery(namedQuery); 2&x7W*
} oZ-FF'
4|F#gK5E
publicList findByNamedQuery(finalString query, 8}z3CuM
^jOCenE3
finalObject parameter){ G4m4k
return getHibernateTemplate ns26$bU
gQR1$n0
().findByNamedQuery(query, parameter); 9FNwpL'C
} Y%h}U<y
|Ng"C`$oqv
publicList findByNamedQuery(finalString query, 5m`[MBt2g
6F-JK1i
finalObject[] parameters){ 9`INC~h
return getHibernateTemplate z5 pc3:
OAVQ`ek
().findByNamedQuery(query, parameters); T`Ro)ORC#
} ob]dZ
] R<FKJ[
publicList find(finalString query){ 2Y;!$0_rv
return getHibernateTemplate().find Aqu]9M~
R+F,H`
(query); >-zkB)5<,#
} M5 `m.n<
^]7,1dH}M
publicList find(finalString query, finalObject Qg> 0G%cXU
4Cd#sQ
parameter){
QP V@'.2m
return getHibernateTemplate().find "Y(^F
bs
ALAL( f`
(query, parameter); 6g|#ho1Bbs
} pw;r 25
f8#*mQ
public PaginationSupport findPageByCriteria $`v+4]
1ys( v
(final DetachedCriteria detachedCriteria){ O4N-_Kfp/
return findPageByCriteria y7La_FPrl
Wxs>osq
(detachedCriteria, PaginationSupport.PAGESIZE, 0); bKByU{t
} FF3&Y^+^"
V4EM5 Z\k
public PaginationSupport findPageByCriteria E\iJP^n
|K)p]i+
(final DetachedCriteria detachedCriteria, finalint !%wdn33"
wI>h%y-%!
startIndex){ gWi{\x8dt
return findPageByCriteria Ge0Lb+<G
=1/q)b,p)
(detachedCriteria, PaginationSupport.PAGESIZE, zv@bI~3~
U3N(cFXn
startIndex); #!L%J<MX
} fa yKM
#Z!#;%S
public PaginationSupport findPageByCriteria U$%|0@`~
AI~9m-,mE
(final DetachedCriteria detachedCriteria, finalint f,JX"
P>fKX2eQ-
pageSize, Wz5=(<{S
finalint startIndex){ -_HRqw,Z0
return(PaginationSupport) .OV-`TNWj
,m3":{G:t.
getHibernateTemplate().execute(new HibernateCallback(){ -~}
tq]
publicObject doInHibernate D>Ua#<52q
|mvM@V;^8{
(Session session)throws HibernateException { Fn> <q:
Criteria criteria = Uh%6LPg^
]'e AO
detachedCriteria.getExecutableCriteria(session); M=6G:HHY
int totalCount = sNf
+ lga0
'QnW9EHLF
((Integer) criteria.setProjection(Projections.rowCount Y!it!9
Pr2;Kp
()).uniqueResult()).intValue(); I5Q~T5Ar
criteria.setProjection 5v+L';wx[T
?eVj8 $BQo
(null); %!yxC
List items = D$mf5G &
DUhT>,~]
criteria.setFirstResult(startIndex).setMaxResults p&uCp7]U
&8afl"_~
(pageSize).list(); s_v}=C^
PaginationSupport ps = @'Q%Jc(
e lay
=%)
new PaginationSupport(items, totalCount, pageSize, "\<P$&`HA
58PKx5`D
startIndex); 7~D`b1||
return ps; 4/f[`].#W
} l<Lz{)OR
}, true); ?l>e75V%w
} Y!aLf[x]
wM0E%6
P
public List findAllByCriteria(final Wkww&Y
u
X>PefR
DetachedCriteria detachedCriteria){ Q~b_dx{m
return(List) getHibernateTemplate boIVU`F-!
x.o3iN[=
().execute(new HibernateCallback(){
C6CGj8G
publicObject doInHibernate sjcQaF`=
OSj%1KL
(Session session)throws HibernateException { m3B\)2B
Criteria criteria = {RH*8?7
' Nw6.5
detachedCriteria.getExecutableCriteria(session); |w4(rs-
return criteria.list(); ,;c{9H
} 4[Z1r~t\L
}, true); E::<;9
} 4V1|jy3
K: 4P;ApI
public int getCountByCriteria(final uZ-`fcCjD
^h`!f vyH
DetachedCriteria detachedCriteria){ \1~I04'=
Integer count = (Integer) )#Y|ngZ_>
UFos
E|r:
getHibernateTemplate().execute(new HibernateCallback(){ gn364U a
publicObject doInHibernate @
E >eq.m
0T=jR{j!o
(Session session)throws HibernateException { K/~Y!?:Jr
Criteria criteria = C_C$5[~-:
9X.gg$P
detachedCriteria.getExecutableCriteria(session); ]2P/G5C3tU
return #c:9V2
VGfD;8]z
criteria.setProjection(Projections.rowCount "AV1..mu
a~6ztEhGm
()).uniqueResult(); ynx WQ%d(`
} ?$2q P`-
}, true); I>\}}!
return count.intValue(); I51M}b,[d
} FU'^n6[<B
} UJ
O]sD`i
0:s8o@}
g:;Ya?5N
!\3}R25
Qf"6PJ
1 iquHn
用户在web层构造查询条件detachedCriteria,和可选的 A<a2TXcIE3
[GOX0}$?
startIndex,调用业务bean的相应findByCriteria方法,返回一个 NavOSlC+h
r,QJG$ Jo
PaginationSupport的实例ps。 #%;<FFu\
Q.*'H_Y
ps.getItems()得到已分页好的结果集 V2lp7"
ps.getIndexes()得到分页索引的数组 UP5%C;
ps.getTotalCount()得到总结果数 ^GrNfB[Qu
ps.getStartIndex()当前分页索引 xu`d`!Tx
ps.getNextIndex()下一页索引 Vvx a.B
ps.getPreviousIndex()上一页索引 3LT+9ad2d
anpJAB:1
7=L:m7T
-`,~9y;tx
C:WtCAm(
>aX:gN
3KDu!w@
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 >t2]Ssi(
{6-;P#Q0_
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 u!m,ilAnd
PXOq#
一下代码重构了。 ?G2qlna
>N :|Km\
我把原本我的做法也提供出来供大家讨论吧: b,=,px
3we.*\2$
首先,为了实现分页查询,我封装了一个Page类: jq7vOr-_g
java代码: (N&k}CO]W
XCKY
xv&
cw*(L5bu
/*Created on 2005-4-14*/ *pDXcURw
package org.flyware.util.page; FZM
]o
"cIGNTLFA
/** mjWp8i
* @author Joa g%@]z8L
* fQ2!sV
*/ GZxglU,3T
publicclass Page { f0:EQYYZ
v=dKcruR:
/** imply if the page has previous page */ %V@R k.<
privateboolean hasPrePage; L#83f]vG
m$j
n5:
/** imply if the page has next page */ eA3`]XP.`b
privateboolean hasNextPage; fRZUY<t
~e,f )?
/** the number of every page */ 9_g>BI;"8
privateint everyPage; n0Qh9*h
t;Fbt("]:
/** the total page number */ :Vu7,o
privateint totalPage; $8<j5%/ $M
w0q?\qEX
/** the number of current page */ PPuXas?i
privateint currentPage; )Tyky%P+iI
l}U~I
3}).
/** the begin index of the records by the current awj} K
+9=@E
query */ ~v{C6)
privateint beginIndex; zLJ:U`uh\
R#[QoyJ
t?3{s\z 8+
/** The default constructor */ ]4LT#
public Page(){ n $D}0wSM/
Bd N{[2
} c0,gfY%sI$
` $QzTv
/** construct the page by everyPage b.w(x*a
* @param everyPage oHc-0$eMKY
* */ B5?c'[V9
public Page(int everyPage){ v4Fnh`{
this.everyPage = everyPage; ;|;h9"
} utFcFdX
IlC:dA
/** The whole constructor */ + !E{L
public Page(boolean hasPrePage, boolean hasNextPage, f:JYG]E &
>M8^Jgh
@wAr[.lZ
int everyPage, int totalPage, UG^?a
int currentPage, int beginIndex){ #1,>Qnl
this.hasPrePage = hasPrePage; l9ch
this.hasNextPage = hasNextPage; Ztpm_P6
this.everyPage = everyPage; ?Uy*6YS
this.totalPage = totalPage; ^8f|clw"
this.currentPage = currentPage; twJ|Jmd
this.beginIndex = beginIndex; .9[8H:Fe
} dg'CHxU
'nj&}A'
/** ]B-$p p
* @return 1>*UbV<R;u
* Returns the beginIndex. M#8Ao4
T
*/ 71n uTE%!
publicint getBeginIndex(){ BF1O|Q|d6
return beginIndex; w'zO(6 `
} 8ZDqqz^C0
9'/ |?I
/** l]58P
* @param beginIndex pb2{J#
* The beginIndex to set. Gad2EEZ%0
*/ &Ow?Hd0
publicvoid setBeginIndex(int beginIndex){ luxKgcU
this.beginIndex = beginIndex; [Yahxw}
} lWyP[>*
w]5f3CIm
/** p TV@nP
* @return X%R^)zKV
* Returns the currentPage. b]qfcV
*/ *a0I Z
publicint getCurrentPage(){ id[>!fQ=Y
return currentPage; V.a]IkK'K
} ,%b1 ]zZQ
__zu-!v
/** +Tc(z{;
* @param currentPage 3=L1H ZH
* The currentPage to set. mX_Uhpw?t
*/ H1b%:KRVK
publicvoid setCurrentPage(int currentPage){ Vx4pP$S
this.currentPage = currentPage; eiSO7cGy
} \,IDLXqp
%?G.lej,x
/** Y(!)G!CMc
* @return yar IR|
* Returns the everyPage.
T9;o.f S
*/ r- "`Abev
publicint getEveryPage(){ #?d>S;)+
return everyPage; kC#B7*[RM
} g8*|"{
:Y?08/V
/** Mn{Rg>X
* @param everyPage d_|v=^;
* The everyPage to set. P>,D$-3
*/ J-{E`ibGN
publicvoid setEveryPage(int everyPage){ RKZk/ly
this.everyPage = everyPage; }Mlz\'{
} LZbHK.G=
E0x$;CG!
/** J3JRWy@?P
* @return ?#y<^oNM
* Returns the hasNextPage. .4)P=*
*/ \z?;6A
publicboolean getHasNextPage(){ QO^X7A"?X
return hasNextPage; !Yi<h/:
} >\Pj(,'
c oz}VMp
/** DLQ`<aU
* @param hasNextPage vK>^#b3
* The hasNextPage to set. ] ]-0RJ=S?
*/ 13@| {H CB
publicvoid setHasNextPage(boolean hasNextPage){ ~PvzUT-^
this.hasNextPage = hasNextPage; gV>\lMc[-%
} Q$5:P&
JEkVj']?
/** ;lt;]7
* @return R63d
`W
* Returns the hasPrePage.
%NoZf^?
*/ X~4:sJ\P=
publicboolean getHasPrePage(){ TzXl ?N
return hasPrePage; N4NH)x
} 6>A8#VT
2DQC)Pe+z
/** c?Qg:yU
* @param hasPrePage !XC7FUO
* The hasPrePage to set. Kf5 p*AI
*/ p7tC~]r:L
publicvoid setHasPrePage(boolean hasPrePage){ sVnuSm
this.hasPrePage = hasPrePage; #XPU$=
} m"}G-#
2p ,6=8^v
/** V(0[QA
* @return Returns the totalPage. %>z}P&Yz
* GUXX|W[6
*/ u'>CU
publicint getTotalPage(){ t,6=EK*3T
return totalPage; R[t[M}q
} wH<*
lEs/_f3;A
/** y_#wR/E)u{
* @param totalPage c6|&?}F
* The totalPage to set. ;0E4S
*/ G_]mNh
publicvoid setTotalPage(int totalPage){ H[Cn@XE
this.totalPage = totalPage; v~3q4P
} V5MbWXgR
+\Q@7Lj
} -:q7"s-}b
i/Z5/(zF
-9EbU7>!
J)]W[Nk
qE[}Cf]X
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 7Jk.U=vY
[R$4n-$
个PageUtil,负责对Page对象进行构造: LTHS&3%2
java代码: 8iRQPV-"_
"mA/:8` Q
^M"g5+q
/*Created on 2005-4-14*/ dXhV]xK
package org.flyware.util.page; C{-pVuhK+
3L|k3 `I4
import org.apache.commons.logging.Log; 2S3F]fG0
import org.apache.commons.logging.LogFactory; 2+HiaYDZ
QHK$
/** M=%p$\x
* @author Joa Sk-Ti\
* ~n?U{
RmH
*/ +7w>ujeeJA
publicclass PageUtil { ?zEgN!\R)
cQjJ9o7
privatestaticfinal Log logger = LogFactory.getLog H;8(y4;
P+xZaf
H
(PageUtil.class);
@Hzsud
yd k
/** 4b)xW&K{
* Use the origin page to create a new page 7^1ikmYY
* @param page 2mRso.Ah
* @param totalRecords -Ac^#/[0
* @return $[d}g
*/ V+ Z22
publicstatic Page createPage(Page page, int `&o|=
fN9hBC@
totalRecords){ "3K0 wR5
return createPage(page.getEveryPage(), -M4#dHR_!
cWi2Sls
page.getCurrentPage(), totalRecords); ],LOkAX
} OA8pao~H
oq|K:<l
/** 975KRnj
* the basic page utils not including exception *m;L.r`5[
wZ\0<skU
handler !j(R_wOq
* @param everyPage ;,<s'5icyg
* @param currentPage TZ/u"' ZS
* @param totalRecords \"Np'$4eu
* @return page Lczcz"t
*/ FIuKX"XR
publicstatic Page createPage(int everyPage, int ow&R~_
d00r&Mc
currentPage, int totalRecords){ WA<~M)rb
everyPage = getEveryPage(everyPage); -+z^{*\;N
currentPage = getCurrentPage(currentPage); {5,CW
int beginIndex = getBeginIndex(everyPage, [P<oyd@#
Z$q}y
79^
currentPage); MQI6e".
int totalPage = getTotalPage(everyPage, ej0q*TH.
|{$Vk%cUE
totalRecords); [ [Z*n/tr
boolean hasNextPage = hasNextPage(currentPage, F:\CDM=lS
GhX>YzD7
totalPage); f>Ge
Em~
boolean hasPrePage = hasPrePage(currentPage); bkV_ ^8
G=wJz
returnnew Page(hasPrePage, hasNextPage, FN G]
everyPage, totalPage, ?@tp1?)
currentPage, ,Q^.SHP8
Ygg+*z
beginIndex); tFG&~tNc
} {`{U\w5Af
LnLuWr<;}
privatestaticint getEveryPage(int everyPage){ xw`Pq6
return everyPage == 0 ? 10 : everyPage; qg|SBQ?6
} $~_TE\F1
UZqr6A(/H
privatestaticint getCurrentPage(int currentPage){ {>90d(j
return currentPage == 0 ? 1 : currentPage; h/5.>[VwDh
} caS5>wk`R
L,BuzU[1S
privatestaticint getBeginIndex(int everyPage, int 2WqjNqx)6
"HlT-0F
currentPage){ y4+Km*am,W
return(currentPage - 1) * everyPage; I t",WFE.
} VTS8IXz
Rkgpa/te"
privatestaticint getTotalPage(int everyPage, int Ean
#>h
).5$c0`U&
totalRecords){ xzh`q
int totalPage = 0; p4[cPt ~C
`-IX"rf
if(totalRecords % everyPage == 0) ><^
,
totalPage = totalRecords / everyPage; |<gYzbq
else M]
7#
totalPage = totalRecords / everyPage + 1 ; ^O}` i
"=@X>jUc
return totalPage; E0G"B'x
} 4J{6Wt";
2M@,g8O+B=
privatestaticboolean hasPrePage(int currentPage){ dD ?ZF6
return currentPage == 1 ? false : true; *>
LA30R*v
} hT go
x}B3h9]
privatestaticboolean hasNextPage(int currentPage, MfNsor
+VT/c
int totalPage){ O%}?DiSl
return currentPage == totalPage || totalPage == a]\l:r
4MUN1/DId`
0 ? false : true; O/ybqU\7
} =S#9\W&