Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造 Rn~FCj,-
RBIf6oxdE
detachedCriteria,然后调用业务层Bean,进行动态条件查询,根 AN7WMX
yn<H^c
据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来 \?c0XD
JYL/p9K[I
自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改 Oe4 l`
=2
Y$b4Ga9j
。 :LBG6J
x^Tjs<#
分页支持类: ,oX48Wg_+
/AV
[g^x2
java代码: vA@Kb3,
{[G2{ijRz
S>OfUrt
package com.javaeye.common.util; TJ[C,ic=D
.w/#S-at
import java.util.List; wH=
9;2PoW8
publicclass PaginationSupport { Ou</{l/
y
,isK
publicfinalstaticint PAGESIZE = 30; aSd$;t~
{k] 2h4 &h
privateint pageSize = PAGESIZE; I"Y d6M%
;
w]GoeIg({
privateList items; 95Bw;U3E
qKt8sxg
privateint totalCount; au7%K5
>JwdVy^
privateint[] indexes = newint[0]; u':-DgK
fpf1^TZ
privateint startIndex = 0; Cnd70tbD )
$V-]DD%Y
public PaginationSupport(List items, int sv\'XarM
txQyHQ)@
totalCount){ w{k8Y?
setPageSize(PAGESIZE); ?g|K"P<1
setTotalCount(totalCount); '<~rV
setItems(items); W"S,~y
setStartIndex(0); DfwxPt#
} :0IxnK(r&
6cz%>@
public PaginationSupport(List items, int 1rh\X[@
[:sP Z{
totalCount, int startIndex){ wGa0w*$
setPageSize(PAGESIZE); m)3?hF)
setTotalCount(totalCount); K:yS24\%
setItems(items); =o\:@I[
setStartIndex(startIndex); DR3M|4[
} Hn)K;?H4
ANtp7ad
public PaginationSupport(List items, int J7$1+|"
nL!h hseH
totalCount, int pageSize, int startIndex){ ~ z4T
setPageSize(pageSize); VaC#9Tp2X
setTotalCount(totalCount); ?GqFtNz
setItems(items); '7o'u]
setStartIndex(startIndex); F48:mfj1r
} nP?=uGqCBq
1<A+.W
publicList getItems(){ qY\zZ
return items; ^y'xcq
} IcZ_AIjlk
&b,.W;+
publicvoid setItems(List items){ zYpIG8"o5
this.items = items; heoOOP(#
} 3~6F`G
^k &zX!W
publicint getPageSize(){ GbUcNROr
return pageSize; 8~RUYsg
} !_E E|#`n
PN2\:l+`
publicvoid setPageSize(int pageSize){ %8/Gsu;
this.pageSize = pageSize; L`FsK64@
} 7p3 ;b"'
d|TRP,y
publicint getTotalCount(){ nQK@Uy5Yr
return totalCount; nkHr(tF
7
} 7c!oFwM
=sRd5aMs
publicvoid setTotalCount(int totalCount){ *7oPM5J|v
if(totalCount > 0){ &=|W95
this.totalCount = totalCount; +A
W6 >yV`
int count = totalCount / ?# >|P-4
mmY~V:,Kd
pageSize; J x-^WB
if(totalCount % pageSize > 0) C
fQj7{
count++; ;w4rwL
indexes = newint[count]; 1mOZ\L!m*
for(int i = 0; i < count; i++){ GW'=/
z7
indexes = pageSize * z QoMHFL3
hw_7N)}
i;
&N0W!
} meR%);\
}else{ !IoD";Oi
this.totalCount = 0; Bp^>R`,
} '\1%%F7
} R.A}tV=j#
i3: sV 5
publicint[] getIndexes(){ OI %v>ns
return indexes; {ZbeF#*"
} [KWF7GQi
&IT'%*Y:V
publicvoid setIndexes(int[] indexes){ 8(KsU,%d
this.indexes = indexes; U,iTURd
} WSDNTfpI
>~BU<#
publicint getStartIndex(){ Ze WHSU
return startIndex; \'E _
} Q
C~~
G D[~4G
publicvoid setStartIndex(int startIndex){ =6
if(totalCount <= 0) =Z#tZ{"
this.startIndex = 0; q,u>`]}
elseif(startIndex >= totalCount) &o4L;A#&
this.startIndex = indexes 54uTu2
=AgY8cF!sl
[indexes.length - 1]; pe,c
elseif(startIndex < 0) 2#/ KS^
this.startIndex = 0; wk9tJ#}
else{ k%In
this.startIndex = indexes ,z%F="@b9
H:[z#f|t
[startIndex / pageSize];
\SLYqJ~m
} qh.c#t
} q<hN\kBs
t"0~2R6i
publicint getNextIndex(){ -vjjcyTt
int nextIndex = getStartIndex() + OPKX&)SE-
+nJ}+|@K
pageSize; _R5^4 -Qe
if(nextIndex >= totalCount) t9K.Jc0
return getStartIndex(); }FM<uBKW
else L~mL9[( ,
return nextIndex; xVl90ak
} 3ZZJYf=
v(: VUo]H
publicint getPreviousIndex(){ ww\/$ |
int previousIndex = getStartIndex() - RhQOl9
|(P>'fat-p
pageSize; *JpEBtTv=5
if(previousIndex < 0) PTePSj1N
return0; CJu;X[6
else x_@ev-
return previousIndex; ?` `+OH
} D!Gm9Pa}
U|
N`X54
} |f>y"T+1
M1ayAXO
8F[j}.8q
d>AVUf<o~
抽象业务类 Gf%o|kX]
java代码: P&F)E#Sa
hCo&SRC/5
g{D&|qWj
/** V) a6H^l
* Created on 2005-7-12 /kJ*WA?J
*/ ?%LD1 <ya
package com.javaeye.common.business; 't|F}@HP
Hou{tUm{xC
import java.io.Serializable;
#!hpe^t
import java.util.List; C$%QVcf
l y%**iN
import org.hibernate.Criteria; 4u(}eE
f7
import org.hibernate.HibernateException; @O3w4Zs
import org.hibernate.Session; vj_oMmjKw
import org.hibernate.criterion.DetachedCriteria; =~arj
import org.hibernate.criterion.Projections; oVhw2pKpM
import oqY?#p/
nQP0<_S
org.springframework.orm.hibernate3.HibernateCallback; 5Px.G*
import 34?yQX{
S m1bDa\!=
org.springframework.orm.hibernate3.support.HibernateDaoS NV91{o(-7
7<tqT
@c
upport; I;|Aiu*
D!<$uAT
import com.javaeye.common.util.PaginationSupport; Pw7'6W1
G|MDo|q]
public abstract class AbstractManager extends >3kR~:;
:^*V[77
HibernateDaoSupport { '^J/aV
$x)'_o}e
privateboolean cacheQueries = false; I^wj7cFo5
Mu (Y6
privateString queryCacheRegion; ]_=HC5"
i&30n#
publicvoid setCacheQueries(boolean M!hby31
ljis3{kn""
cacheQueries){ Nb8<8O
^
this.cacheQueries = cacheQueries; czb%%:EJs|
} TZP{=v<
@uE=)mP@
publicvoid setQueryCacheRegion(String N4v)0
5]Ra?rF
queryCacheRegion){ 7E5Dz7
this.queryCacheRegion = b(yO
[!q&r(-K
queryCacheRegion; pd;-z
} MUe'xK
ICTtubjV"
publicvoid save(finalObject entity){ ^hHeH:@
getHibernateTemplate().save(entity); __fR #D
} < t (Pw
7
b.-&,
publicvoid persist(finalObject entity){ bsP;
getHibernateTemplate().save(entity); 48ma&f;
} 55cldo
\O8f~zA{G
publicvoid update(finalObject entity){ Vtg/,1KQ
getHibernateTemplate().update(entity); 4@V]zfu^Q
} )ra66E
xI4I1"/
publicvoid delete(finalObject entity){ D+)=bPMe
getHibernateTemplate().delete(entity); by
U\I5
} SN{*:\>,
f0`'
i[
publicObject load(finalClass entity, m3(T0.j0P
L_|uB
finalSerializable id){ /8MQqZ C
return getHibernateTemplate().load V0 F30rK
?Bzi#Z
(entity, id); 0GYEt
} rc$!$~|I3Z
,/:a77
publicObject get(finalClass entity, 3NN'E$"3
<VU4rk^=
finalSerializable id){ bXH^Bm
return getHibernateTemplate().get ww($0A`ek
=]QH78\3
(entity, id); '=
<`@
} Jo3(bl%u
mrC+J*
publicList findAll(finalClass entity){ )6Q0f
return getHibernateTemplate().find("from 8}{o2r@
yJ8}*Gj&
" + entity.getName()); +qj*P9
} HQ3`:l
bez'[Y{
publicList findByNamedQuery(finalString 3Y{)(%I
pfZ,t<bE2
namedQuery){ U[QD!
return getHibernateTemplate B^_Chj*m
),]2`w&k
().findByNamedQuery(namedQuery); dBMe`hM)
} Px#QZZ
Dw`m>'J0
publicList findByNamedQuery(finalString query, "b>KUzuYT
e?| URW
finalObject parameter){ pTALhj#,
return getHibernateTemplate ^Y7 /Ow
q[7d7i/r6
().findByNamedQuery(query, parameter); ],F}}pv
} gXu^"
`_1(Q9Q
publicList findByNamedQuery(finalString query, hOB\n!
6%kJDY.
finalObject[] parameters){ x$n~f:1Y
return getHibernateTemplate h
??C4z
Wzqb>.
().findByNamedQuery(query, parameters); F@$RV_M
} Aw4?y[{H
>&;>PZBPCO
publicList find(finalString query){ KR=d"t Qw
return getHibernateTemplate().find 4Oy.,MDQP
)[^y
t0%
(query); ;tp]^iB#
} :4ja@~
OK-sT7But
publicList find(finalString query, finalObject A~SL5h
*
-KJh_
parameter){ ])V2}gH
return getHibernateTemplate().find f6B-~x<l
1l+kO,X]
(query, parameter); E- )VPZ1D
} ZU|6jI}
heL$2dZ5H
public PaginationSupport findPageByCriteria #zS1Zf^KP
rGnI( m.
(final DetachedCriteria detachedCriteria){ @S}/g/+2
return findPageByCriteria o_Jn_3=
a)!![X?\
(detachedCriteria, PaginationSupport.PAGESIZE, 0); /l,+oG%\
} fvcW'T}r
A%Bgp?B
public PaginationSupport findPageByCriteria +0XL5('2
EBoGJ_l
(final DetachedCriteria detachedCriteria, finalint R_1)mPQ^P
O^9CV*]!n
startIndex){ m'cz5mcD
return findPageByCriteria /&PKCtm&~
%G;0T;0L
(detachedCriteria, PaginationSupport.PAGESIZE, 3 p/b
I|,pE**T
startIndex); Deg!<[Nw
} q$r&4s)To
F9(._ow[
public PaginationSupport findPageByCriteria t})lr\
))7LE|1l
(final DetachedCriteria detachedCriteria, finalint 'lJEHz\
{<qF }i:V
pageSize, ,E\h !/X
finalint startIndex){ qysTjGwa]
return(PaginationSupport) w8O" =},
L0rip5[;d
getHibernateTemplate().execute(new HibernateCallback(){ NS`07 #z^
publicObject doInHibernate 3&'2aW
YT>KJ
(Session session)throws HibernateException { ^Ye\u1n4
Criteria criteria = #/Ruz'H1>
qv[[Q[RK-5
detachedCriteria.getExecutableCriteria(session); M)&Io6>
int totalCount = Xka<I3UD5
~+yZfOcw
((Integer) criteria.setProjection(Projections.rowCount vCw<G6tD
9lf*O0Z&n
()).uniqueResult()).intValue(); BZK2$0
criteria.setProjection +`@M*kd
uG!:Z6%p
(null); {7*>Cv}
List items = x H-X|N
>M]6uf
criteria.setFirstResult(startIndex).setMaxResults qve
./
"#yJHsu]
(pageSize).list(); j~;;l!({i
PaginationSupport ps = bLzs?eos
#B8*gFZB
new PaginationSupport(items, totalCount, pageSize, j[I`\"
,apNwkY
startIndex); ~@T<gA9V
return ps; q2hFOm
} 7p.>\YtoR}
}, true); >I}9LyZt
} 41G5!=i
<Mx0\b!
public List findAllByCriteria(final (a@?s$LG
%f j+70
DetachedCriteria detachedCriteria){ ~e `Bq>
return(List) getHibernateTemplate fmfTSN(Q~`
!M7<BD};
().execute(new HibernateCallback(){ O:'?n8rWL
publicObject doInHibernate S${Zzt"
(-0ePSOG
(Session session)throws HibernateException { aZ X mlq
Criteria criteria = ~gE:-
4[yIOs
detachedCriteria.getExecutableCriteria(session); LJFG0 W
return criteria.list(); bDnZcf
} lx |5?P
}, true); W=JAq%yd<
} b0v:12q
b>\?yL/%+?
public int getCountByCriteria(final p =(@3%k
v>Lm;q(
DetachedCriteria detachedCriteria){ S?ujRp
Integer count = (Integer) :O-iykXyI
D}3T|N
getHibernateTemplate().execute(new HibernateCallback(){ )yG"^Ulu
publicObject doInHibernate KS}hU~
>j*;vG5T
(Session session)throws HibernateException { 6E~g# (8
Criteria criteria = dY7'OAUyVl
5|QzU|gPn
detachedCriteria.getExecutableCriteria(session); bWWXc[O2&(
return B9R(&<4
$e1=xSQp4
criteria.setProjection(Projections.rowCount 6$U]9D
=,y |00l
()).uniqueResult(); =( v^5
} @"-</x3o
}, true); ko;>#::
return count.intValue(); wh6yPVVF/
} V7d)S&*V
} P{OAV+cG
A4C+5R
fKH7xu!V4+
<%.5hCTp97
{\H/y c|@
Sr?#wev]rn
用户在web层构造查询条件detachedCriteria,和可选的 E>b2+;Jv
fyTAou6hI
startIndex,调用业务bean的相应findByCriteria方法,返回一个 Jn:ZYqc
5r~#0Zf*
PaginationSupport的实例ps。 S$)*&46g
`?T#Hl>j
ps.getItems()得到已分页好的结果集 !oPq?lW9
ps.getIndexes()得到分页索引的数组 q6Rr.A
ps.getTotalCount()得到总结果数 ~h}Fi
ps.getStartIndex()当前分页索引 8Jf.ECQT
ps.getNextIndex()下一页索引 Y8M]Lwj
ps.getPreviousIndex()上一页索引 &Z(K6U#.
=4V&*go*\
pl@O
N"=[
-;f*VM.a
Jk@]tAwoM
^b: (jI*l
`&\Q +W
连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错 \(226^|j
Xq'cA9v=$J
,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做 infl.
D\IjyZ-O
一下代码重构了。 S$KFf=0
DPi_O{W>
我把原本我的做法也提供出来供大家讨论吧: zvABU+{jD
Qt_dEl
首先,为了实现分页查询,我封装了一个Page类: J>fQNW!{
java代码: "KcA
;iDPn2?6?x
a]Lp?
/*Created on 2005-4-14*/ @`\VBW
package org.flyware.util.page; _|h8q-[3
%$%&m1Y
/** +`3!I
* @author Joa P[s8JDqu
* >S$Z
*/ ]HpA5q1ck
publicclass Page { X,9 M"E
2
hiNEJ_f
/** imply if the page has previous page */ f~ }H
privateboolean hasPrePage; UH3sH
t
~]ZpA-*@Ut
/** imply if the page has next page */ %Uz(Vd#K
privateboolean hasNextPage; 2^?:&1:
i2~
/** the number of every page */ ,3nN[)dk
privateint everyPage; ^>"z@$|\:
6 uKTGc4
/** the total page number */ Y@PI {;!
privateint totalPage; (b`]M`Fc
5d Z |!
/** the number of current page */ j0@[Br %7
privateint currentPage; LjV]0%j?r
^MBm==heL
/** the begin index of the records by the current :;t
#\%L/
2h?uNW(0Q
query */ *Q1~S]g
privateint beginIndex; g2unV[()_
p!s}=wI`
kI%%i>Y}
/** The default constructor */ EI\9_}@,
public Page(){ GguFo+YeZ
MxBTX4ES
} &w=3^
86z]<p (
/** construct the page by everyPage dDnf^7q/
* @param everyPage <})'Y~i
* */ *cyeO*
public Page(int everyPage){ xU%w=0z<
this.everyPage = everyPage; g[w,!F
} 3"rzb]=R
u :F~K
/** The whole constructor */ KoS*0U<g6
public Page(boolean hasPrePage, boolean hasNextPage, A'nq}t 3
$-On~u0g
[CAR[
g&
int everyPage, int totalPage, `c'W-O/
int currentPage, int beginIndex){ c2K:FdB
this.hasPrePage = hasPrePage; `%j~|i)4
this.hasNextPage = hasNextPage; ]D,MiDph
this.everyPage = everyPage; 5Vi>%5A>l
this.totalPage = totalPage; BATG FS&
this.currentPage = currentPage; J/3_C6UZ
this.beginIndex = beginIndex; 6)BR+U
} w4fW<ISg
b=/curl&
/** RN@ctRS
* @return m XXt'_"
* Returns the beginIndex. 5^j45'%I
*/ +d|mR9^([
publicint getBeginIndex(){ &hk-1y9QS
return beginIndex; <r3J0)r}
} xz:J
Zy09L}5 9P
/** !\g+8>
* @param beginIndex "kc/J*u-3
* The beginIndex to set. B^^r\L9
*/ *@TZ+{t
publicvoid setBeginIndex(int beginIndex){ GHmv}
Z
this.beginIndex = beginIndex; S~Id5T:,
} *FJZiPy
b?eu jxqg
/** H}:LQ~_2
* @return : g.46dp4
* Returns the currentPage. 0VK-g}"x
*/ ''|#cEc)
publicint getCurrentPage(){ )7:J[0ZiQ
return currentPage; {f{ZHi|
} Sv;_HZ
pNRk.m]
/** U!m@DJj
* @param currentPage vpU#xm.K
* The currentPage to set. 5cWw7V<m
*/ <?D\+khlq
publicvoid setCurrentPage(int currentPage){ z;u
this.currentPage = currentPage; b9XW9O`B
} P<fnLQ9
JBnKK
/** aC<KN:TN6
* @return PoIl>c1MS
* Returns the everyPage.
RDtU43
*/ 4Yl;
publicint getEveryPage(){ VS&TA>
return everyPage; L_w+y
} /W<>G7%.
e]Zngt?b
/** A0%}v*
* @param everyPage t&9A
]<n%,
* The everyPage to set. |T{C,"9y
*/ c`fG1s
publicvoid setEveryPage(int everyPage){ rcGb[=B f
this.everyPage = everyPage; xTGxvGv8
} 2On_'^O
"YB**Y
/** hb{u'=
* @return e${>#>
* Returns the hasNextPage. mR;qMX)0h
*/ FE o269Ur
publicboolean getHasNextPage(){ 7$rjlVe
return hasNextPage; KzQ3.)/q
} \a+(=s(;
?<*-j4v
/** .IJ_jt-^d
* @param hasNextPage -rKO
)}
* The hasNextPage to set. %0Y=WYUH>
*/ )a3IQrf=
publicvoid setHasNextPage(boolean hasNextPage){ "@9?QI}
this.hasNextPage = hasNextPage; Jxqh)l
} Ys!>+nL|
Od?qz1
/** ]qB:PtX
* @return pZyQY+O
* Returns the hasPrePage. vzn{h)D
*/ *H[Iq!@
publicboolean getHasPrePage(){ _
%%Z6x(
return hasPrePage; dCu'>G\bP
} fw; rbP!
[&*6_q"V
/** pN\Vr8tJ
* @param hasPrePage [Ei1~n)o
* The hasPrePage to set. FWC5&tM
*/ 9dzdrT
publicvoid setHasPrePage(boolean hasPrePage){ OMk5{-8B
this.hasPrePage = hasPrePage; M. td^l0
} k0Ek:MjJr
=_]2&(?
/** iE.-FZc
* @return Returns the totalPage. ,p;_\\<
* p*5\+WO>!(
*/ t\v+ogbk)
publicint getTotalPage(){ 8 ^B;1`#
return totalPage; xug)aE
} dO7;}>F$n
8q)=
/** gw _$
* @param totalPage joul<t-
* The totalPage to set. /=?ETth @
*/ dd|W@Xp -
publicvoid setTotalPage(int totalPage){ NcCvm#
this.totalPage = totalPage; O--7<Q\
} [Vdz^_@Y
^Y{D^\},
} S=3^Q;V/1
_#o'
+_Z
yg]2erR
fE,9zUo
F^!mI7Z|(2
上面的这个Page类对象只是一个完整的Page描述,接下来我写了一 _y .]3JNm
^6p'YYj"5
个PageUtil,负责对Page对象进行构造: HEA eo!
java代码: pUl8{YGS
"8V{5e!%j'
&@ 3m-Z
/*Created on 2005-4-14*/ 2>em0{e
package org.flyware.util.page; bl/,*Wx:4.
)gR=<oa
import org.apache.commons.logging.Log; o ojiJ~
import org.apache.commons.logging.LogFactory; ezTZnutZ
6ri\>QrF
/** Kud'pZ{P
* @author Joa 0"[`>K~7a8
* !p
8psi0
*/ O_K_f+7
publicclass PageUtil { `#IcxweA
> 7`&0?
privatestaticfinal Log logger = LogFactory.getLog o07IcIo
P"7ow-
(PageUtil.class); ?a/n<V '
:u%$0p>
/** 'PdmI<eXQ
* Use the origin page to create a new page &d`^E6#
* @param page TA}UY7v
* @param totalRecords rVAL|0;3
* @return cQpnEO&SL
*/ +_HdX
w#
publicstatic Page createPage(Page page, int N
b3$4(F
: cp
totalRecords){ $R{8z-,Q
return createPage(page.getEveryPage(), i+M*J#'
SlT*C6f
page.getCurrentPage(), totalRecords); HW7FP]NH
} &:?e &
]@xL=%
/** K}I0o!(#
* the basic page utils not including exception I6OSC&A`
"2HY5AE
handler ;MTz]c
* @param everyPage nx4P^PC
* @param currentPage P6?0r_Y
* @param totalRecords )@:l^$x
* @return page ekzjF\!y
*/ hH+bt!aH
publicstatic Page createPage(int everyPage, int +?N}Y {Y&
?J|4l[x
currentPage, int totalRecords){ kC^.4n
om
everyPage = getEveryPage(everyPage); O<,r>b,
currentPage = getCurrentPage(currentPage); `B#Z;R
int beginIndex = getBeginIndex(everyPage, K=kH%ZK
E5x]zXy4
currentPage); Q(\ wx
int totalPage = getTotalPage(everyPage, A_r<QYq0|
l`rC0kJ]
totalRecords); V;[p438o
boolean hasNextPage = hasNextPage(currentPage, \5[-Ml
.S vyj
totalPage); E#h~V5Tf
boolean hasPrePage = hasPrePage(currentPage); 6/y*2z;
5
;vC(Go
returnnew Page(hasPrePage, hasNextPage, >rRf9wO1l
everyPage, totalPage, Yk>8g;<
currentPage, wA0eG@xi)
DPPS?~Pq
beginIndex); Gc5VQ^]
} vo b$iS`>=
jyjQzt
>\
privatestaticint getEveryPage(int everyPage){ UA0tFeH
return everyPage == 0 ? 10 : everyPage; |a(Q4 e/,
} 6:RMU
!1-&Y'+
privatestaticint getCurrentPage(int currentPage){ 8?Wgawx
return currentPage == 0 ? 1 : currentPage; PdM*5g4
} )H+h;U
9[f%;WaS
privatestaticint getBeginIndex(int everyPage, int k.>6nho`TV
Sf5]=F-w
currentPage){ =5_y<0`4
return(currentPage - 1) * everyPage; ]|BojSL_
} {*__B} ,N
/d]~ly
@uI
privatestaticint getTotalPage(int everyPage, int iwkJ~(5z
V#H8d_V
totalRecords){ KZi'v6
int totalPage = 0; @$ftG
{|p"; uJ
if(totalRecords % everyPage == 0) . z].:$J&
totalPage = totalRecords / everyPage; 7AeP Gr
else ioWJj.%
totalPage = totalRecords / everyPage + 1 ; NY 4C@@"
i?W]*V~ply
return totalPage; |=,83,a
} 9RB`$5F;
`+fk`5Y
privatestaticboolean hasPrePage(int currentPage){ skK*OO2-
return currentPage == 1 ? false : true; DOT=U
_
} `;}H%
W1<