Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 jLLZZPBK
Jm(sx'qPx
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 `aw5"ns^V
YPY'[j(p`n
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 _g#v*7o2@
~^u#Q\KE"
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 <h"*"q|9
|Q _]+[
。 HECZZnM
r{~@hd'Aj
分页支持类: y$n`+%_
RU'
WHk
java代码: cA8"Ft{P)
HLnizE
R6KS&Ge_
package com.javaeye.common.util; ,9:0T LLR
)(&WhZc Z
import java.util.List; s[HQq;S
Ea7LPHE#
publicclass PaginationSupport { /EpsJb`kj
kroO~(\
publicfinalstaticint PAGESIZE = 30; gqi|k6V/
*7yu&a8
privateint pageSize = PAGESIZE; *ydU3LG7
YdI&OzaroE
privateList items; ZrA
OX'>u9
%O< qw
privateint totalCount; =h{jF7
$M(ZKS3,j
privateint[] indexes = newint[0]; [MkXQwY
?z2k74&M^
privateint startIndex = 0; B[I
a8t
=n}+p>\s
public PaginationSupport(List items, int ?_+h+{/@B
l{7q(
totalCount){ ?oc#$fcQ~
setPageSize(PAGESIZE); fs=W(~"
setTotalCount(totalCount); 'z=QV {ni
setItems(items); kdX]Afyj
setStartIndex(0); h!"|Q"18
} TZ]D6.mD
-]?F
public PaginationSupport(List items, int ?1f(@
LJ+fZ
N
totalCount, int startIndex){ `oxs;;P
setPageSize(PAGESIZE); ^@&RJa-kb
setTotalCount(totalCount); d`_X$P4y
setItems(items); ^h :%%\2
setStartIndex(startIndex); KV!!D{VS`@
} L)sCc0fv7k
B@Ae2_;
public PaginationSupport(List items, int m 8Q[+_:$H
"2}E ARa
totalCount, int pageSize, int startIndex){ #^>5,M2
setPageSize(pageSize); Vko1{$}t
setTotalCount(totalCount); tWNz:V
setItems(items); !]W}I
setStartIndex(startIndex); Rr#vv
} *:q ,G
p&:(D=pIu
publicList getItems(){ <Q4yN!6
return items; -qPYm?$
} d@:4se-q+
azj:Hru&t#
publicvoid setItems(List items){ jH1!'1s|
this.items = items; c&+p{hH+
} X\I"%6$
QzwA*\G
publicint getPageSize(){ ~olta\|
return pageSize; <V}^c/c!
} em87`Hj^lo
*uLlf'qU]
publicvoid setPageSize(int pageSize){ i_? S#L]h
this.pageSize = pageSize; (5SN=6O
} G|Du/XYh
*o/Q#
publicint getTotalCount(){ CywQ
return totalCount; 6NO_S
}
W6&s_ (
DL ^}?Ve
publicvoid setTotalCount(int totalCount){ JVzU'd;1!
if(totalCount > 0){ ]"3(UKx
this.totalCount = totalCount; @bN`+DC!<
int count = totalCount / Y6|8;2E
Vp;^_,
pageSize; *g}(qjl<
if(totalCount % pageSize > 0) fE\;C bi
count++; 2Mc}>UI?eO
indexes = newint[count]; %n3lm(-0U
for(int i = 0; i < count; i++){ m17H#!`
indexes = pageSize * {%S>!RA
"g)@jqq:>
i; p&nIUx"
} g,5r)FU`
}else{ qL6Rs
this.totalCount = 0; YGBVGpE9
} MLL4nkO,`
} ?mK`Wleh?
-?A,N,nnX
publicint[] getIndexes(){ ,FvBZ.4c3=
return indexes; D Hkmn
} tN'-4<+
x"@Y[
publicvoid setIndexes(int[] indexes){ Nw`}iR0i
this.indexes = indexes; qwlIz/j
} $Ik\^:-
kKV`9&dZe
publicint getStartIndex(){ niZ/yW{w
return startIndex; /dU-$}>ZI
} &;~x{q]3
E\5cb[Y
publicvoid setStartIndex(int startIndex){ RCED
K\*m
if(totalCount <= 0) #x"dWi(
this.startIndex = 0; qB`zyd8yu
elseif(startIndex >= totalCount) CU3[{a
this.startIndex = indexes FFH9$>A
$a|DR
[indexes.length - 1]; n3, ?klK
elseif(startIndex < 0) #GBe=tm\K
this.startIndex = 0; sK~d{)+T
else{ rz c}2I
this.startIndex = indexes WlHw\\ur
Sb=cWn P
[startIndex / pageSize]; $`:/OA<.
} p&wXRI
} :IFTiq5a;
y6|&bJ @
publicint getNextIndex(){ =(kwMJ
int nextIndex = getStartIndex() + ;m{*iKL6{
"^j&
^sA+
pageSize; (\
`knsE!
if(nextIndex >= totalCount) dQ97O{O:i
return getStartIndex(); KsM2?aqwf_
else i7:R4G(/#
return nextIndex; i]{M G'tg
} 41y}n{4n8
k'uN2m
publicint getPreviousIndex(){ 5_U3Fs
int previousIndex = getStartIndex() - vmI]N
L1"y5HJ
pageSize; }
FcWzi
if(previousIndex < 0) |
fAt[e _E
return0; 4ed+'-"m
else %C*oy$.
return previousIndex; PJu)%al
} {s} @$rW
K8y/U(@|D
} =T$-idx1l
k36%n
*4
>&h#t7<
K29]B~0%E
抽象业务类 B JDe1W3;'
java代码: 9.R)iA
@; ayl
w=Xil
/** (KaP=t}
* Created on 2005-7-12 WAlsh
*/ pyZ&[*@
package com.javaeye.common.business; $a(EF
6
+Ok R7bl
import java.io.Serializable; '`^<*;w
import java.util.List; BBy"qkTe
1bb~u/jU
import org.hibernate.Criteria; H"W%+{AR
import org.hibernate.HibernateException; $FEG0&
import org.hibernate.Session; U@v=q9'W
import org.hibernate.criterion.DetachedCriteria; (9x8,f0z
import org.hibernate.criterion.Projections; CW>f;
import {.2A+JT,
]Lq9Ompf(t
org.springframework.orm.hibernate3.HibernateCallback; Eh;SH^&6
import !h&A^sAc
(v*$ExF
org.springframework.orm.hibernate3.support.HibernateDaoS xe[Cuy$P
*Got
upport; IpQ51
9 aT#7B
import com.javaeye.common.util.PaginationSupport; j;eR9jI$T
[i24$UT
public abstract class AbstractManager extends $aTZC>R
4-efnB
HibernateDaoSupport { NZ`W`#{
az3rK4g
privateboolean cacheQueries = false; \MM(w&
9|O#+_=+v
privateString queryCacheRegion; )|f!}( p
rkW*C'2fz
publicvoid setCacheQueries(boolean @~Z:W<X
V}ZF\SG(K
cacheQueries){ DWDL|4
og
this.cacheQueries = cacheQueries; rJK3;d? E
} A][\L[8X
jJ86Ch
publicvoid setQueryCacheRegion(String Pb=J4Lvz(d
31-%IkX+k
queryCacheRegion){ lTsl=
this.queryCacheRegion = Qy |*[
jE_a++
queryCacheRegion; O$+J{@
} ;cIs$
;Ad$Q9)EE
publicvoid save(finalObject entity){ hp6S *d
getHibernateTemplate().save(entity); /m%Y.:g
} 1cWUPVQ
jLc4D'
publicvoid persist(finalObject entity){ hh`7b ,+ 4
getHibernateTemplate().save(entity); ?fcQd6-}
} 5'gV_U
<T JUKznO
publicvoid update(finalObject entity){ \M1-
getHibernateTemplate().update(entity); 0 }jB/Z_T
} ZZp6@@zyq'
I$v*SeVHE
publicvoid delete(finalObject entity){ rmutw~nHD
getHibernateTemplate().delete(entity); >[B[Q_})
} EI6K0{'&X
& D4'hL3
publicObject load(finalClass entity, %{s<h6{R
5F$ elW
finalSerializable id){ \gy39xoW(
return getHibernateTemplate().load pA9^-:\*
.0;Z:x_3
(entity, id); MHJH@$|]
} JSQNx2VqQ
VqLqj$P
publicObject get(finalClass entity, ;_),?(
LDHuf<`
finalSerializable id){ B'B,,Mz
return getHibernateTemplate().get FS30RP3
`/
<zH24[
(entity, id); fQq'_q5
}
?"[b408-
S1NM9xHJ
publicList findAll(finalClass entity){ Im
i)YC
return getHibernateTemplate().find("from GL'zs8AKf
%{g<{\@4(;
" + entity.getName()); 0dA'f0Uy\X
} sI/Jhw)
zl\mBSBx"
publicList findByNamedQuery(finalString x\!Q[
b&X- &F
namedQuery){ >8+:{NW
return getHibernateTemplate j-@3jFu
fEF1&&8^
().findByNamedQuery(namedQuery); B uV@w-|
} x;2tmof=L
i/`N~r
publicList findByNamedQuery(finalString query, ntE;*FyH
Q)S0z2
finalObject parameter){ $+qJ#0OE$
return getHibernateTemplate 0q(}n v
EOWLGleD1
().findByNamedQuery(query, parameter); pme5frM|
} +DFG762
k\X1`D}R
publicList findByNamedQuery(finalString query, XhjH68S(
E c[-@5x
finalObject[] parameters){ IY2caXu
return getHibernateTemplate
+T02AS
^=@L(;Y
().findByNamedQuery(query, parameters); 0@[]l{N
} oA`'~~!
ys|a ^VnN
publicList find(finalString query){ B B*]" gT
return getHibernateTemplate().find wB~Ag$~
Z}6
(query); $Kn{x!,"(
} 86$9)UI
+c!v%uX
publicList find(finalString query, finalObject C;#vW FE
$lmGMljF
parameter){ Hy~kHBIL
return getHibernateTemplate().find (<!Yw|~
jC7`_;>=
(query, parameter); 9q;n@q:29
} qV2aa9p+
B*#lkMr
public PaginationSupport findPageByCriteria T7_i:HU%
oZTKG'
(final DetachedCriteria detachedCriteria){ 45fk+#
return findPageByCriteria uQgv ;jsPz
Y8YNRyc=
(detachedCriteria, PaginationSupport.PAGESIZE, 0); [A99e`
} JJ_77i
,;9byb
public PaginationSupport findPageByCriteria <hazrKUn
+ >?"P^
(final DetachedCriteria detachedCriteria, finalint :=!?W^J
jy#'oadS?
startIndex){ z)N8#Y~vn
return findPageByCriteria /f2HZfj
CU'$JF
(detachedCriteria, PaginationSupport.PAGESIZE, H;5Fs KIF
bC{1LY0
startIndex); dHjJLs_
} WBdC}S
}3t
uzjP!qO
public PaginationSupport findPageByCriteria =z`GC1]bL
j}~3m$
(final DetachedCriteria detachedCriteria, finalint x-0S-1M
z4
4(
pageSize, f&x7g. I
finalint startIndex){ \UZlFE
return(PaginationSupport) 2Ur9*#~kGp
DY| s|:d
getHibernateTemplate().execute(new HibernateCallback(){ = rDoXm
publicObject doInHibernate co^kP##Y
*0M[lR0t
(Session session)throws HibernateException { jinDKJ,n;
Criteria criteria = \=3V]7\&
#_)<~
detachedCriteria.getExecutableCriteria(session); QEo
i9@3
int totalCount = Jb+cC)(
. AJ(nJ)
((Integer) criteria.setProjection(Projections.rowCount uEqL Dg
G}ZJ}5h
()).uniqueResult()).intValue(); ;Gf,$dbWn
criteria.setProjection 3Q'Q %2
0 ~2~^A#]\
(null); 0 8*bYJu
List items = _?Q0yVH;,
{akS K
criteria.setFirstResult(startIndex).setMaxResults |/rms`YQ
)xKZ)SxV
(pageSize).list(); '*K}$+l
PaginationSupport ps = JRfG]u6GU
}',/~T6
new PaginationSupport(items, totalCount, pageSize, "`;$wA
;VVKn=X=S=
startIndex); :5`=9_|
return ps; 3sUTdCnNf
} f'501MJu
}, true); T \d-r#{
} a B(_ZX'L
4#j W}4C{
public List findAllByCriteria(final aPD4S&"Q
O2z{>\
DetachedCriteria detachedCriteria){ z^;0{q,
return(List) getHibernateTemplate }.bhsy
h0i/ v
().execute(new HibernateCallback(){ `1;m:,9
publicObject doInHibernate tCZ3n
E8$k}I
(Session session)throws HibernateException { j0^%1
Criteria criteria = [1Cs
ry^FJyjW
detachedCriteria.getExecutableCriteria(session); "9Q @&C
return criteria.list(); ']]Czze
} N$cm;G=]
}, true); fGK=lT$
} /K!&4mK
UEkn@^&bg
public int getCountByCriteria(final X9ua&T2(l
`cu W^/c
DetachedCriteria detachedCriteria){ $Sz@u"ig%
Integer count = (Integer) fjD/<`}v
YVSAYv_ZG}
getHibernateTemplate().execute(new HibernateCallback(){ ~<
~PaP$=\
publicObject doInHibernate ^t X}5i`P
}2@Aj
(Session session)throws HibernateException { +hoZW R
Criteria criteria = &~9'7 n!
e+`LtEve0
detachedCriteria.getExecutableCriteria(session); .x6c.Y.S
return #J4{W84B
W|C>X=zTi
criteria.setProjection(Projections.rowCount v2Lx4:dzi
l~_]k
()).uniqueResult(); SQ$|s%)oB
} gXrXVv<)yw
}, true); qIXo_H&\C
return count.intValue(); ,#
i@jB
} x}\_o< d
} 32#|BBY
M`_RkDmy<
Tf0"9
1a_R8j
D7v-+jypp
I[P43>F3
用户在web层构造查询条件detachedCriteria,和可选的 Ii*tux!S
1W@ C]n4
startIndex,调用业务bean的相应findByCriteria方法,返回一个 k
5~#_D>
h`{agWB
PaginationSupport的实例ps。 0j@nOj(3
#ZzFAt
ps.getItems()得到已分页好的结果集 W>^WNo3YQ$
ps.getIndexes()得到分页索引的数组 &
B
CA
ps.getTotalCount()得到总结果数 kMJf!%L (
ps.getStartIndex()当前分页索引 q$#5>5&
ps.getNextIndex()下一页索引 E[IjeJB5
ps.getPreviousIndex()上一页索引 {DP%=4
H YA<
kK62yz,
Ln&'5D#
G0e]PMeFl
06)B<
q 4Rvr[
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 1$+-?:i C
CP5vo-/)-
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 x-hr64WFK
E2hy%y9Tp
一下代码重构了。 NA=I7I@
!PAuMj)P
我把原本我的做法也提供出来供大家讨论吧: 6!QY)H^j9,
/=y _#l
首先,为了实现分页查询,我封装了一个Page类: (vO\h8
java代码: @^O+ulLJ,]
}KEL{VUX
2cnyq$4k
/*Created on 2005-4-14*/ j'\!p):H
package org.flyware.util.page; f*(W%#*|
Q/u2Q;j>
/** 0`=>/Wr39
* @author Joa cN{(XmX5n
* k'(d$;Jgr
*/ v@qU<\Y>
publicclass Page { ;$il_xA)\>
aAT!$0H
/** imply if the page has previous page */ 47/14rY
2
privateboolean hasPrePage; +VE]
.*T
{/u}
/** imply if the page has next page */ qD]&&"B
privateboolean hasNextPage; Exu5|0AAE
}=7?
&
b
/** the number of every page */ 2:8p>^g=
privateint everyPage; CyHaFUbZ
t_Q\uo}
/** the total page number */ ~_XK<}SK
privateint totalPage; h?D>Dfeg%
$vC}Fq
/** the number of current page */ &/\Q 6$a
privateint currentPage; l-mt{2
1xf
Pe#
/** the begin index of the records by the current )XFaVkQ}
be->ofUYgs
query */ $FJf8u`
privateint beginIndex;
<< XWL:
i 6DcLE
ntZl(] l
/** The default constructor */ ru>c\X^|
public Page(){ #Yd'Vve
bJWPr
} -zSkon2Y^
'zUWO_(
/** construct the page by everyPage fzk^QrB
* @param everyPage Zf,9 k".'C
* */ 3$~oQC
public Page(int everyPage){ uXm_ pQpF
this.everyPage = everyPage; %fF0<c^-U
} N -z
~LG<Uu
/** The whole constructor */ nS`
:)#;
public Page(boolean hasPrePage, boolean hasNextPage, 'v~%rhq3
xG7/[ jG
l5/!0]/
int everyPage, int totalPage, pWm==Ds|
int currentPage, int beginIndex){ 141G~@-
this.hasPrePage = hasPrePage; 8TE2q Pm
this.hasNextPage = hasNextPage; 0Mo?9??
this.everyPage = everyPage; GKg&lM!O$
this.totalPage = totalPage; Y9w^F_relL
this.currentPage = currentPage; |ctcY*+
this.beginIndex = beginIndex; zF7*T?3b"
} k^i\<@v
]Jum(1Bo
/** >"/Sa_w
* @return C25EIIdRb
* Returns the beginIndex. vMHJgpd&j
*/ LJ{P93aq`^
publicint getBeginIndex(){ {;2Gl $\r
return beginIndex; D=^|6}
} i^Ip+J+[
kp=wz0#
/** )J>-;EYb8
* @param beginIndex 9e _8Z@|
* The beginIndex to set. Qk)E:
*/ aS3Fvk0R{h
publicvoid setBeginIndex(int beginIndex){ 1Y6DzWI
this.beginIndex = beginIndex; |ZmWhkOX
} ;) (F4
ej;\a:JL
/** 1${rQ9FIF
* @return >S[NI<=8S
* Returns the currentPage. 7,IH7l|G
*/ C?h}n4\B^?
publicint getCurrentPage(){ aBblP8)8;K
return currentPage; D>`lN
} \pwg8p[4Q
IPDQ
/** qi]"`\
* @param currentPage ;X}!;S%K
* The currentPage to set.
?}Y;/Lwx
*/ 6p)dO
c3L
publicvoid setCurrentPage(int currentPage){ @ |^;d
this.currentPage = currentPage; iAn]hVW
} %h^ f?.(:
NN"!kuM
/** N_Q\+x}zq
* @return \ 0J&^C
* Returns the everyPage. 8Rr ic[v
*/ ?Mj@;O9>'
publicint getEveryPage(){ 9J(jbJ7p
return everyPage; tvEf-z
} H"vy[/UcR
"b
`R_gG9
/** 0w9[Z
* @param everyPage )oCb9K:km
* The everyPage to set. '.5_L8
*/ ;UPI%DnE]
publicvoid setEveryPage(int everyPage){ gQ;1SY!
this.everyPage = everyPage; v$]eCj'
} 0NFYFd-50
UgC{
/** gBPYGci2F
* @return Sf"]enwB
* Returns the hasNextPage. w\`u|f;Aq
*/ 2J1YrHj3
publicboolean getHasNextPage(){ G5hh$Nmpi
return hasNextPage; eW/sPQ-
} n/vKxtW
FJH'!P\
/** !W48sZr1&
* @param hasNextPage _gn`Y(c$%
* The hasNextPage to set. ]`H8r y2
*/ [7sy}UH
publicvoid setHasNextPage(boolean hasNextPage){ V^D!\)#
this.hasNextPage = hasNextPage; P; DGs]PF
} 90[?)s
&
G8tb>q<V
/** t(Sjo8,
b
* @return =1e>$E#
* Returns the hasPrePage. Y-y<gW
*/ 9yWQ}h
publicboolean getHasPrePage(){ >j}.~$6dj_
return hasPrePage; _I
A{I
} e)):U
d7i 0'R
/** W, -fnJk
* @param hasPrePage kr{eC/Q"
* The hasPrePage to set. J{qpGRQNa
*/ )|Xi:Zd5>
publicvoid setHasPrePage(boolean hasPrePage){ T$vDw|KSVP
this.hasPrePage = hasPrePage; M_Z(+k{Gy
} %D
$+Z(
%[J|n~8_Z
/** /AhN$)(O
* @return Returns the totalPage. Api<q2@R
* /gUD!@
*/ 's7 (^1hH
publicint getTotalPage(){ {6Qd,CX
return totalPage; ! 1wf/C;=
} I]vCra
0k):OVfm=
/** :o=a@Rqx
* @param totalPage TW)~&;1l
* The totalPage to set. kD{qW=Lpn
*/ 2PVtyV3;
publicvoid setTotalPage(int totalPage){ &vHfuM`
this.totalPage = totalPage; $CP_oEb
} ,HHCgN
KXvBJA$
} [)KLmL%
u~\I
s$PPJJT{b
XPd@>2
WB(Gx_o3
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 \95O
Qs1e0LwA9
个PageUtil,负责对Page对象进行构造: lq*{2M{[
java代码: /M@6r<2`i
3V)NM%Aw
/+zzZnLl-M
/*Created on 2005-4-14*/ Y>i5ubR~
package org.flyware.util.page; b@?pofZ`k
vzPuk|q3
import org.apache.commons.logging.Log; ,'z=cB`+o
import org.apache.commons.logging.LogFactory; eR*y<K(d
Aat-938FP6
/** #s]'2O
* @author Joa VY]L<4BfGL
* [)L) R`
*/ X$(Dem
publicclass PageUtil { D5gDVulsh
w</qUOx
privatestaticfinal Log logger = LogFactory.getLog p|,3X*-ynx
N&K`bmtD
(PageUtil.class); w$%1j+%&
Ks_B%d
/** +204.Yj?D
* Use the origin page to create a new page MF]EX
* @param page nr>Os@\BU
* @param totalRecords @?YO_</
* @return Vb$4'K'
*/ RZrQ^tI3"
publicstatic Page createPage(Page page, int Y24H`
s1u/
]UFbG40Zo
totalRecords){ E
whCX'Vaj
return createPage(page.getEveryPage(), +%: /!T@@
6-!U\R2Z>
page.getCurrentPage(), totalRecords); Z(0sMOaX
} GiGXV @dq
. ]D7Il
/** #Rx|oSc}
* the basic page utils not including exception iwS55o
q[Ed6FM$~
handler c3]X#Qa#m$
* @param everyPage 7ElU5I<S
* @param currentPage 2ms@CQy(00
* @param totalRecords zc#$hIi
* @return page >J,y1jzJ
*/ \I[50eh|
publicstatic Page createPage(int everyPage, int .QVZ!
N_^s;Qj
currentPage, int totalRecords){ ( {}Z
'
everyPage = getEveryPage(everyPage); xG"*w@fs7
currentPage = getCurrentPage(currentPage); eGr;P aG
int beginIndex = getBeginIndex(everyPage, x-%4-)
TOC2[mc'
currentPage); ~&\} qz3
int totalPage = getTotalPage(everyPage, /CfgxPo
&w"1VOV<
totalRecords); lwj,8
boolean hasNextPage = hasNextPage(currentPage, 0<'Q;'2* L
DJ.n8hne
totalPage); M>LgEc-v67
boolean hasPrePage = hasPrePage(currentPage);
Vq>$ZlvS
4k4 d%
returnnew Page(hasPrePage, hasNextPage, G ,fh/E+
everyPage, totalPage, \[yg f6#[
currentPage, DLBHZ?+!
C0v1x=(xiM
beginIndex); Ap)[;_9BD
} f9FEH7S68
Fh0cOp(
privatestaticint getEveryPage(int everyPage){ U\~9YX8
return everyPage == 0 ? 10 : everyPage; 4_&+]S
} S%{^@L+V
|ryV7VJ8
privatestaticint getCurrentPage(int currentPage){ <A+n[h
return currentPage == 0 ? 1 : currentPage; W3aFao>!OZ
} s.qo/o\b
W _JGJV.^f
privatestaticint getBeginIndex(int everyPage, int
_ 0g\g~[
q47:kB{d
currentPage){ .XTR
HL*:
return(currentPage - 1) * everyPage; P|'eM%
} ).l`N&_peM
PT/TQW
privatestaticint getTotalPage(int everyPage, int '2X6>6`w
:Y)jf
totalRecords){ n4%ZR~9WH
int totalPage = 0; $vjl-1x&
MIF`|3$,
if(totalRecords % everyPage == 0) vA"MTncv
totalPage = totalRecords / everyPage; bpp{Z1/4
else K}e:zR;;^
totalPage = totalRecords / everyPage + 1 ; X" m0||
*}<