|
About
Community
Docs
Tools
Comparisons
Site Translations
|
|
Tietoja t?st? oppaasta
|
Velocity k?ytt?j?n opas on tarkoitettu sivusuunnittelijoille ja
sis?ll?ntuottajille avuksi tutustuttaessa Velocityyn ja sen
yksinkertaiseen mutta tehokkaaseen skriptikieleen, Velocity
Template Language:en (VTL). Useat t?m?n oppaan esimerkeist?
k?sittelev?t Velocityn k?ytt?mist? dynaamisen sis?ll?n
lis??miseksi web sivuille, mutta kaikki VTL esimerkit toimivat
HTML sivujen lis?ksi yht? hyvin my?s muiden sivujen ja sivupohjien
kanssa.
Kiitos ett? valitsit Velocityn!
|
|
|
Mik? on Velocity?
|
Velocity on javapohjainen sivumoottori (template engine). Sen
avulla sivusuunnittelijat voivat viitata java -koodissa
m??riteltyihin metodeihin. Sivusuunnittelijat voivat ty?skennell?
java ohjelmoijien kanssa samanaikaisesti k?ytt?en
Malli-N?kym?-Ohjain (Model-View-Controller, MVC)
suunnittelumallia. MVC mallissa sivusuunnittelijat voivat
keskitty? t?ysin luomaan hyvin suunniteltua sivustoa, ja
ohjelmoijat voivat keskitty? koodaamaan ykk?sluokan
koodia. Velocity erottaa java -koodin web sivuista, tehden
sivustosta pitk?ll? aikav?lill? helpommin yll?pidett?v?n ja
antamalla varteenotettavan vaihtoehdon JSP:lle (Java Server
Pages) ja PHP:lle.
Velocity? voidaan k?ytt?? web sivujen, SQL:n, PostScriptin ja
muunlaisten tulosteiden tuottamiseen sivupohjista (template). Sit?
voidaan k?ytt?? joko itsen?isen? ty?kaluna l?hdekoodin ja
raporttien luomiseen, tai muihin j?rjestelmiin integroituna
komponenttina. Velocity tarjoaa sivupohjaratkaisun Turbine web
sovelluskehykselle. Yhdess? Velocity ja Turbine tarjoavat
sivupohjaratkaisun jonka avulla web sovelluksia voidaan kehitt??
todellisen MVC -mallin mukaisesti.
|
|
|
Miten voin k?ytt?? Velocity??
|
|
Kurakauppa esimerkki
|
Oletetaan ett? olet kuraa myyv?n onlinekaupan
sivusuunnittelija. Kutsumme kauppaa "Kurakauppa
Online":ksi. Kauppa k?y hyvin. Asiakkaat tilaavat vaihtelevia
m??ri? eri kuratyyppej?. He p??sev?t tutkimaan tekemi??n tilauksia
sek? tekem??n uusia ostoja kirjautumalla sivullesi k?ytt?en
k?ytt?j?tunnustaan ja salasanaansa. T?ll? hetkell? suosittu
Terracotta -kura on alennusmyynniss?. Pieni osa asiakkaistasi
ostaa s??nn?llisesti Kirkkaanpunaista Kuraa, joka my?s on
alennusmyynniss?, mutta pienemm?n suosionsa vuoksi yleens?
mainittu sivulla hieman syrj?ss?. Tiedot kustakin asiakkaasta
talletetaan tietokantaan, joten er??n? p?iv?n? her?? kysymys;
Miksip? emme k?ytt?isi Velocity? kohdentamaan erikoistarjouksia
kurasta asiakkaille jotka ovat kiinnostuneita juuri tuosta
kuratyypist??
Velocityn avulla verkkosivut on helppo personoida k?vij?idesi
mukaan. Kurakauppa Onlinen sivusuunnittelijana haluat tehd? sivun
jonka asiakas n?kee kirjauduttuaan j?rjestelm??n.
Tapaat yrityksesi ohjelmoijat ja sovitte, ett? muuttuja
$asiakas pit?? sis?ll??n tiedot parhaillaan kirjautuneena
olevasta asiakkaasta. Muuttujassa $kuratTarjouksessa ovat
tiedot kuratyypeist? jotka ovat parhaillaan
erikoistarjouksessa. $tarjous objektissa on metodeja
jotka auttavat mainostamisessa. T?ll? kertaa keskitymme vain
n?ihin kolmeen viittaukseen. Muista, ett? sinun ei tarvitse
huolehtia siit? kuinka ohjelmoijat hakevat tarvittavat tiedot
tietokannasta, sinun tarvitsee tiet?? vain ett? se toimii. N?in
p??set tekem??n omaa ty?t?si ja ohjelmoijat p??sev?t tekem??n
omaansa.
Voisit lis?t? seuraavat VTL lauseen sivulle:
 |
 |
 |
 |
<HTML>
<BODY>
Hei $asiakas.Nimi!
<table>
#foreach( $kura in $kuratTarjouksessa )
#if ( $asiakas.onOstanut($kura) )
<tr>
<td>
$tarjous.haePromo( $kura )
</td>
</tr>
#end
#end
</table>
|
 |
 |
 |
 |
foreach lauseen toiminta kuvataan yksityiskohtaisemmin
j?ljemp?n?; t?rke?? t?ss? on t?m?n lyhyen skriptin tekem? vaikutus
sivullesi. Kun Kirkkaanpunainen Kura on alennusmyynniss? ja sit?
joskus aiemmin ostanut asiakas kirjautuu sis??n, asiakas n?kee
ilmoituksen alennuksesta parhaalla mahdollisella paikalla. Jos
toinen, Terracottakuraa ostanut asiakas kirjautuu j?rjestelm??n,
ilmoitus Terracottakuran alennusmyynnist? n?kyy h?nelle
ensimm?isen?. Velocity on joustava ja sen k?yt?ss? vain
mielikuvituksesi on rajana.
VTL hakemistossa on kuvattu Velocityn kaikki elementit jotka
yhdess? antavat k?ytt??si tehokkaan ja joustavan ty?kalun jota
tarvitset luodaksesi web sivuistasi dynaamisen. P??set
hy?dynt?m??n Velocityn voimaa jatkuvasti paremmin sit? mukaa kun
opit k?ytt?m??n n?it? elementtej?.
|
|
|
|
|
Velocity Template Language (VTL): Johdanto
|
Velocityn sivunkuvauskieli (Velocity Template Language, VTL)
tarjoaa helpon ja yksinkertaisen keinon liitt?? dynaamista
sis?lt?? web sivulle. Dynaamisen sis?ll?n k?ytt?minen pit?isi
onnistua nopeasti jopa sellaiselta sivusuunnittelijalta jolla on
ohjelmointikokemusta vain v?h?n, tai ei ollenkaan.
VTL k?ytt?? viittauksia dynaamisen aineiston lis??miseen
verkkosivulle. Muuttujat ovat yhdentyyppisi?
viittauksia. Muuttujat voivat viitata johonkin java -koodissa
m??riteltyyn, tai niiden arvo voidaan m??ritt?? web -sivulla
annetun VTL lauseen avulla. Seuraavassa on esimerkki VTL
lauseesta joka voidaan lis?t? HTML -dokumenttiin:
Kuten kaikki VTL lauseet (statement), t?m?kin lause alkaa #
merkill? ja sis?lt?? ohjeen (directive): set. Kun verkkosivun
k?ytt?j? hakee sivun Velocity etsii sivupohjastasi kaikki
# -merkit. Sitten se tulkitsee mitk? niist? merkitsev?t
VTL lausetta, ja mitk? # merkeist? ovat osa sivujesi
normaalia HTML -koodia, eiv?tk? kuulu VTL -koodiin.
# merkki? seuraa ohje, set. set ohjeen
j?lkeen tulee suluissa ilmaus (expression), -- yht?l? joka m??ritt??
arvon muuttujalle. Muuttuja on ilmaistu
vasemmalla ja arvo oikealla puolella. N?m? on erotettu =
merkill?.
Yll? olevassa esimerkiss? muuttuja on $a ja arvo on
Velocity. Kaikkien viittausten tapaan t?m?kin muuttuja
alkaa $ merkill?. Arvot ovat aina lainausmerkkien
sis?ll?; Velocityss? muuttujien datatyypeist? ei tule
sekaannuksia, koska vain merkkijonoja (string) voi antaa
muuttujien arvoksi.
Seuraava nyrkkis??nt? voi auttaa ymm?rt?m??n Velocityn toimintaa:
Viittaukset alkavat $ merkill? ja niit? k?ytet??n
jonkin hakemiseen. Ohjeet alkavat # merkill? ja niit?
k?ytet??n jonkin suorittamiseen.
Yll? olevassa esimerkiss? #set -ohjetta k?ytet??n arvon
m??ritt?miseksi muuttujaan. Muuttujaa $a voidaan t?m?n
j?lkeen k?ytt?? sivupohjassa tulostamaan "Velocity".
|
|
|
Viittaukset
|
VTL:ss? on kolme erityyppist? viittausta: muuttujat, ominaisuudet
ja metodit. VTL:?? k?ytt?v?n? sivusuunnittelijana sinun, ja
javapuolta koodaavien ohjelmoijien on sovittava viittausten
nimist?, jotta voit k?ytt?? niit? sivupohjissasi.
Kaikkea viittauksissa olevaa ja niihin m??ritelt?v?? tietoa
k?sitell??n tekstityyppisen?. Jos on esimerkiksi m??ritelty
objekti $foo (Integer objekti), Velocity kutsuu objektin
.toString() metodia objektin arvon muuntamiseksi
tekstityyppiseksi.
Muuttujat
Muuttujan lyhyt merkint?tapa koostuu ensimm?isen? olevasta "$"
merkist?, jonka j?lkeen tulee VTL tunniste. VTL
tunnisteen on alettava aakkosnumeerisella merkill? (a..z tai
A..Z). Muuttujan loput merkit ovat rajoitettu seuraaviin:
- aakkoset (a .. z, A .. Z)
- numerot (0 .. 9)
- viiva ("-")
- alaviiva ("_")
Seuraavassa muutamia esimerkkej? toimivista muuttujaviittauksista:
 |
 |
 |
 |
$foo
$kuraLinko
$kura-linko
$kura_linko
$kuraLinko1
|
 |
 |
 |
 |
Kun VTL viittaa muuttujaan, kuten $foo, muuttuja voi
saada arvonsa joko sivupohjassa olevalta set ohjeelta,
tai java -koodista. Jos esimerkiksi javamuuttujalla $foo
on arvo bar silloin kun sivupohjaa haetaan, bar
korvaa kaikki $foo muuttujan esiintymiskohdat web
sivulla. Toisaalta jos sivulle lis?t??n lause
Sivun tuloste on sama kaikilla $foo muuttujan
esiintymiskohdille jotka tulevat t?m?n lauseen j?lkeen.
Ominaisuudet
Toinen VTL:n viittaustyyppi ovat ominaisuudet joilla on oma
tunnusomainen muotonsa. Lyhyt merkint?tapa muodostuu ensimm?isen?
olevasta $ merkist?, jonka j?lkeen tulee VTL tunniste,
jota seuraa piste (".") ja toinen VTL tunniste. Seuraavassa on
esimerkkej? toimivista ominaisuusviittauksista:
 |
 |
 |
 |
$asiakas.Osoite
$ostos.Summa
|
 |
 |
 |
 |
K?sittelemme ensimm?isen esimerkin $asiakas.Osoite
tarkemmin. Viittauksella voi olla kaksi merkityst?. Se saattaa
tarkoittaa; hae asiakas nimisest? hashtable taulukosta
arvo joka on liitetty avaimelle Osoite. Toisaalta
$asiakas.Osoite voi my?s viitata metodiin (k?sittelemme
metodeihin viittaavat viittaukset seuraavassa kappaleessa);
$asiakas.Osoite saattaa olla lyhennetty muoto
viittauksesta $asiakas.getOsoite(). Velocity tulkitsee
sivua haettaessa kumpaa n?ist? vaihtoehdoista tarkoitetaan, ja
palauttaa vastaavan arvon.
Metodit
Metodit ovat m??ritelty java -koodissa ja niiden avulla voidaan
suorittaa jokin toimenpide; esimerkiksi laskutoimitus tai jonkin
p??t?ksen tekeminen. Metodit ovat viittauksia jotka muodostuvat
aloittavasta "$" merkist?, jota seuraa VTL tunniste, jonka j?lkeen
tulee VTL Metodirunko. VTL Metodirunko koostuu VTL
tunnisteesta jota seuraa vasen sulkumerkki "(", jota seuraa
valinnainen parametrilista, jota seuraa oikeanpuoleinen
sulkumerkki ")". Seuraavassa on esimerkkej? toimivista
metodiviittauksista:
 |
 |
 |
 |
$asiakas.getOsoite()
$ostos.getSumma()
$sivu.setOtsake( "Minun kotisivuni" )
$henkilo.setOminaisuudet( ["Outo", "Kummallinen", "Innostunut"] )
|
 |
 |
 |
 |
Metodirungossa esiintyv? get tarkoittaa "hae" ja set "aseta".
Kaksi ensimm?ist? esimerkki? -- $asiakas.getOsoite() ja
$ostos.getSumma() -- n?ytt?v?t samanlaisilta kuin
Ominaisuudet -osiossa aiemmin; $asiakas.Osoite ja
$ostos.Summa. Jos arvasit ett? n?ill? esimerkeill? on
jotakin yhteytt? toisiinsa, olit oikeassa!
VTL ominaisuuksia voidaan k?ytt?? lyhyempin? muotoina VTL
metodeista. Ominaisuudella $asiakas.Osoite on t?ysin sama
vaikutus kuin k?ytt?m?ll? metodia
$asikas.getOsoite(). Yleisesti ottaen ominaisuuksien
k?ytt? on suositeltavaa silloin kuin se vain on
mahdollista. Suurin ero ominaisuuksien ja metodien v?lill? on se,
ett? metodeille voi antaa parametreja.
Seuraavien metodien kanssa voidaan k?ytt?? lyhytt? muotoa:
 |
 |
 |
 |
$aurinko.getPlaneetat()
$mato.getMulta()
$albumi.getValokuva()
|
 |
 |
 |
 |
N?iden metodien voisimme olettaa palauttavan auringolle kuuluvien
planeettojen nimet, sy?tt?v?n matomme, tai hakevan valokuvan
albumista. Seuraavissa metodeissa toimii vain pitk? muoto:
 |
 |
 |
 |
$aurinko.getPlaneetat( ["Maa", "Mars", "Neptunus"] )
## lyhyess? muodossa $sun.Planets ei voida antaa parametreja
$sisyphus.pushRock()
## Velocity olettaa ett? tarkoitan $sisyphus.getRock()
$kirja.setOtsake( "Catalonian kotisivu" )
## Parametrilistaa ei voida antaa
|
 |
 |
 |
 |
Muodollinen viittausten merkint?
Edellisiss? esimerkeiss? k?ytettiin viittauksille lyhytt?
merkint?tapaa. Viittauksille on olemassa my?s muodollinen
merkint?tapa, jota k?ytet??n seuraavissa esimerkeiss?:
 |
 |
 |
 |
${kuraLinko}
${asiakas.Osoite}
${osto.getSumma()}
|
 |
 |
 |
 |
Voit k?ytt?? lyhytt? muotoa viittauksiin l?hes aina, mutta
joissain tapauksissa muodollista viittausta tarvitaan virheett?m?n
toiminnan turvaamiseksi.
Oletetaan ett? olet luomassa lausetta jonka sis?lt? riippuu
muuttujasta. Muuttujaa $pahe k?ytet??n pohjana luotaessa
muuttujasta riippuvaista sanaa. Tarkoituksena on sallia k?ytt?j?n
valita pohjasana ja tuottaa toinen seuraavista tuloksista: "Juha
on pyromaani." tai "Juha on kleptomaani.". T?ss? tapauksessa
lyhyen viittausmuodon k?ytt?minen ei toimisi. Tutki seuraavaa
esimerkki?:
Velocity olettaa ett? tarkoitat muuttujaa $pahemaani,
vaikka k?ytett?v? muuttuja oli $pahe. Koska Velocity ei
l?yd? arvoa muuttujalle $pahemaani, se palauttaa
$pahemaani. T?m? ongelma voidaan ratkaista k?ytt?m?ll?
muodollista viittausta.
Nyt Velocity ymm?rt?? ett? haluttu viittaus on $pahe, ei
$pahemaani. Muodollinen viittausten merkint? on usein
hy?dyllinen silloin kun viittaukset ovat kiinni muussa tekstiss?.
Hiljainen viittausten merkint?
Kun Velocitylt? haetaan viittaus jolle ei ole m??ritelty arvoa,
palauttaa se normaalisti viittauksen tekstin?. Oletetaan
esimerkiksi ett? seuraavat viittaukset ovat osa VTL sivupohjaa:
 |
 |
 |
 |
<input type="text" name="email" value="$email"/>
|
 |
 |
 |
 |
Kun lomake latautuu ensimm?isen kerran muuttujaviittauksella
$email ei ole arvoa. Oletuksena Velocity t?ytt??
lomakkeen tekstill? "$email". Haluaisit kuitenkin kentt??n
mieluummin tyhj?n arvon. K?ytt?m?ll? hiljaista viittausten
merkint?? voidaan Velocityn normaali toiminta est??;
$email koodin sijaan k?yt?t viittausta
$!email. Yll? oleva koodi n?ytt?isi siis seuraavalta:
 |
 |
 |
 |
<input type="text" name="email" value="$!email"/>
|
 |
 |
 |
 |
Kun lomake latautuu ensimm?isen kerran eik? muuttujalla
$email ole arvoa, tulostetaankin kentt??n tyhj? teksti
"$email" tekstin sijaan.
Muodollista ja hiljaista muuttujien merkint?? voidaan k?ytt?? my?s
yhdess?;
 |
 |
 |
 |
<input type="text" name="email" value="$!{email}"/>
|
 |
 |
 |
 |
|
|
|
Kirjaimellisesti
|
VTL k?ytt?? erikoismerkkej? kuten $ ja # omassa
toiminnassaan, joten n?iden merkkien k?ytt? sivupohjassa vaatii
erityist? huolellisuutta. T?ss? kappaleessa k?sittelemme
$ merkin suojaamisen (escape).
Dollari
Seuraavassa lauseessa dollarimerkin k?yt?ss? ei ole ongelmaa:
"Ostin markkinoilta s?kin perunoita hintaan $2.50!". Kuten
mainittu, VTL tunniste alkaa aina aakkosmerkill?, joten merkint??
$2.50 ei ole vaaraa sekoittaa viittaukseksi.
VTL viittausten suojaaminen
Ongelmatilanne saattaa synty? silloin, kun Velocity ei osaa
p??tell? tarkoitetaanko dollarinmerkill? merkki? itse??n, vai
viittausta. Erikoismerkkien suojaaminen on paras keino
k?sitell? VTL erikoismerkkej? sivupohjissa. Suojaamiseen k?ytet??n
kenoviivaa ( \ ).
 |
 |
 |
 |
#set( $email = "foo" )
$email
|
 |
 |
 |
 |
Kun Velocity k?sittelee $email viittauksen
sivupohjassasi, se etsii l?ytyyk? sen nimiselle muuttujalle
arvoa. T?ss? tapauksessa tuloste tulee olemaan foo, koska
$email on m??ritelty. Jos $email muuttujaa ei
olisi m??ritelty tulisi tulosteeksi $email.
Oletetaan ett? $email on m??ritelty (sill? on esimerkiksi
arvo foo), ja ett? haluat muuttujan arvon sijaan tulostaa
sen nimen $email. T?m? saavuttamiseksi on useita keinoja,
joista helpoin on suojausmerkin k?ytt?minen.
 |
 |
 |
 |
## Seuraava rivi m??rittelee muuttujan $email t?ss? sivupohjassa:
#set( $email = "foo" )
$email
\$email
\\$email
\\\$email
|
 |
 |
 |
 |
tulosteeksi tulee
 |
 |
 |
 |
foo
$email
\$email
\\$email
|
 |
 |
 |
 |
Huomaa $ merkin eteen liitetty \
merkki. Suojausmerkit tulkitaan vasemmalta oikealle, joten
\\\$email tulostuu \\$email. Vertaa n?it?
esimerkkej? tulosteeseen joka saadaan kun $email
muuttujaa ei ole m??ritelty.
 |
 |
 |
 |
$email
\$email
\\$email
\\\$email
|
 |
 |
 |
 |
tulosteeksi tulee
 |
 |
 |
 |
$email
\$email
\\$email
\\\$email
|
 |
 |
 |
 |
Huomaa kuinka Velocity k?sittelee eri tavalla viittaukset joiden
arvo on m??ritelty niist? joita ei ole m??ritelty. Seuraavassa on
set ohje joka asettaa $foo muuttujalle arvon
gibbous.
 |
 |
 |
 |
#set( $foo = "gibbous" )
$kuu = $foo
|
 |
 |
 |
 |
Tulosteeksi tulee: $kuu = gibbous -- miss? $kuu
tulostetaan muuttujan nimen?, koska sen arvoa ei ole m??ritelty ja
gibbous tulostetaan muuttujan $foo arvona.
My?s VTL ohjeiden suojaaminen on mahdollista; t?m? kuvataan
tarkemmin Ohjeet -kappaleessa.
|
|
|
Ohjeet
|
Ohjeet ovat helppok?ytt?isi? skriptielementtej? joita
voidaan k?ytt?? web sivun tulosteen manipuloimiseen. Viittausten
avulla sivupohjien suunnittelijat voivat tuottaa web sivuille
dynaamista sis?lt??, kun taas ohjeet antavat mahdollisuuden
m??ritell? sivuston ulkoasun ja sis?ll?n.
#set
#set ohjetta k?ytet??n arvon m??ritt?miseksi
viittaukselle. Arvo voidaan m??ritt?? joko muuttujaviittaukselle
tai ominaisuusviittaukselle. M??ritys tehd??n suluissa, kuten
seuraavassa esimerkiss?:
 |
 |
 |
 |
#set( $kadellinen = "apina" )
#set( $asiakas.Kayttaytyminen = $kadellinen )
|
 |
 |
 |
 |
M??rityksen vasemman puolen (left hand side, LHS) tulee olla
muuttuja- tai ominaisuusviittaus. Oikea puoli (right hand side,
RHS) voi olla jokin seuraavista tyypeist?:
- Muuttujaviittaus
- Tekstivakio
- Ominaisuusviittaus
- Metodiviittaus
- Numeerinen vakio
- ArrayList taulukko
Seuraavassa esimerkit kustakin mainitusta tyypist?:
 |
 |
 |
 |
#set( $apina = $bill ) ## muuttujaviittaus
#set( $apina.Ystava = "monica" ) ## tekstivakio
#set( $apina.Syytos = $valkoinentalo.vuoto ) ## ominaisuusviittaus
#set( $apina.Suunnitelma = $spindoctor.weave($web) ) ## metodiviittaus
#set( $apina.Numero = 123 ) ## numeerinen vakio
#set( $apina.Sano = ["Ei", $minun, "vikani"] ) ## taulukko
|
 |
 |
 |
 |
HUOMAA: Viimeisess? esimerkiss? [..] operaattorilla m??ritetyt
elementit ovat k?ytett?viss? ArrayList -luokan metodien
avulla. Voisit siis esimerkiksi viitata taulukon ensimm?iseen
elementtiin koodilla $apina.Sano.get(0).
Oikeanpuoleinen arvo (RHS) voi olla my?s yksinkertainen
matemaattinen operaatio:
 |
 |
 |
 |
#set( $arvo = $foo + 1 )
#set( $arvo = $bar - 1 )
#set( $arvo = $foo * $bar )
#set( $arvo = $foo / $bar )
|
 |
 |
 |
 |
Jos m??rityksen oikeanpuoleinen ominaisuus- tai metodiviittaus on
arvoa null, sit? ei anneta vasemman puolen
arvoksi. T?t? keinoa ei voida k?ytt?? olemassa olevan viittauksen
poistamiseen. T?m? saattaa olla h?m??v?? Velocityn uusille
k?ytt?jille. Esimerkiksi:
 |
 |
 |
 |
#set( $tulos = $kysely.kriteeri("nimi") )
Ensimm?isen kyselyn tulos on $tulos
#set( $tulos = $kysely.kriteeri("osoite") )
Toisen kyselyn tulos on $tulos
|
 |
 |
 |
 |
Jos $kysely.kriteeri("nimi") palauttaa merkkijonon
"pete", ja $kysely.kriteeri("osoite") palauttaa arvon
null, on esimerkin tuloste seuraava:
 |
 |
 |
 |
Ensimm?isen kyselyn tulos on pete
Toisen kyselyn tulos on pete
|
 |
 |
 |
 |
T?ll? on vaara h?m?t? aloittelijoita jotka muodostavat
#foreach silmukoita joissa yritet??n asettaa
#set ohjeella viittausta ominaisuus- tai
metodiviittauksella, ja sen j?lkeen testataan tuota viittausta
#if ohjeella. Esimerkiksi:
 |
 |
 |
 |
#set( $kriteerit = ["nimi", "osoite"] )
#foreach( $kriteeri in $kriteerit )
#set( $tulos = $kysely.kriteerit($kriteeri) )
#if( $tulos )
Kysely onnistui
#end
#end
|
 |
 |
 |
 |
Yll? olevassa esimerkiss? ei kannata luottaa $tulos
muuttujan vertaamiseen kyselyn onnistumisen selville
saamiseksi. Kun $tulos on asetettu #set
ohjeella (lisatty kontekstiin), sit? ei voida asettaa
null:iksi (poistaa kontekstista). #if ja
#foreach ohjeet k?sitell??n tarkemmin my?hemmin t?ss?
dokumentissa.
Yksi ratkaisu ongelmaan olisi asettaa $tulos etuk?teen
arvoon false (ep?tosi). T?m?n j?lkeen jos kutsu
$kysely.kriteeri() ep?onnistuu, voit tarkastaa arvon.
 |
 |
 |
 |
#set( $kriteerit = ["nimi", "osoite"] )
#foreach( $kriteeri in $kriteeri )
#set( $tulos = false )
#set( $tulos = $kysely.kriteerit($kriteeri) )
#if( $tulos )
Kysely onnistui
#end
#end
|
 |
 |
 |
 |
Muutamista muista Velocityn ohjeista poiketen, #set ohje
ei k?yt? #end lausetta.
Tekstivakiot
#set ohjetta k?ytett?ess? lainausmerkkeihin (" ")
suljettu teksti tulkitaan ja tulostetaan kuten seuraavasta
esimerkist? k?y ilmi:
 |
 |
 |
 |
#set( $hakemistoJuuri = "www" )
#set( $sivupohjaNimi = "index.vm" )
#set( $sivupohja = "$hakemistoJuuri/$sivupohjaNimi" )
$sivupohja
|
 |
 |
 |
 |
Tulosteeksi tulee
Jos teksti on suljettu hipsuihin (' '), sit? ei tulkita:
 |
 |
 |
 |
#set( $foo = "bar" )
$foo
#set( $blargh = '$foo' )
$blargh
|
 |
 |
 |
 |
Tulkitsemattoman tekstin tulostaminen hipsumerkkien sis?ll?
olevavasta tekstist? on oletuksena k?yt?ss?
Velocityss?. Oletusarvo voidaan muuttaa vaihtamalla
velocity.properties siten ett?
stringliterals.interpolate=false.
|
|
|
If-Else ehtolauseet
|
If / ElseIf / Else
#if ohjeen avulla voidaan teksti sis?llytt?? web
sivulle sill? ehdolla ett? if lauseen arvo on
tosi. Esimerkiksi:
 |
 |
 |
 |
#if( $foo )
<strong>Velocity!</strong>
#end
|
 |
 |
 |
 |
Muuttuja $foo testataan jotta n?hd??n onko se tosi,
joka tapahtuu kahdessa eri tapauksessa: (i) $foo on
boolean arvo (tosi/ep?tosi) jolla on tosi -arvo, tai (ii) arvo
on eri kuin null (eli muuttuja ei ole tyhj?). #if ja
#end lauseiden v?liin j??v? sis?lt? tulostetaan mik?li
testimuuttuja on tosi. Esimerkkitapauksessamme, jos muuttujalla
$foo on null arvo, tai jos se on boolean ep?tosi, on
testimuuttuja ep?tosi, eik? tulostetta tule lainkaan.
#if ja #end lauseiden v?liss? oleva teksti
tulee tulosteeksi mik?li ehto on tosi. T?ss? tapauksessa jos
$foo on tosi, tulosteeksi tulee:
"Velocity!". Toisaalta, mik?li $foo on ep?tosi, on my?s
ehtolause ep?tosi eik? tulostetta tule.
#elseif tai #else elementtej? voidaan k?ytt??
#if elementin kanssa. Huomaa, ett? Velocityn
sivumoottori lopettaa ensimm?isen tosiarvon saaneen
testimuuttujan kohdalla. Oletetaan seuraavassa esimerkiss? ett?
muuttujalla $foo on arvo 15 ja muuttujalla
$bar on arvo 6.
 |
 |
 |
 |
#if( $foo < 10 )
<strong>Mene pohjoiseen</strong>
#elseif( $foo == 10 )
<strong>Mene it??n</strong>
#elseif( $bar == 6 )
<strong>Mene etel??n</strong>
#else
<strong>Mene l?nteen</strong>
#end
|
 |
 |
 |
 |
T?ss? esimerkiss? $foo on suurempi kuin 10, joten
kaksi ensimm?ist? vertailua eiv?t ole tosia. Seuraavaksi muuttujaa
$bar verrataan lukuun 6, joka on tosi, joten tulosteeksi
tulee Mene etel??n.
Huomaa, ett? nykyisell??n Velocityn numeeriset vertailut on
rajoitettu Integer (kokonais-) lukuihin. Kaikki muut arvot
tulkitaan ep?tosiksi. Ainoa poikkeus t?h?n on vastaavuus
'==', jolloin Velocity vaatii ett? objektit vertailun kummallakin
puolella ovat samaa luokkaa.
Relaatio- ja
loogiset operaattorit
Velocity k?ytt?? vastaavuusoperaattoria muuttujien v?listen
suhteiden tulkitsemiseen. Seuraavassa on yksinkertainen esimerkki
vastaavuusoperaattorin k?yt?st?.
 |
 |
 |
 |
#set ($foo = "deoksiribonukleiinihappo")
#set ($bar = "ribonukleiinihappo")
#if ($foo == $bar)
Muuttujat eiv?t selv?stik??n ole samanlaiset. Joten...
#else
Vastaavuusvertaus on ep?tosi, ja t?m? teksti tulee tulosteeksi.
#end
|
 |
 |
 |
 |
Velocity tukee my?s loogisia AND ja OR
operaattoreita. Lis?tietoja l?yd?t dokumentista VTL Reference Guide. Alla on
esimerkkilause joka k?ytt?? loogista AND:i?.
 |
 |
 |
 |
## looginen AND
#if( $foo && $bar )
<strong> T?m? JA tuo</strong>
#end
|
 |
 |
 |
 |
If lause on tosi vain mik?li sek? $foo ett?
$bar ovat tosia. Jos $foo on ep?tosi, tulee
lauseesta ep?tosi eik? $bar muuttujaa tarvitse edes
testata. Jos $foo on tosi, testataan sen j?lkeen
muuttujan $bar arvo; jos my?s $bar on tosi,
silloin koko ilmaus on tosi ja T?m? JA tuo
tulee tulosteeksi. Jos $bar on ep?tosi, silloin koko
ilmaus on ep?tosi eik? tulostetta tule.
Looginen OR operaattori toimii samaan tapaan, paitsi ett? vain
toisen viittauksen pit?? olla tosi jotta koko ilmaus olisi
tosi. Katso seuraavaa esimerkki?.
 |
 |
 |
 |
## looginen OR
#if( $foo || $bar )
<strong>T?m? TAI tuo</strong>
#end
|
 |
 |
 |
 |
Jos $foo on tosi, ei $bar muuttujaa tarvitse
edes testata. Oli $bar sitten tosi tai ep?tosi, koko
lauseke on tosi, ja T?m? TAI tuo on
tulosteena. Toisaalta mik?li $foo on ep?tosi, on
muuttujan $bar arvo testattava. Jos t?ss? tapauksessa
my?s $bar on ep?tosi, koko ilmauksesta tulee ep?tosi
eik? tulostetta tule. Jos $bar on tosi, silloin koko
ilmauksesta tulee tosi, ja tulosteena on T?m? TAI
tuo.
Loogisella EI (NOT) operaattorilla on vain yksi argumentti :
 |
 |
 |
 |
## looginen NOT
#if( !$foo )
<strong>EI tuota</strong>
#end
|
 |
 |
 |
 |
Jos $foo on tosi, silloin !$foo on ep?tosi, eik?
tulostetta t?m?n vuoksi tule. Mik?li $foo on ep?tosi,
silloin !$foo on tosi ja EI tuota on
tulosteena. ?l? sekoita t?t? merkint?? hiljaiseen viittaukseen
$!foo joka tarkoittaa jotakin aivan muuta.
|
|
|
Stop
|
#stop elementin avulla sivupohjan suunnittelija voi
pys?ytt?? sivun tulkitsemisen. T?m? on hy?dyllist? sivupohjan
virheidenetsinn?n aikana.
|
|
|
Velocimakrot
|
#macro elementin avulla sivupohjan suunnittelija voi
m??ritt?? toistuvasti k?ytetyn VTL sivupohjan osan. Velocimakrot
ovat eritt?in k?ytt?kelpoisia sek? monimutkaisissa, ett?
yksinkertaisissa teht?viss?. Seuraava Velocimakro toimii
johdantona Velocimakroihin. Se on luotu kirjoitettavan tekstin
m??r?n v?hent?miseksi, sek? kirjoitusvirheiden m??r?n
minimoimiseksi.
 |
 |
 |
 |
#macro( d )
<tr><td></td></tr>
#end
|
 |
 |
 |
 |
Esimerkiss? m??riteltiin Velocimakro nimelt??n d, ja sit?
voidaan kutsua muiden VTL ohjeiden tapaan:
Kun t?t? sivupohjaa haetaan, Velocity korvaa ohjeen #d()
rivill? joka sis?lt?? yhden tyhj?n solun.
Velocimakro voi ottaa kuinka monta parametria tahansa -- tai ei
yht??n parametria, kuten ensimm?isess? esimerkiss?mme -- mutta kun
Velocimakroa kutsutaan, tulee kutsussa olla t?sm?lleen yht? monta
parametria kuin makroa m??ritelt?ess?. Useimmat Velocimakrot ovat
hieman monimutkaisempia kuin edellinen esimerkki. Seuraavassa on
Velocimakro joka ottaa kaksi argumenttia; v?rin ja listan.
 |
 |
 |
 |
#macro( taulurivit $vari $jokulista )
#foreach( $jotain in $jokulista )
<tr><td bgcolor=$vari>$jotain</td></tr>
#end
#end
|
 |
 |
 |
 |
T?ss? esimerkiss? m??riteltiin Velocimakro taulurivit
joka ottaa kaksi parametria. Ensimm?inen parametri on
$vari ja toinen $jokulista.
Velocimakroon voidaan kirjoittaa mit? tahansa koodia jota voidaan
k?ytt?? muuallakin VTL sivupohjassa. taulurivit
Velocimakro on foreach lause. taulurivit
Velocimakrossa on kaksi #end lausetta; ensimm?inen kuuluu
#foreach lauseelle, j?lkimm?inen p??tt?? Velocimakron
m??rityksen.
 |
 |
 |
 |
#set( $suuretjarvet = ["Superior","Michigan","Huron","Erie","Ontario"] )
#set( $vari = "blue" )
<table>
#taulurivit( $vari $suuretjarvet )
</table>
|
 |
 |
 |
 |
Huomaa ett? $suuretjarvet on makron parametrin
$jokulista arvona. Kun Velocimakroa #taulurivit
t?ss? tapauksessa kutsutaan, on tuloksena seuraavaa:
 |
 |
 |
 |
<table>
<tr><td bgcolor="blue">Superior</td></tr>
<tr><td bgcolor="blue">Michigan</td></tr>
<tr><td bgcolor="blue">Huron</td></tr>
<tr><td bgcolor="blue">Erie</td></tr>
<tr><td bgcolor="blue">Ontario</td></tr>
</table>
|
 |
 |
 |
 |
Velocimakroja voidaan m??ritt?? inline, eli Velocity
sivupohjassa itsess??n, jolloin ko. makro ei ole k?ytett?viss?
muissa sivupohjissa. Velocimakron m??ritt?minen siten ett? se on
kaikkien sivupohjien k?yt?ss? on hy?dyllist?; samaa makroa ei
tarvitse m??ritt?? erikseen jokaisessa sivupohjassa jossa sit?
tarvitaan, jolloin ty?m??r? ja virheiden mahdollisuus
v?henee. Lis?ksi makroon tehty muutos vaikuttaa heti kaikkiin
sivupohjiin joissa se on k?yt?ss?.
Oletetaan ett? Velocityss? on m??riteltyn? Velocimakro
#tablerows($vari $lista). T?t? makroa voitaisiin k?ytt??
miss? tahansa sivupohjassa. Sit? voitaisiin k?ytt?? useaan kertaan
ja moneen eri k?ytt?tarkoitukseen. Sieniasioita k?sittelev?ss?
sivupohjassa sieni.vm, #tablerows
Velocimakroa voitaisiin k?ytt?? listaamaan tyypillisen sienen
osat:
 |
 |
 |
 |
#set( $osat = ["volva","stipe","annulus","gills","pileus"] )
#set( $cellbgcol = "#CC00FF" )
<table>
#tablerows( $cellbgcol $osat )
</table>
|
 |
 |
 |
 |
Kun Velocity luo sivun sivupohjasta sieni.vm, se
etsii Velocimakron #tablerows sivupohjakirjastosta (joka
on m??ritelty velocity.properties tiedostossa) ja
tuottaa seuraavan tulosteen:
 |
 |
 |
 |
<table>
<tr><td bgcolor="#CC00FF">volva</td></tr>
<tr><td bgcolor="#CC00FF">stipe</td></tr>
<tr><td bgcolor="#CC00FF">annulus</td></tr>
<tr><td bgcolor="#CC00FF">gills</td></tr>
<tr><td bgcolor="#CC00FF">pileus</td></tr>
</table>
|
 |
 |
 |
 |
Velocimakron argumentit
Velocimakrot voivat ottaa argumenteiksi mit? tahansa seuraavista
VTL elementeist?:
-
Viittaus : mit? tahansa '$' merkill? alkavaa
-
Tekstivakio : esimerkiksi "$foo" tai 'hei'
-
Numerovakio : 1, 2 jne
-
Numerov?li : [ 1..2] tai [$foo .. $bar]
-
ObjectArray : [ "a", "b", "c"]
-
boolean arvo true (tosi)
-
boolean arvo false (ep?tosi)
Kun siirr?t viittauksia argumentteina Velocimakroille, huomaa,
ett? viittaukset siirret??n 'nimen mukaan' ('by name'). T?m?
tarkoittaa sit?, ett? viittausten arvo 'haetaan' Velocimakrossa
itsess??n. T?m?n ominaisuuden avulla voit siirt?? viittauksia
jotka ovat metodikutsuja, ja n?in ko. metodeja kutsutaan
Velocimakrossa. Esimerkiksi kun Velocimakroa kutsutaan
seuraavasti:
 |
 |
 |
 |
#macro( kutsu $a )
$a $a $a
#end
#kutsu( $foo.bar() )
|
 |
 |
 |
 |
tuloksena viittauksen $foo metodia bar() kutsutaan 3 kertaa.
Ensi katsomalta t?m? ominaisuus saattaa vaikuttaa yll?tt?v?lt?,
mutta kun otat huomioon Velocimakrojen alkuper?isen
tarkoituksen -- usein k?ytettyjen VTL komentojen leikkaa-liimaa
kopioimisen v?hent?minen -- ominaisuus on perusteltu. Sen
avulla voit esimerkiksi siirt?? Velocimakroon argumenttina
tilansa muistavia (stateful) objekteja, kuten objektin joka
generoi v?rej? per?kk?isess? j?rjestyksess? taulukon rivien
v?rien m??ritt?miseksi.
Jos sinun tarvitsee kiert?? t?m? ominaisuus, voit hakea arvon
metodista uudeksi viittaukseksi, ja antaa sen argumentiksi:
 |
 |
 |
 |
#set( $uusiarvo = $foo.bar() )
#kutsu( $uusiarvo )
|
 |
 |
 |
 |
Velocimakro ominaisuudet
velocity.properties tiedostossa on useita rivej?
joiden avulla Velocimakrojen toimintaa voidaan muuttaa
joustavasti. Huomaa ett? n?m? arvot on dokumentoitu my?s Kehitt?j?n
oppaassa.
velocimacro.library - Pilkulla eroteltu lista
Velocimakro sivupohjakirjastoja. Oletuksena Velocity etsii yht?
kirjastoa: VM_global_lib.vm. Velocimakro kirjastoja
etsit??n m??ritellyst? sivupohjahakemistosta.
velocimacro.permissions.allow.inline - T?m?
ominaisuus p??tt?? voidaanko Velocimakroja m??ritt?? tavallisissa
sivupohjissa. Ominaisuus voi saada arvon true (tosi) tai false
(ep?tosi). Oletuksena on tosi, jolloin sivusuunnittelijat voivat
m??ritt?? Velocimakroja suoraan omissa sivupohjissaan.
velocimacro.permissions.allow.inline.to.replace.global
- T?m?n ominaisuuden avulla voidaan m??ritt?? voivatko
sivupohjassa m??ritellyt Velocimakrot korvata yleisesti
m??ritellyt, velocimacro.library ominaisuuden kautta
ladatut Velocimakrot. Ominaisuus voi saada arvon true tai
false. Oletuksena false, ep?tosi, jolloin
sivupohjassa m??ritellyt Velocimakrot eiv?t voi korvata
sivupohjakirjastoista ladattuja makroja.
velocimacro.permissions.allow.inline.local.scope -
Mahdolliset arvot ovat true tai false, oletuksena false. T?m?
ominaisuus p??tt?? ovatko sivupohjassa m??ritetyt Velocimakrot
'n?kyvi?' ainoastaan siin? sivupohjassa jossa ne on
m??ritelty. Toisin sanoen kun t?m? ominaisuus on asetettu arvoon
true (tosi), sivupohja voi m??ritt?? inline Velocimakroja jotka
ovat k?ytett?viss? vain sivupohjasta joka ne m??ritti. T?m?n
ominaisuuden avulla voidaan aikaansaada erikoisia vaikutuksia; jos
yleisesti m??ritelty Velocimakro kutsuu toista yleisesti
m??ritelty? makroa, t?m?n ominaisuuden avulla sivupohja voi
m??ritt?? oman toteutuksensa j?lkimm?isest? makrosta, jota
ensimm?inen makro kutsuu. Sivupohjan paikallista makroa k?ytet??n
vain kun ensimm?ist? makroa kutsutaan ko. sivupohjasta. Uusi makro
ei vaikuta muihin sivupohjiin.
velocimacro.context.localscope - Mahdolliset arvot
ovat true tai false, oletuksena false. Kun ominaisuuden arvoksi on
asetettu tosi, Velocimakroissa #set() ohjeella tehdyt muutokset
ovat 'paikallisia' eiv?tk? vaikuta pysyv?sti muuttujien sis?lt??n.
velocimacro.library.autoreload - T?m? ominaisuus
ohjaa Velocimakrokirjaston automaattista uudelleenlatausta. Kun
ominaisuus on asetettu arvoon true kutsutun
Velocimakron koodi tutkitaan mahdollisten muutosten varalta, ja se
ladataan uudelleen mik?li tarpeellista. N?in voit muuttaa ja
testata Velocimakrokirjastoa ilman ett? sinun tarvitsee k?ynnist??
uudelleen sovellustasi tai sovellusalustaa, aivan kuten voit tehd?
normaalien sivupohjienkin kanssa. T?m? asetus toimii vain kun
resurssilataajien v?limuisti on pois p??lt? (off,
esim. file.resource.loader.cache = false). T?m?
ominaisuus on tarkoitettu k?ytett?v?ksi vain sovelluksen
kehitysvaiheessa, ei tuotantok?ytt??n.
Velocimakro Trivia
Nykyisell??n Velocimakrot tulee olla m??riteltyin? ennen kuin
niit? k?ytet??n sivupohjissa. T?m? tarkoittaa sit? ett? #macro()
m??ritystesi tulee sijaita ennen rivej? joissa k?yt?t Velocimakroja.
T?m? on t?rke?? muistaa jos yrit?t k?ytt?? ohjetta #parse()
sivupohjaan jossa on inline #macro() ohjeita. Koska #parse()
suoritetaan ajon aikana, ja parseri p??tt?? ajon aikana onko
sivupohjassa oleva Velocimakrolta n?ytt?v? elementti Velocimakro,
ei Velocimakrojen #parse():aminen toimi niin kuin
olettaisi. Ongelma voidaan v?ltt?? helposti k?ytt?m?ll?
velocimacro.library toimintoa jonka avulla Velocity
lataa Velocimakrosi k?ynnistyksen yhteydess?.
|
|
|
VTL ohjeiden suojaaminen
|
VTL ohjeet voidaan suojata kenoviivalla ("\") samalla tavalla kuin
VTL viittauksetkin.
 |
 |
 |
 |
## #include( "a.txt" ) tulostuu <tiedoston a.txt sis?lt?>
#include( "a.txt" )
## \#include( "a.txt" ) tulostuu \#include( "a.txt" )
\#include( "a.txt" )
## \\#include ( "a.txt" ) tulostuu \<tiedoston a.txt sis?lt?>
\\#include ( "a.txt" )
|
 |
 |
 |
 |
Erityst? tarkkaavaisuutta tarvitaan tapauksissa joissa suojataan VTL
ohjeita jotka sis?lt?v?t useita skriptielementtej? samassa ohjeessa
(kuten if-else-end lause). Seuraavassa on tyypillinen VTL if-lause:
 |
 |
 |
 |
#if( $jazz )
Vyacheslav Ganelin
#end
|
 |
 |
 |
 |
Jos $jazz on tosi (true), tuloste on
Jos $jazz on ep?tosi (false), tulostetta ei
tule. Skriptielementtien suojaaminen muuttaa tulostetta. Katso
seuraavaa esimerkki?:
 |
 |
 |
 |
\#if( $jazz )
Vyacheslav Ganelin
\#end
|
 |
 |
 |
 |
Riippumatta siit? onko $jazz tosi vai ep?tosi, tuloste on
aina:
 |
 |
 |
 |
#if($ jazz )
Vyacheslav Ganelin
#end
|
 |
 |
 |
 |
Itse asiassa koska kaikki skriptielementit on suojattu,
$jazz muuttujan totuusarvoa ei edes tutkita. Oletetaan ett?
kenoviiva edelt?? skriptielementtej? jotka on suojattu:
 |
 |
 |
 |
\\#if( $jazz )
Vyacheslav Ganelin
\\#end
|
 |
 |
 |
 |
Mik?li $jazz on t?ss? tapauksessa tosi, tuloste on:
T?m?n ymm?rt?miseksi huomaa, ett? #if( arg ) rivill?
olevaa rivinvaihtoa (return) ei kopioida tulosteeseen. T?m?n vuoksi
#if() lauseen runko ('Vyacheslav Ganelin') on '\\'
merkinn?st? saadun ensimm?isen '\' merkin kanssa samalla
rivill?. J?lkimm?inen '\' merkki on toisella rivill? kuin teksti,
koska tekstin lopussa on rivinvaihto ja j?lkimm?inen '\\'
merkinn?st? saatu '\' merkki on ennen #end ohjetta,
joten merkki kuuluu edelleen #if() lauseen runkoon.
Jos $jazz on ep?tosi, ei tulostetta tule. Huomaa ett?
ongelmia tulee mik?li skriptielementtej? ei ole suojattu oikein.
 |
 |
 |
 |
\\\#if( $jazz )
Vyacheslave Ganelin
\\#end
|
 |
 |
 |
 |
Esimerkiss? #if on suojattu, mutta #end elementti
on edelleen k?yt?ss?. Liian monta lopetuselementti? sivupohjassa
aiheuttaa virheen sivua luotaessa.
|
|
|
Muita ominaisuuksia ja sekalaista
|
|
Yleist? Velocimakroista
|
T?m? osio on Velocimakroaiheinen mini-FAQ. Osio muuttuu ajan my?t?,
joten uutta tietoa hakevien kannattanee palata sivulle aika ajoin.
Huom! : T?ss? osiossa 'Velocimakro':ihin viitataan usein lyhenteell?
'VM'.
Voinko k?ytt?? ohjetta tai toista VM:a argumenttina
VM:oon?
Esimerkki : #center( #bold("hello") )
Et. Ohje ei ole sallittu argumentti ohjeelle, ja VM on
k?yt?nn?llisesti katsoen ohje.
Kuitenkin..., voit kiert?? rajoituksen. Yksinkertainen ratkaisu
on k?ytt?? hyv?ksi sit? ett? lainausmerkeiss? (") oleva teksti
tulkitaan. T?m? ansiosta voit tehd? seuraavasti:
 |
 |
 |
 |
#set($stuff = "#bold('hello')" )
#center( $stuff )
|
 |
 |
 |
 |
Voit my?s s??st?? rivin...
 |
 |
 |
 |
#center( "#bold( 'hello' )" )
|
 |
 |
 |
 |
Huomaa ett? j?lkimm?isess? esimerkiss? parametri k?sitell??n VM:n
sis?ll?, ei kutsun tasolla. Toisin sanoen VM:lle annettu
parametri siirret??n kokonaisuudessaan ja k?sitell??n VM:ssa johon se
siirrettiin. T?m?n ansiosta voit tehd? esimerkiksi seuraavaa:
 |
 |
 |
 |
#macro( inner $foo )
inner : $foo
#end
#macro( outer $foo )
#set($bar = "outerlala")
outer : $foo
#end
#set($bar = 'calltimelala')
#outer( "#inner($bar)" )
|
 |
 |
 |
 |
Tulosteeksi tulee
 |
 |
 |
 |
Outer : inner : outerlala
|
 |
 |
 |
 |
koska parametrin "#inner($bar)" tulkitseminen tapahtuu lauseen
#outer() sis?ll?, k?ytet??n muuttujan $bar arvoa joka asetettiin
#outer VM:ssa.
T?m? on tarkoituksellinen ja tarkkaan vaalittu ominaisuus - parametrit
siirret??n 'nimen mukaan' ('by name') VM:oon, jotta voit siirt??
VM:oon tilansa muistavia (stateful) viittauksia kuten
 |
 |
 |
 |
#macro( foo $vari )
<tr bgcolor=$vari><td>Hei</td></tr>
<tr bgcolor=$vari><td>Siell?</td></tr>
#end
#foo( $bar.rivinVari() )
|
 |
 |
 |
 |
jossa rivinVari() metodia kutsutaan toistuvasti, ei vain kerran. Sen
v?ltt?miseksi kutsu metodia VM:n ulkopuolelta ja siirr? arvo VM:oon.
 |
 |
 |
 |
#set($vari = $bar.rivinVari())
#foo( $vari )
|
 |
 |
 |
 |
Voinko rekister?id? Velocimakroja #parse() :n kautta?
Nykyisell??n Velocimakrot tulee olla m??riteltyin? ennen
ensimm?ist? k?ytt??. T?m? tarkoittaa sit? ett? #macro()
m??ritystesi tulisi tulla ennen kuin k?yt?t Velocimakroja.
T?m? on t?rke?? muistaa jos yrit?t k?ytt?? ohjetta #parse()
sivupohjaan jossa on inline #macro() ohjeita. Koska #parse()
suoritetaan ajon aikana, ja parseri p??tt?? ajon aikana onko
sivupohjassa oleva Velocimakrolta n?ytt?v? elementti Velocimakro,
ei Velocimakrojen #parse():aminen toimi niin kuin
olettaisi. Ongelma voidaan v?ltt?? helposti k?ytt?m?ll?
velocimacro.library toimintoa jonka avulla Velocity
lataa Velocimakrosi k?ynnistyksen yhteydess?.
Mit? tarkoittaa Velocimakrojen automaattinen
uudelleenlataus?
On olemassa asetus joka on tarkoitettu k?ytett?v?ksi j?rjestelm?n
kehityksen aikana, ei k?yt?ss? olevassa j?rjestelm?ss? :
velocimacro.library.autoreload
joka on oletuksena pois k?yt?st? (false). Kun ominaisuus on
asetettu k?ytt??n (true) yhdess? asetuksen
<type>.resource.loader.cache = false
kanssa (jossa <type> on resurssilataajan nimi jota k?yt?t,
kuten 'file'), silloin Velocity lataa automaattisesti
Velocitymakroihin tekem?si muutokset silloin kun teet niit?, joten
sinun ei tarvitse k?ynnist?? uudelleen sovellusalustaa (tai
ohjelmaa) tai turvautua johonkin muuhun kikkaan saadaksesi
muuttuneet Velocitymakrosi k?ytt??n.
Yksinkertainen konfiguraatio saattaisi n?ytt?? seuraavalta:
 |
 |
 |
 |
file.resource.loader.path = templates
file.resource.loader.cache = false
velocimacro.library.autoreload = true
|
 |
 |
 |
 |
?l? k?yt? n?it? asetuksia tuotantok?yt?ss?.
|
|
|
|
|