Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 j?P8&Fm<
3}X; WE `
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 .+hM1OF`x
7I<] ;j
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 $5a%hK
GHo=)NTjy
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 '}T6e1#JV
R?$Nl
。 olO&7jh7|
m8njP-CZ
分页支持类: 3ws}E6\D
c`h/x>fa
java代码: 7ezf.[{R
y~pJ|E
_<1uO=km6
package com.javaeye.common.util; M/mUY
~#jD/
import java.util.List; |lhVk\X
');QmN%J
publicclass PaginationSupport { E>3fk
&r
Lg/UEV-
publicfinalstaticint PAGESIZE = 30; ONw;NaE,
R)?zL;,x
privateint pageSize = PAGESIZE; 4#BoS9d2I<
vS|uN(a.P
privateList items; s`:-6{E
.OC{,f+
privateint totalCount; 30v 3C7o=
r*!sA5
privateint[] indexes = newint[0]; :D'#CoBA
:LwNOuavN
privateint startIndex = 0; Q@-7{3
?E?dg#yk
public PaginationSupport(List items, int a}+7MEUmZ/
@i[z4)"S
totalCount){ n)7olP0p
setPageSize(PAGESIZE); $6XCHVx
setTotalCount(totalCount); e)~7pXYV)
setItems(items); !`G7X
setStartIndex(0); wcT0XXh
} ;hOrLy&O
t$z
FsFTQ
public PaginationSupport(List items, int Tv&-n
K~_[[)14b
totalCount, int startIndex){ (f 0p
setPageSize(PAGESIZE); Et=N`k_gO
setTotalCount(totalCount); U'st\Dt
setItems(items); I
=t{ u;
setStartIndex(startIndex); O0{M3-
} Gv!*
Qk4
XTHy
CK
public PaginationSupport(List items, int 0.+"K}
9 T4x1{mO
totalCount, int pageSize, int startIndex){ *FkG32k
setPageSize(pageSize); fL8+J]6A6
setTotalCount(totalCount); lbv9 kk[
setItems(items); 05\A7.iy
setStartIndex(startIndex); J>P{8Aw
} x8sSb:N
PF-7AIxs"
publicList getItems(){ 38dXfl
return items; )POuH*j
} -i@1sNx&'
d*Y&V$?zl
publicvoid setItems(List items){ 5A:mu+Iz6H
this.items = items; wwS{V
} e`#c[lbAAM
;%Jw9G\h
publicint getPageSize(){ kL,{H~iq;
return pageSize; q@ >s#
}
&j,rq?eh$
(z0S5#g
,x
publicvoid setPageSize(int pageSize){
c<j2wKz
this.pageSize = pageSize; hbhh
m
} /a%5!)NE%
h5&l#>8&
publicint getTotalCount(){ KDW%*%!
return totalCount; 1O1/P,u+
} %_wX9ZT
N %-Cp)
publicvoid setTotalCount(int totalCount){ jRS0(8
if(totalCount > 0){ %0}qMYS
this.totalCount = totalCount; k+2~=#
int count = totalCount / -cCujDM#T
C`3}7qi|C
pageSize; ^ad
p<?q4
if(totalCount % pageSize > 0) p6]4YGw*^
count++; ,V!s w5_5m
indexes = newint[count]; sTO*
for(int i = 0; i < count; i++){ A1:<-TF6^p
indexes = pageSize * Z9s tB>?
h8oG5|Y
i; 8*3<Erv
} rl9YB %P
}else{ !@!,7te
this.totalCount = 0; HcA;'L?Dw
} &IM;Yl
} Fd-PjW/E8
S,m)yh.
publicint[] getIndexes(){ ^#2w::Ds}!
return indexes; (,`ypD +3q
} S,Boutd
1q<BYc+z
publicvoid setIndexes(int[] indexes){ V&<vRIsN
this.indexes = indexes; =vMFCp;mv
}
2J
=K\ L
D)XF@z;
publicint getStartIndex(){ Iodk1Y;
return startIndex; /=A?O\B7
} @FKNB.>
x):cirwkl
publicvoid setStartIndex(int startIndex){ F6R+E;"4R'
if(totalCount <= 0) y|U3
this.startIndex = 0; L6Ykv/V
elseif(startIndex >= totalCount) Ro$'|}(+A
this.startIndex = indexes qz"di~ 7
vFLQq,?Nh
[indexes.length - 1]; e5_a.c
elseif(startIndex < 0) LO<R<zz
this.startIndex = 0; k'{'6JR
else{ ZIQy}b'
this.startIndex = indexes NL
3ri7n
3JM0 m (
[startIndex / pageSize]; bmVksi2b
} w~hO)1c],:
} ED&>~~k)
g-"@%ps
publicint getNextIndex(){ FuiG=quY
int nextIndex = getStartIndex() + wUj[c7Y%
z&[Rw<{Psb
pageSize; Ahk6{uz
if(nextIndex >= totalCount) /"?yB$s
return getStartIndex(); +<7~yZ[Z8
else }#5Vt
return nextIndex; hRTw8-wy:
} nI.K|hU:P
r18euB%
publicint getPreviousIndex(){ U/9xO"b{.
int previousIndex = getStartIndex() - lJ;7sgQ#
] W39HL
pageSize; "C %<R
if(previousIndex < 0) =V~pQbZ
return0; T#kPn#|
else VA+
?xk
return previousIndex; ekC
1wN
l
} l
Os91+.%
xR}^~14Bz
} ewHk
(ru
yXP+$oox9
S?ELFq(g
V
.+ mK|)
抽象业务类 OP0KK^#
java代码: koDIxj'%X
=p~k5k4
?D?_D,"C
/** vYb.Ub+
* Created on 2005-7-12 oS3'q\
*/ h=h4`uA9
package com.javaeye.common.business; [w*YH5kX
>tc#Ofgzd
import java.io.Serializable; EQ< qN<uW
import java.util.List; $Y'}wB{pc
MYNNeO
import org.hibernate.Criteria; [`pp[J-~7
import org.hibernate.HibernateException; D>tex/Of3
import org.hibernate.Session; }#%3y&7M7
import org.hibernate.criterion.DetachedCriteria; $>^DkrOd
import org.hibernate.criterion.Projections; NMJX `
import tNpBRk(}
;;>hWAS
org.springframework.orm.hibernate3.HibernateCallback; Y$JGpeq8w
import A#NJ8_
i/UDda"E
org.springframework.orm.hibernate3.support.HibernateDaoS M~'4>h}
) 0NKL:u
upport; 24{Tl
q3
2S%[YR>>
import com.javaeye.common.util.PaginationSupport; >Sc)?[H
b0X<)1O
public abstract class AbstractManager extends 'k^d-Mh>h
'NaNh0y
HibernateDaoSupport { _{Z!$q6,
Y=G9|7*lO
privateboolean cacheQueries = false; s"OP[YEke/
rK` x<
privateString queryCacheRegion; Nk
JOD3>U
`G/%U~
publicvoid setCacheQueries(boolean &~4;HjS
oVZI([O
cacheQueries){ xA7>";sla[
this.cacheQueries = cacheQueries; GK6/S_l%D+
} 9j94]w2v
"Y'MuV'x
publicvoid setQueryCacheRegion(String # <?igtUO
OdKfU^
queryCacheRegion){ &,DZ0xA
this.queryCacheRegion = %_P[
C}4
$G\WW@*GE
queryCacheRegion; )wZ;}O
} y<9' 3\
Ga<Uvr%+
publicvoid save(finalObject entity){ 0Y>5&
getHibernateTemplate().save(entity); nj1TX
} bwR$910b
_BFDsQ
publicvoid persist(finalObject entity){ I3I1<}>]Z
getHibernateTemplate().save(entity); pH9xyN[:a
} k2 _i;v
o}4~CN9}
publicvoid update(finalObject entity){ 9ZJn 8ki
getHibernateTemplate().update(entity); )tvP|
} C(%b!Q,2
#Vy8<Vy&w
publicvoid delete(finalObject entity){ PEr &|H2
getHibernateTemplate().delete(entity); XJZ\ss
} !eu\ShI
&xWej2a!
publicObject load(finalClass entity, !-veL1r
+,Ud 3iS
finalSerializable id){ 9}|x
N8
return getHibernateTemplate().load \V(w=
jd.{J{o
(entity, id); 8P?p
} F$sDmk#
7!;H$mxP
publicObject get(finalClass entity, !kxJ&VmeF
A.9ZFFz
finalSerializable id){ /2f
return getHibernateTemplate().get H/2dVUU
eKUP,y;[I
(entity, id); NNxzZ!q!
} V/&JArW
5La' I7q
publicList findAll(finalClass entity){ \1He9~6
return getHibernateTemplate().find("from nYnBWDnV
F~$ay@g
" + entity.getName()); g-~]^ $
} GYt|[GC
`N}aV Ns
publicList findByNamedQuery(finalString e?7Oom
V7"^.W*
namedQuery){ )Drif\FF)
return getHibernateTemplate Bwc_N.w?3
[gDl<6a#4
().findByNamedQuery(namedQuery); 6b1AIs8
} 2EH0d6nt
7'!DK;=TD6
publicList findByNamedQuery(finalString query, 5{xK&[wR*
F.{$HJ
finalObject parameter){ ._q}lWT
return getHibernateTemplate DJZ$M
l4>c
().findByNamedQuery(query, parameter); ny"z<N&}/
} b~*CJ8Ad
G ?Hx"3:?
publicList findByNamedQuery(finalString query, ?[=OQ/E
?="?)t[
finalObject[] parameters){ 90 >V he
return getHibernateTemplate $-p9cyk
xpp>5d
!
().findByNamedQuery(query, parameters); TT oW>RP#
} KPAvN M
<Gna}ALkg
publicList find(finalString query){ #}Hdyl I\}
return getHibernateTemplate().find
20]p<
sp&gw XPG
(query); DLN zH
} F_Gc_eT
@1A.$:
publicList find(finalString query, finalObject P Ij
&~c`p [
parameter){ <1#hX(Q
return getHibernateTemplate().find _SnD)k+TgJ
X"sJiF S
(query, parameter); -\7_^8 am
} q8!]x-5$6j
Q- 7L,2TL
public PaginationSupport findPageByCriteria #;=sJ[m4
]=p^32
(final DetachedCriteria detachedCriteria){ ";;!c. !^
return findPageByCriteria N@Q_5t0bk
\
B'AXv6
(detachedCriteria, PaginationSupport.PAGESIZE, 0); !4T!@"#
} ?r{hrAx
g4y&6!g
public PaginationSupport findPageByCriteria g;Zy3
tAPf#7{|
(final DetachedCriteria detachedCriteria, finalint dvM%" k
,pY:kQ
startIndex){ mGa :~x
return findPageByCriteria 6Jq3l_
hV+=hX<h
(detachedCriteria, PaginationSupport.PAGESIZE, ]V)*WP#a
gLRDd~H
startIndex); "lrQC`?
} gWL`J=DiU
fv@<
public PaginationSupport findPageByCriteria
CvR-lKV<
+* j8[sz
(final DetachedCriteria detachedCriteria, finalint '\GU(j
JL>frS3M
pageSize, $wn0oIuW
finalint startIndex){ D &@Iuo
return(PaginationSupport) *U}ztH-+/
z4~p(tl
getHibernateTemplate().execute(new HibernateCallback(){ 7#c4.9b?
publicObject doInHibernate ~4|Tr z2T
V/:2xT
(Session session)throws HibernateException { X7[gfKGL)N
Criteria criteria = a6Joa&`dv
|fW_9={1kQ
detachedCriteria.getExecutableCriteria(session); ~L>86/hP,N
int totalCount = `/?'^A%Ik
"$aoI Xv
((Integer) criteria.setProjection(Projections.rowCount L^zh|MEyzk
GwfC l{l
()).uniqueResult()).intValue(); \*Yr&Lm
criteria.setProjection bdY:-8!3
,<'>jaC
(null); #@xB ?u-0q
List items = qGX#(,E9;
J3(E{w8Q
criteria.setFirstResult(startIndex).setMaxResults #vhN$H :&q
0AdxV?6z
(pageSize).list(); 89;@#9
PaginationSupport ps = 'n
^,lXWB
`uUzBV.FR
new PaginationSupport(items, totalCount, pageSize, TVx
`&C+
Ibu9AwPm
startIndex); G maNi
return ps; ji
./m8(
} !_QT{H
}, true); ggiy{CdR
} w^ OB
pf107S
public List findAllByCriteria(final AS@(]T#R
AWYlhH4c?t
DetachedCriteria detachedCriteria){ fU?#^Lg
return(List) getHibernateTemplate P.5l9Ns(O
5 7t.Ud
().execute(new HibernateCallback(){ ;>f\fhi'
publicObject doInHibernate 11YJW-V
KYtCN+vsG
(Session session)throws HibernateException { *i^$xjOa
Criteria criteria = } `r.fD
_@!vF,Wcf
detachedCriteria.getExecutableCriteria(session); :i4(cap&}F
return criteria.list(); z fv@<'
} "C\yM{JZ
}, true); e\cyiW0
} #IZh}*$
q(:L8nKT]
public int getCountByCriteria(final MTZCI}
3
dJ362
DetachedCriteria detachedCriteria){
V){Io_"
Integer count = (Integer) Z|$DchC
.ex;4( -!
getHibernateTemplate().execute(new HibernateCallback(){ nEd
"~
publicObject doInHibernate 8K-P]]
GRbbU#/=G
(Session session)throws HibernateException { E
V)H>kM
Criteria criteria = gqy>;A:kO
v9-4yZU^WR
detachedCriteria.getExecutableCriteria(session); ?%UiW7}j';
return &C+2p
2O
Ur">_
criteria.setProjection(Projections.rowCount o]Ne|PEpO
&Wcz~Gx3Q
()).uniqueResult(); BJWlx*U]
} a;Y:UwD9*
}, true); #f24a?n|
return count.intValue(); n|&=6hiI
} qz]qG=wmL
} '(3 QyCD
O5-GrR^yt
*)-@'{]u B
_$c o Y
\WFcb\..
1L4-;HYJm
用户在web层构造查询条件detachedCriteria,和可选的 ;9mRumLG"
p03I&d@w>
startIndex,调用业务bean的相应findByCriteria方法,返回一个 [;Lgbgt3f
$&Vba@v
PaginationSupport的实例ps。 TS9<uRO0
mu{C>w_Rz
ps.getItems()得到已分页好的结果集 g^+p7G
ps.getIndexes()得到分页索引的数组 y!P!Fif'
ps.getTotalCount()得到总结果数 hZ*vk
ps.getStartIndex()当前分页索引 <ytzGDx
ps.getNextIndex()下一页索引 >9A18xC
ps.getPreviousIndex()上一页索引 vRC >=y*=
Vf pT5W<
*{#C;"
`i
cs2po
ial{A6X
Eqz|eS*6
VqW5VLa
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 A)"L+Yu5
[?I<$f"
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 !;,\HvEZYw
igA?E56?
一下代码重构了。 9h\RXVk{tA
:Q("
我把原本我的做法也提供出来供大家讨论吧: 4%~*}
2H.g!( Oza
首先,为了实现分页查询,我封装了一个Page类: tdxzs_V,-
java代码: #%nV\ Bl
S!u8JG1
aq_K,li#w
/*Created on 2005-4-14*/ [%bGs1U
package org.flyware.util.page; fub04x)
*Igb3xK%
/** Fnak:R0
* @author Joa ^@* `vz^_
* @ !su7
*/ d%0Gsga}
publicclass Page { i;9X_?QF
G8+&fn6
/** imply if the page has previous page */ rIFW1`N}i
privateboolean hasPrePage; ]?1_.Wjtt
L$_%T
/** imply if the page has next page */ O$6&4p*F.
privateboolean hasNextPage; oMg-.!6
vx($o9
/** the number of every page */ ]$L5}pE3
privateint everyPage; *
rlVE
Up?RN %gq
/** the total page number */ E& 6I`8
privateint totalPage; !Ea >tQ|
li3,6{S#
/** the number of current page */ g?"QahHG
privateint currentPage; _*e_?]G-
i#b /.oa
/** the begin index of the records by the current RN-gZ{AW
*t| !xO
query */ 1Mp-)-e
privateint beginIndex; KHZ[drb6$
B@M9oNWHu
G-)e(u
/** The default constructor */ 8_4!Ar>2
public Page(){ n?cC]k;P~
Z}!'fX."
} ].xSX0YQ%
k)7i^1U
/** construct the page by everyPage /jJD
{
* @param everyPage d*{Cv2A.
* */ %r1#G.2YW
public Page(int everyPage){ ZT!8h$SE:
this.everyPage = everyPage; o+{,>t
} J.h` 0$!
m0;j1-t
/** The whole constructor */ VB*c1i
public Page(boolean hasPrePage, boolean hasNextPage, QGfwvFm
nm#23@uZ4K
jw{N#QDh
int everyPage, int totalPage, |OCiq|#
int currentPage, int beginIndex){ ?[ )}N
_o#
this.hasPrePage = hasPrePage; *$%~/Q@]
this.hasNextPage = hasNextPage; xwZ1Q,'C
this.everyPage = everyPage; 9Zl4NV&B
this.totalPage = totalPage; 9k71h`5
this.currentPage = currentPage; u=InE|SH
this.beginIndex = beginIndex; %HpPTjAW
} G 0pq'7B
QxW+|Gt._
/** udUc&pX
* @return
sG#O s
* Returns the beginIndex. A)9]^@,
*/ 4_-&PZ,d
publicint getBeginIndex(){ R4;1LZ8XzS
return beginIndex; uxL+oP0
} ,H6P%
GEy7Vb)
/** &q|vvF<G
* @param beginIndex a({Rb?b
* The beginIndex to set. wry`2_c
*/ i/_rz.c~3
publicvoid setBeginIndex(int beginIndex){ l=XZBe*[g'
this.beginIndex = beginIndex; Y<W9LF
} ,X_3#!y
d>F7i~W
/** ]*a(^*}A%
* @return =t_+ajY%
* Returns the currentPage. p9i7<X2&
*/ <$?#P#A
publicint getCurrentPage(){ UUWRC1EtI
return currentPage; 46T(1_Xt~
} b~fl,(sZp
I\1E=6"
/** 31^/9lb
* @param currentPage Cw:|(`9
* The currentPage to set. [.|& /O
*/ [K
#$W
publicvoid setCurrentPage(int currentPage){ ~H \P0G5GA
this.currentPage = currentPage; C&0f8PnD
} pSQ2wjps
D#'CRJh;7
/** 0c"9C_7^g
* @return Yl au
* Returns the everyPage. ~ a2A"#f
*/ %6lGRq{/?
publicint getEveryPage(){ th*!EFA^o
return everyPage; _gK}Gi?|
} uYs45 G
w ;$elXP|
/** pR0!bgC
* @param everyPage @)Vb?|3
* The everyPage to set. EK>x\]O%T
*/ A1B[5a*o!
publicvoid setEveryPage(int everyPage){ s'tXb=!HO
this.everyPage = everyPage; `@\FpV[|P
} 3?aM\z;
^WWr8-
/** bp8sZK"z
* @return -+qg
* Returns the hasNextPage. ^K[xVB(&
*/ s$f9?(,.Ay
publicboolean getHasNextPage(){ ~,F]~|U7l
return hasNextPage; ,%/F,O+#
} uHf1b?W
Q!-"5PX
/** [Ti' X#
* @param hasNextPage DfkGNBY
* The hasNextPage to set. )=glN<*?
*/ ]E:L
publicvoid setHasNextPage(boolean hasNextPage){ 7dB_q}<
this.hasNextPage = hasNextPage; :O,,fJ<x.O
} x=K'Jj
yIpgZ0:h
/** CO
ZfR~}
* @return hms Aim9i
* Returns the hasPrePage. !f!YMpN
*/ w5-^Py
publicboolean getHasPrePage(){ ,{"K^
return hasPrePage; @/01MBs;
} [=-,i#4
?<0'h{z Ny
/** ZS3T1
<z
* @param hasPrePage |Cfo(]>G
* The hasPrePage to set. DB jUHirK
*/ zuJ` 704
publicvoid setHasPrePage(boolean hasPrePage){ `"~ X1;
this.hasPrePage = hasPrePage; Iw$T'I+4W
} h4slQq~K
BlqfST#6
/** 2gvS`+<TP
* @return Returns the totalPage. I2z7}*<u
* O9N%dir
*/ Vz5<Gr
publicint getTotalPage(){ RzB64
return totalPage; rhQO#_`
} >qI:
{qry2ZT5
/** S[rfcL"
* @param totalPage O1]XoUH<
* The totalPage to set. </fTn_{2s8
*/ [h\_yU[P
publicvoid setTotalPage(int totalPage){ 3fop.%(
this.totalPage = totalPage; 9I|Q`j?p`
} YWq{?'AaR
4x/u$Ixzh=
} "bjbJC&T
>R/^[([;]
+A_jm!tJS(
"yXqf%CGE
mvtuV`
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 I|mxyyf
=0U"07%}
个PageUtil,负责对Page对象进行构造: 5bWy=Xk
B
java代码: N4_V
hP1;$
_..5G7%#%
/*Created on 2005-4-14*/ <DdzDbgax
package org.flyware.util.page; 'ka"0~:NS{
lU3Xd_v
O
import org.apache.commons.logging.Log; l}Vg;"1'J
import org.apache.commons.logging.LogFactory; kZ
9n@($B
5YiBw|Z7 "
/** "w{,ndZ
* @author Joa L\kT9wWK|
* h6Hop mWVx
*/ DZ;2aH
publicclass PageUtil { ![_GA)7
n<sA?T
privatestaticfinal Log logger = LogFactory.getLog ^m^,:]I0P
"}UYsXg
(PageUtil.class); \cq.M/p
%u$dN9cw
/** ),I7+rY
* Use the origin page to create a new page hB*3Py27L
* @param page SB!m&;Tb
* @param totalRecords E{|n\|
* @return |.U-
yyz
*/ SVyJUd_
publicstatic Page createPage(Page page, int fm,:8%
y/A<eHLy
totalRecords){ CW#$%
return createPage(page.getEveryPage(), qfEB VS(
e?b<-rL
page.getCurrentPage(), totalRecords); `r8bBzr@%
} bk-aj'>+
9]/ju
/** ,k3aeM~`%w
* the basic page utils not including exception S{ !m})1?
SjOIln
handler l{x?i00tAS
* @param everyPage ZZl4|
* @param currentPage 32V,25 (`5
* @param totalRecords \ \~4$Ai[
* @return page F1o"H/:n
*/ ^l/$ 13=
publicstatic Page createPage(int everyPage, int #8jH_bi
6Bm2_B
currentPage, int totalRecords){ _A/ ]m4
everyPage = getEveryPage(everyPage); 4.mbW
currentPage = getCurrentPage(currentPage); '}wYSG-
int beginIndex = getBeginIndex(everyPage, dQL!
>6a
{VE$i2nC8
currentPage); w]0jq
U6
int totalPage = getTotalPage(everyPage, =1vVITwl
+nslS:(
totalRecords); rJm%qSZz
boolean hasNextPage = hasNextPage(currentPage, #8d$%F))
Q-N.23\1
totalPage); WH$
Ls('
boolean hasPrePage = hasPrePage(currentPage); Pjff%r^
xX.Ox
returnnew Page(hasPrePage, hasNextPage, 1P\_3.V{
everyPage, totalPage, |KC3^
currentPage, !f\6=Z?>3
w65
$ R
beginIndex); w,.Hdd6
} GS3ydN<v
O_PC/=m1@
privatestaticint getEveryPage(int everyPage){ jWW2&cBm\
return everyPage == 0 ? 10 : everyPage; *lG$B@;rc|
} 6dmTv9e
n%<.,(.(S
privatestaticint getCurrentPage(int currentPage){ o&~z8/?LA
return currentPage == 0 ? 1 : currentPage; /bylA`IMW
} Ve8`5
BWX&5""
privatestaticint getBeginIndex(int everyPage, int {ersXQ:
j{P,(-
currentPage){ rd1&?X
return(currentPage - 1) * everyPage; s}9aZ
} 1.H"$D>TC
xI~\15PhG
privatestaticint getTotalPage(int everyPage, int ^J~}KOH
_L!"3
totalRecords){ 1ck2Gxn
int totalPage = 0; Z?hBn`.
j4}aK2[<
if(totalRecords % everyPage == 0) }u+R,@l/
totalPage = totalRecords / everyPage; $9 DZ5"
else ($W9
?
totalPage = totalRecords / everyPage + 1 ; HKcipDW
#G{T(0<F
return totalPage; V`WfJ>{;Z
} KQ9:lJKr
c@q>5fR/c
privatestaticboolean hasPrePage(int currentPage){ 6y5arP*6e
return currentPage == 1 ? false : true; JrL/LGY
} a*IJ)'S
>LU*F|F]B
privatestaticboolean hasNextPage(int currentPage, vP~F+z
@g
S5Px9&N8(
int totalPage){ W'0wT ZG
return currentPage == totalPage || totalPage == 63u'-Z"4
\AK|~:\]
0 ? false : true; *,n7&
} Vd1K{rH#
*<