© Copyright Azzurri Ltd. 2003-2005. Kaikki oikeudet pidätetään.
 Eclipse Corner -artikkeli

JET-opetusohjelman osa 1 (Johdanto JET-ympäristöön)

Yhteenveto

Lähdekoodin luonti voi säästää aikaa projekteissa ja vähentää turhaan toistuvan ohjelmoinnin määrää. Lähdekoodin luonti voi olla tehokasta, mutta koodin kirjoittava ohjelma voi äkkiä muuttua hyvin monimutkaiseksi ja vaikeaksi ymmärtää. Monimutkaisuutta voidaan vähentää ja luettavuutta parantaa esimerkiksi käyttämällä mallipohjia.

Eclipse-mallinnuskehyksen (EMF) projekti sisältää lähdekoodin luontiin kaksi hyvin tehokasta työkalua: JET (Java Emitter Templates) ja JMerge (Java Merge). JET-työkalun avulla voit käyttää JSP:n kaltaista syntaksia (todellisuudessa JSP-syntaksin alijoukkoa), joka helpottaa mallipohjien kirjoittamista. Mallipohjat ilmaisevat koodin, jonka haluat luoda. JET on yleinen mallipohjaohjelma, jota voidaan käyttää SQL-, XML- ja Java-lähdekoodin luonnissa sekä muiden tulosteiden luonnissa mallipohjista. Se sijaitsee org.eclipse.emf.codegen-lisäosassa osana ajonaikaista EMF-latausta.

Tässä artikkelissa opit luomaan JET-mallipohjia ja käyttämään JET-ominaispiirteitä ja JET-koontitoimintoa mallipohjien automaattisessa muuntamisessa Java-luokiksi. Opit lisäksi käyttämään näitä luokkia lähdekoodin luonnissa. Tässä artikkelissa viitataan lisäksi lyhyesti JET-syntaksiin.

Lisääjä: Remko Popma, Azzurri Ltd., remko.popma at azzurri dot jp, 30. heinäkuuta 2003. Käyttöön saatu lupa. Viimeksi päivitetty: 3. tammikuuta 2007.


Sisältö

Aloitusohje
JET-malli
Direktiivit
JET-komentosarjaelementit
Resurssit

Aloitusohje

Ennen ensimmäisen mallipohjan luomista tarvitaan EMF-lisäosa. Jos et ole vielä asentanut sitä, asenna se ennen opetusohjelman jatkamista.

Näyttökuvat perustuvat Eclipse SDK:n versioon 3.1.0 RC2 ja EMF:n versioon 2.1.0 I200506160200.Java 5.0 -rakenteiden, kuten yleistyyppien, käyttöön vaaditaan kuitenkin vähintään Eclipse 3.3M4 ja EMF 2.3.0M4.

JET-mallipohja on tekstitiedosto, jonka nimen lopussa on merkintä "jet". Noudatan EMF-kehyksen tapaa liittää merkintä "jet" luodun kooditiedoston tunnisteeseen. Siten merkintä .javajet ilmaisee, että mallipohja luo .java-tiedoston, merkintä .xmljet ilmaisee, että mallipohja luo XML-tiedoston, ja esimerkiksi SQL-tiedoston luovan mallipohjan tiedoston tunnisteena on .sqljet. Tämä jatkuu samalla tavalla muissa nimissä.

JET-ominaispiirre ja JET-koontitoiminto

Noudatetaan perinnettä ja aloitetaan mallipohjalla, joka luo viestin "Hello, world". Luomme ensimmäisen mallipohjan seuraavassa nelivaiheisessa prosessissa:

  1. Luo uusi Java-projekti ja anna sille "src"-lähdekansio
  2. Lisää JET-ominaispiirre projektiin. Tämä luo kansion nimeltä "templates" projektin juurihakemistoon.
  3. Muuta projektin JET-ominaisuudet sen varmistamiseksi, että mallipohjat muunnetaan projektin "src"-lähdekansioksi.
  4. Luo uusi tiedosto nimeltä "helloworld.txtjet" ja tallenna se templates-kansioon.

Vaihe 1. Luo projekti

Valitse Työympäristö-valikosta Tiedosto > Uusi > Projekti ja tuo näkyviin ohjattu uuden projektin luontitoiminto. Luo uusi Java-projekti ja lisää siihen lähdekansio nimeltä src.

Uusi Java-projekti, jolla on src-kansio

Vaihe 2. Muunna projekti JET-projektiksi

Kun olet luonut projektin, napsauta sitä hiiren kakkospainikkeella pakettien selausnäkymässä tai hierarkianäkymässä ja valitse Uusi > Muu... > Java-lähettimen mallipohjat > Muunna projektit JET-projekteiksi.

Uusi Java-projekti, jolla on src-kansio

Napsauta Seuraava-painiketta, valitse luomasi projekti ja napsauta Valmis-painiketta.

JET-ominaispiirteen lisäys Java-projektiin

Ohjattu toiminto lisää JET-ominaispiirteen projektiin luomalla templates-kansion projektin juurihakemistoon alla olevassa kuvassa esitetyllä tavalla. Lisäksi JET-koontitoiminto lisätään projektiin. Se muuntaa automaattisesti kaikki templates-kansion tiedostot, joiden nimi päättyy merkintään "jet", Java-luokaksi.

Templates-kansio luotu

Vaihe 3. Muuta JET-asetuksia

Ennen ensimmäisen mallipohjan luomista tarkastetaan, että projektin src-lähdekansio on muunnettujen mallipohjien kohdekansio. Napsauta hiiren kakkospainikkeella projektia ja valitse ponnahdusvalikosta "Ominaisuudet". Valitse Projektin ominaisuudet -valintaikkunan vasemmasta valikosta JET-asetukset ja lisää "src" (lähdekansion nimi) "Lähdesäilö"-tekstikenttään. Alla olevassa kuvassa on esitetty JET-asetusten ominaisuussivu Projektin ominaisuudet -valintaikkunassa.

Lisää lähdesäilön kansio

Vihje: Huomautus: voit määrittää useita kansioita Mallipohjasäilöt-kentässä erottamalla ne tyhjämerkillä tai puolipisteellä. Jos kuitenkin mallipohjilla eri kansioissa on sama tiedoston nimi, JET-koontitoiminto muuntaa automaattisesti vain ensimmäisessä kansiossa olevan mallipohjan. Jos haluat muuntaa kaikki mallipohjat, varmista, että niiden tiedoston nimet ovat erilaiset.

Vaihe 4. Luo JET-mallipohjatiedosto

JET-koontitoiminto muuntaa nyt kaikki mallipohjat Java-lähdetiedostoiksi projektin src-kansiossa.

Poista ensin automaattiset koonnit käytöstä ongelmien ehkäisemiseksi. Poista Projekti-valikosta "Kokoa automaattisesti" -asetuksen valinta.

Projekti-valikko, jossa näkyy Kokoa kaikki- ja Kokoa automaattisesti -vaihtoehdot

Nyt voimme luoda ensimmäisen mallipohjan. Valitse Työympäristö-valikosta Tiedosto > Uusi > Tiedosto ja tuo näkyviin ohjattu uuden tiedoston luontitoiminto. Valitse pääkansioksi templates-hakemisto ja kutsu tiedosto helloworld.txtjet.

Luo tyhjä helloworld.txtjet-tiedosto

Kun "Kokoa automaattisesti" -asetus on poissa käytöstä, saat not seuraavan virhesanoman, kun painat Valmis-painiketta: "'jet'-ohjauskoodi puuttuu kohteesta 'helloworld.txtjet' rivillä 1 sarakkeessa 1" alla olevassa kuvassa esitetyllä tavalla.

Virhe Jet-koontitoiminnon ajamisessa tyhjällä .txtjet-tiedostolla

Kun automaattinen koonti on käytössä, saat edellä esitetyn virhesanoman. Onneksi tämä ei tarkoita sitä, että ongelma olisi todellinen. JET-koontitoiminto yritti muuntaa luodun mallipohjan heti sen luonnin jälkeen ja havaitsi, että se on vielä tyhjä. Sulje virheestä kertova valintaikkuna painamalla OK-painiketta. Avaa helloworld.txtjet-tiedosto, jos se ei ole avattuna, ja kirjoita tai leikkaa ja liitä seuraava sisältö muokkausohjelmassa.

 <%@ jet package="hello" class="HelloWorldTemplate" %>

 Hello, world!

Kun tallennat mallipohjatiedoston, JET-koontitoiminto muuntaa sen automaattisesti, jos Kokoa automaattisesti -asetus on valittuna. Jos se ei ole valittuna, valitse "Kokoa projekti" Projekti-valikosta.

Koska määritimme paketin hello ja luokan HelloWorldTemplate mallipohjan ensimmäisellä rivillä, koontitoiminto luo hello-paketin src-kansiossa ja tallentaa Java-tiedoston HelloWorldTemplate.java tässä paketissa alla olevassa kuvassa esitetyllä tavalla.

Paketti hello sisältää nyt luokkatiedoston HelloWorldTemplate.java

Tämä Java-luokka on tulos mallipohjan muuntamisesta ja sitä kutsutaan mallipohjan toteutusluokaksi. Luokalla on metodi nimeltä Luo. Tämä metodi luo koodin, jonka mallipohja osoittaa.

Kokeile sitä!Voimme luoda ilmentymän HelloWorldTemplate-mallipohjan toteutusluokasta ja kutsua sen Luo-metodin seuraavasti:

Toteuta edellä esitetty luomalla uusi luokka nimeltä HelloWorldImpl. Napsauta hiiren kakkospainikkeella hello-pakettia pakettien selausnäkymässä tai hierarkianäkymässä ja valitse Uusi > Luokka.

Luo uusi luokka

Anna luokan nimeksi HelloWorldImpl ja varmista, että julkisen staattisen void-määrityksen main(String[] args)-tukirakenne on valittuna.

Luo uusi luokka HelloWorldImpl päämetodin tukirakenteella

Kopioi seuraava koodi main()-metodiin:

 HelloWorldTemplate helloworld = new HelloWorldTemplate();
 String result = helloworld.generate(null);
 System.out.println(result);

Luokka HelloWorldImpl päämetodiesimerkillä

Aja se valitsemalla Aja-työkalurivin avattavasta luettelosta Aja muodossa/Java-sovellus. Sanojen "Hello, world!" pitäisi nyt näkyä tulostettuina konsolissa.

Argumenttien välitys mallipohjaan

Olemme juuri luoneet ensimmäisen mallipohjan ja luoneet koodia sen kanssa. Tulos ei ehkä ole kovin vaikuttava, mutta olemme nyt valmiit tutkimaan, mitä JET voi tehdä puolestasi. Seuraava vaihe on välittää argumentti mallipohjaan.

Koeta sitä!Lisää uusi JET-mallipohjatiedosto tai muuta aiemmin luotua lisäämällä seuraava sisältö:


 <%@ jet package="hello" class="GreetingTemplate" %>
 Hello, <%=argument%>!

JET-koontitoiminto muuntaa tämän mallipohjan GreetingTemplate-luokaksi hello-paketissa. Luomme uudelleen ilmentymän tästä mallipohjaluokasta (tai muutamme aiemmin luotua HelloWorldImpl-luokkaa). Tällä kertaa välitämme merkkijonoargumentin generate-metodiin:

 GreetingTemplate sayHello = new GreetingTemplate();
 String result = sayHello.generate("Tutorial Reader");
 System.out.println(result);

Yllä oleva koodi tulostaa sanat "Hello, Tutorial Reader!" konsoliin.

Pakettien tuonti

Mallipohjaan välittämäsi argumentti voi olla mikä tahansa objekti. Edellisessä esimerkissä välitimme merkkijonon argumenttina luontimetodiin, mutta sovelluksessa haluat todennäköisesti välittää oman malliobjektisi. Jos argumentti ei ole java.lang-paketissa tai jos mallipohja käyttää luokkia, joita ei ole java.lang-paketissa, sinun on tuotava nämä luokat mallipohjan jet-ohjauskoodissa. Ohjauskoodi jet, jonka tunnisteena on 1, tuo määritteen, joka näyttää tältä:

 <%@ jet package="hello" Tag 1imports="java.util.*" class="ImportDemoTemplate" %>

Tämän artikkelin JET-syntaksin viittausta käsittelevässä osassa on tarkempia tietoja jet-ohjauskoodista ja sen määritteistä.

Luomme seuraavassa esimerkissä mallipohjan, joka luo XML-koodia. Noudatamme EMF-kehyksen tapaa liittää merkintä "jet" kaikkiin tiedostoihin, olipa luodun kooditiedoston tunniste mikä tahansa. Tallennamme siten mallipohjatiedostoon nimeltä importdemo.xmljet. Huomaa, että välitämme mallipohjaan java.util.List-objektin, joka sisältää tietoja, joita käytetään XML:n luonnissa.

   <%@ jet package="hello" Tag 1imports="java.util.*" class="XMLDemoTemplate" %>

Tag 2<% List<?> elementList = (List<?>) argument; %>
   <?xml version="1.0" encoding="UTF-8"?>
   <demo>
   <% for (Iterator<?> i = elementList.iterator(); i.hasNext(); ) { %>
     <element><%=i.next().toString()%></element>
   <% } %>
   </demo>

Alla oleva koodi näyttää, miten mallipohjan ilmentymä kutsutaan. Luomme tunniste 2 -luettelon ja tunniste 3 -kohteen, jonka välitämme Luo-metodiin mallipohjan toteutusluokassa:

package hello;

import java.util.ArrayList;

public class XMLDemoImpl {
  public static void main(String[] args) {
    Tag 2List<String> data = new ArrayList<String>();
    data.add("first");
    data.add("second");
    data.add("third");

    XMLDemoTemplate generateXml = new XMLDemoTemplate();
    String result = generateXml.generate(Tag 3data);
    System.out.println(result);
  }
}

Tämä tulostaa seuraavan XML-tuloksen konsoliin:

 <?xml version="1.0" encoding="UTF-8"?>
 <demo>
   <element>first</element>
   <element>second</element>
   <element>third</element>
 </demo>

Tämä on hyvin yksinkertainen esimerkki, joka luo erittäin yksinkertaisen XML:n. Voit tietysti käyttää JET-työkalua monimutkaisen XML:n luontiin käyttämällä määritteitä ja nimitiloja. Kun teet näin, saatat pitää helpompana luoda erikoisluokka, joka on parempi XML-asiakirjan malli kuin java.util.ArrayList. Kun JET-mallipohjan monimutkaisuus lisääntyy, sitä enemmän logiikkaa haluat yleisesti välittää malliobjektiin, jonka siirrät mallipohjaan. Näin mallipohjat säilyvät luettavina. Tutkimme tätä tarkemmin tämän opetusohjelman osassa 2.

Tunnisteiden muutos

JET-ohjelmassa on kätevä ominaisuus, jolla voit muuttaa tunnisteita, joilla merkitään komentosarjasovelmat mallipohjatiedostossa. Tämä on hyvin kätevää silloin, kun luotavan koodin syntaksi muistuttaa läheisesti oletusarvon mukaista JET-syntaksia. Näin voi olla esimerkiksi silloin, kun käytät JET-ohjelmaa JSP-sivujen luonnissa.

Seuraavassa esimerkissä käytämme JET-ohjelmaa yksinkertaisen JSP-sivun luonnissa. Muutamme JET-tunnisteet, jotta voimme käyttää merkkisarjaa "<$" mallipohjan tunnisteen aloituksessa ja merkkisarjaa "$>" mallipohjan tunnisteen lopetuksessa. Mallipohja sisältää vielä merkkijonot "<%" ja "%>", mutta JET-toiminto ei näe niitä enää erikoisina ja ne kirjoitetaan tulokseen muiden merkkisarjojen tavoin.

Koeta sitä!Voit muuttaa tunnisteen merkinnät lisäämällä määritteen tunniste 1startTag ja määritteen tunniste 2endTag mallipohjan ensimmäisellä rivillä olevaan JET-ohjauskoodiin. Alla on tästä esimerkki.

 <%@ jet package="tags.demo" class="JspTemplate" Tag 1startTag="<$" Tag 2endTag="$>" %>

 <$ String paramName = (String) argument; /* This is an executed scriptlet */ $>
 <$ if (paramName != null) { $>
 Tag 3  <%= request.getParameter("<$=paramName$>") %> <!-- this is generated JSP -->

 <$ } $>

Kutsumme jälleen tämän toteutusluokan käyttämällä merkkijonoargumenttia alla olevan näköisesti:

 System.out.println(new tags.demo.JspTemplate().generate("button"));
Konsoliin tulee näkyviin seuraava tuloste. Huomaa, että tuloste sisältää ehjän JSP-tunnisteen: merkkijonoja "<%" ja "%>" ei tulkita JET-komentosarjasovelmiksi, vaan ne yksinkertaisesti lisätään luodussa koodissa.
 Tag 3  <%= request.getParameter("button") %> <!-- this is generated JSP -->

Konepellin alla

Edellisessä osassa tarkastelimme JET-mallipohjien luomista, JET-ominaispiirteen määritystä mallipohjien automaattista Java-toteutusluokiksi muuntamista varten ja Java-toteutusluokkien käyttöä koodin luonnissa.

Tässä osassa tarkastelemme lähemmin Java-toteutusluokkia, jotka ovat tulosta mallipohjien muuntamisesta. Tarkastelemme sitä, miksi voimme käyttää implisiittisten objektien argumentteja ja stringBuffer-luokkia mallipohjassa. Lisäksi tarkastelemme muunnettujen toteutusluokkien mukautusta toimittamalla mukautettu "runko".

Muunnetut mallipohjat

JET-mallipohja on muunnettu Java-toteutusluokaksi. Java-toteutusluokassa on joitakin objekteja, joihin voidaan viitata suoraan JET-mallipohjassa. Seuraava esimerkki havainnollistaa sen, miten implisiittisen objektin argumenttia ja stringBuffer-luokkaa voidaan käyttää mallipohjassa.

 <%@ jet package="hello" class="TranslationDemoTemplate" %>

Tag 1 Hello, <%=argument%>!
Tag 2 <% stringBuffer.append("Hello again!"); %>

Edellä esitetty mallipohja muunnetaan Java-toteutusluokaksi alla esitetyn näköisesti:

 package hello;
 
 public class TranslationDemoTemplate
 {
   protected static String nl;
Tag 3 public static synchronized TranslationDemoTemplate create(String lineSeparator)
   {
     nl = lineSeparator;
     TranslationDemoTemplate result = new TranslationDemoTemplate();
     nl = null;
     return result;
   }

   protected final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
   protected final String TEXT_1 = "Hello, ";
   protected final String TEXT_2 = "!";
 
   public String generate(Object argument)
   {
     StringBuffer stringBuffer = new StringBuffer();
     stringBuffer.append(TEXT_1);
Tag 1  stringBuffer.append(argument);
     stringBuffer.append(TEXT_2);

Tag 2  stringBuffer.append("Hello again!");
     return stringBuffer.toString();
   }
 }

Huomaa, että Java-toteutusluokan Luo-metodilla on käytössä Objekti-parametri nimeltä argumentti. Tämä on sama objekti kuin tunniste 1 -argumentti mallipohjan toisella rivillä. Huomaa lisäksi, että Java-toteutusluokka käyttää StringBuffer-objektia keräämään tuloksena luotu koodi. Tähän objektiin tunniste 2 voidaan viitata suoraan mallipohjassa käyttämällä sen nimeä stringBuffer.

Staattinen metodi tunniste 3Luo sallii sovelluksen luoda ilmentymän TranslationDemoTemplate, joka käyttää tiettyä merkkijonoa rivin erottimena.

Muunnetun toteutusluokan rungon muutos

Edellä esitetyssä Luo-metodin TranslationDemoTemplate-luokassa sanotaan olevan osa toteutusluokan "runkoa". JET-ohjelman oletusarvon mukaisesti käyttämä runko näyttää tältä:

 public class CLASS
 {
   public String generate(Object argument)
   {
     return "";
   }
 }

Rungon määritelmä näyttää lähes normaalilta Java-luokalta luokan nimeä lukuun ottamatta. Luokan nimi (CLASS) korvataan class-määritteen arvolla jet-ohjauskoodissa. Lisäksi rungon määritelmällä on Luo-metodi, jonka olemme nähneet aiemmin. Muuttamalla runkoa voit mukauttaa mallipohjan toteutusluokan ja esimerkiksi saada sen toteuttamaan liittymä. Voit myös muuttaa mitä tahansa muuta luokan ominaisuutta.

Koeta sitä!Oletetaan esimerkiksi, että haluat kaikkien mallipohjan toteutusluokkien toteuttavan liittymän. Liittymä voi näyttää jokseenkin tältä:

 public interface IGenerator {
     String generate(Object argument);
 }

Voimme kertoa JET-ohjelmalle, että haluamme käyttää mukautettua runkoa, määrittämällä runko-määritteen jet-ohjauskoodissa mallipohjatiedoston ensimmäisellä rivillä. Runkomääritteen arvo on URI, joka osoittaa tiedostoon, josta mukautettu rungon määritelmä löytyy.

Koeta tätä ja luo ensin uusi nimetön tekstitiedosto valitsemalla Tiedosto-valikosta > Uusi tai käyttämällä työkalurivin vaihtoehtoja.

Luo uusi nimetön tekstitiedosto valitsemalla Tiedosto-valikosta Uusi

Avaa laji tai leikkaa ja liitä seuraava sisältö siinä:

 public class CLASS Tag 1implements IGenerator
 {
Tag 2/* (non-javadoc)
    * @see IGenerator#generate(Object)
    */
Tag 3public String generate(Object argument)
   {
     return "";
   }
 }

Tallenna nyt tiedosto kohteena generator.skeleton mallipohjan hakemistossa alla olevassa kuvassa esitetyllä tavalla.

Tekstitiedosto generator.skeleton mallipohjan kansiossa

Tämä tiedosto on mukauttamasi runko. Kaikki tätä runkoa käyttävät mallipohjat muunnetaan luokiksi, jotka toteuttavat IGenerator-liittymän. Voit käyttää tätä runkoa lisäämällä määritteen runko mallipohjan jet-ohjauskoodiin tämän näköisesti:

 <%@ jet package="hello" class="GreetingTemplate" skeleton="generator.skeleton" %>
 Hello, <%=argument%>!
 The current time is <%=new java.util.Date()%>.

Kun JET-koontitoiminto on muuntanut mallipohjan, toteutusluokka näyttää tältä:

 package hello;
 
 public class GreetingTemplate Tag 1implements IGenerator
 {
   protected final String NL = System.getProperties().getProperty("line.separator");
   protected final String TEXT_1 = "Hello, ";
   protected final String TEXT_2 = "!" + NL + "The current time is ";
   protected final String TEXT_3 = ".";
   protected final String TEXT_4 = NL;
 

Tag 2/* (non-javadoc)
    * @see IGenerator#generate(Object)
    */
Tag 3public String generate(Object argument)
   {
     StringBuffer stringBuffer = new StringBuffer();
     stringBuffer.append(TEXT_1);
     stringBuffer.append(argument);
     stringBuffer.append(TEXT_2);
     stringBuffer.append(new java.util.Date());
     stringBuffer.append(TEXT_3);
     stringBuffer.append(TEXT_4);
     return stringBuffer.toString();
   }
 }

Huomaa, että muunnettu mallipohja tunniste 1nyt toteuttaa IGenerator-liittymän ja tunniste 3Luo-metodilla on nyt tunniste 2kommentit, jotka määritimme generator.skeleton-tiedostossa. Tämä on yksi esimerkki siitä, miten voit mukauttaa muunnetun mallipohjan käyttämällä rungon määritelmää. Rungon määritelmät voivat sisältää myös lisämetodeja, sisäisiä luokkia yms. Saat kokeilemalla selville, mikä muu on mahdollista.

JET-syntaksin viite

Jos olet käyttänyt JSP-tekniikkaa aiemmin, JET-syntaksi näyttää sinusta todennäköisesti hyvin tutulta. JET-syntaksi on JSP-syntaksin alijoukko, joten siinä ei ehkä ole juurikaan uutta sinulle.

Tässä osassa on puoliksi muodollinen JET-syntaksin kuvaus ja viite.

JET-malli

JET-mallipohja on muunnettu Java-toteutusluokaksi. Tällä toteutusluokalla on metodi, jota voidaan kutsua noutamaan tuloksen merkkijono. Tätä metodia kutsutaan tavallisesti Luo-metodiksi (katso myös runko-määrite jet-ohjauskoodissa).

Jos runko-määritettä ei ole määritetty jet-ohjauskoodissa, Java-toteutusluokalla on seuraavat implisiittiset objektit, joihin voidaan viitata JET-mallipohjassa:

Direktiivit

Ohjauskoodit ovat sanomia JET-ohjelmalle. Ohjauskoodin syntaksi näyttää tältä:

<%@ directive { attr="value" }* %>

Valinnaisia tyhjämerkkejä voi olla kohteen "<%@" jälkeen ja ennen kohdetta "%>".

Ohjauskoodit vaikuttavat mallipohjien muuntamistapaan, mutta eivät tuota mitään tulostetta luodussa merkkijonossa, kun mallipohja kutsutaan.

Jet-ohjauskoodi

Käyttämällä jet-ohjauskoodia voit määrittää useita määritteitä ja viestiä niistä JET-ohjelmaan. JET-mallipohjatiedostossa on oltava jet-ohjauskoodi tiedoston ensimmäisellä rivillä. Muussa tapauksessa mallipohjatiedostoa ei voida muuntaa. Kaikki sitä seuraavat jet-ohjauskoodit ohitetaan. Tuntemattomat määritteet aiheuttavat kriittisiä virheitä muuntamisessa.

Seuraava ohjauskoodi osoittaa, että mallipohja pitäisi muuntaa Java-toteutusluokaksi nimeltä HelloWorldTemplate.java paketissa hello. Toteutusluokan pitäisi tuoda java.io.*- ja java.util.*-paketit.

 <%@ jet package="hello" class="HelloWorldTemplate" imports="java.io.* java.util.*" %>

Määritteiden tiedot jet-ohjausdirektiiville ovat tämän näköiset:

Määrite Arvo
paketti Sen Java-toteutusluokan nimi, johon mallipohja muunnetaan. Jos määritettä ei ole, Java-toteutusluokka luodaan oletusarvon mukaisessa paketissa.
luokka Sen Java-toteutusluokan luokan nimi, johon mallipohja muunnetaan. Jos sitä ei ole, Java-toteutusluokkaa kutsutaan nimellä CLASS.
tuonnit Tyhjämerkillä eroteltu luettelo paketeista ja/tai luokista, jotka tuodaan Java-mallipohjan luokassa
startTag JET-mallipohjassa merkkijono, joka antaa merkin komentosarjasovelman, lausekkeen tai sisällytys-ohjauskoodin alusta. Oletusarvona on "<%". Tämä määrite ja sen serkku endTag voivat olla hyvin käteviä, kun luodun koodin syntaksi on samanlainen kuin oletusarvoinen JET-syntaksi. Näin voi olla esimerkiksi silloin, kun käytät JET-ohjelmaa JSP-sivujen luonnissa.
endTag JET-mallipohjassa merkkijono, joka antaa merkin komentosarjasovelman, lausekkeen tai sisällytys-ohjauskoodin lopusta. Oletusarvona on "%>". Katso myös startTag.
perusrakenne Tiedoston URI. Tiedostossa on sen Java-toteutusluokan rungon määritelmä, johon mallipohja muunnetaan. URI selvitetään samalla tavalla kuin tiedosto-määritteen arvo selvitetään sisällytys-ohjauskoodissa. Jos määritettynä ei ole rungon määritystiedostoa, JET-ohjelma käyttää oletusarvon mukaista runkoa, joka on muodossa "public calss CLASS\n{\n public String generate(Object argument)\n {\n return \"\";\n }\n}\n". Tässä rungon luokan määritelmässä luokan nimen on oltava CLASS.
nlString Rivinsyötön merkkijono, jota käytetään Java-mallipohjan luokassa. Oletusarvona on "System.getProperties().getProperty(\"line.separator\")"

Sisällytyksen ohjauskoodi

Sisällytys-ohjauskoodia käytetään korvaamaan teksti ja/tai koodi mallipohjan muunnosaikana. Ohjauskoodi <%@ include file="urlSpec" %> lisää määritetyn resurssin tekstin jet-mallipohjatiedostoon. Sisällytetyllä tiedostolla voi olla JET-komentosarjaelementtejä, jotka myös käsitellään.

Ohjauskoodilla on yksi ainoa määrite, joka on tiedosto. Tämän määritteen arvo on sisällytettävän tiedoston sijainnin URI. URI voi olla joko tarkka polku tai suhteellinen polku. Suhteelliset URI-osoitteet tulkitaan aina suhteessa sisällytyksen ohjauskoodin sisältävän mallipohjan kansioon.

Esimerkki:

Seuraavassa esimerkissä pyydetään lisäämään tekijänoikeustiedosto muunnosaikana.

 <%@ include file="copyright.jet" %>

Vihje: Huomautus: JET tukee kommentteja ohitetuista mallipohjien poluista. JET-ohjelman kokoonpano voidaan määrittää käyttämään useita mallipohjasäilöjä. Siinä tapauksessa ensimmäinen säilö on käsittelyjärjestyksessä edellä toista, toinen edellä kolmatta ja niin edelleen. Tämä tarkoittaa sitä, että jos useissa mallipohjatiedostoissa on samannimisiä mallipohjatiedostoja tai sisällytystiedostoja, ensimmäisen kansion tiedosto käytetään ja muut ohitetaan. JET-perustaisten sovellusten työasemaohjelmia voidaan käyttää tässä mekanismissa toimittamaan mukautetut sisällytyksen tiedostot, jotka ohittavat alkuperäiset sisällytyksen tiedostot muuttamatta alkuperäisen sovelluksen mallipohjia.

JET-komentosarjaelementit

JET-ohjelmassa on kaksi komentosarjakielen elementtiä: komentosarjasovelmat ja lausekkeet. Komentosarjasovelma on lausefragmentti ja lauseke on täydellinen Java-lauseke.

Kaikilla komentosarjaelementeillä on "<%"-perustainen syntaksi, joka näyttää tältä:

 <% this is a scriptlet %>
 <%= this is an expression %>

Tyhjämerkki on valinnainen kohteiden "<%" ja "<%=" jälkeen ja ennen kohdetta "%>".

Jos haluat käyttää merkkijonoa %> literaalimerkkeinä komentosarjasovelmassa sen sijaan, että päättäisit komentosarjasovelman, voit peruuttaa ne kirjoittamalla %\>. Samalla tavalla merkkijono <% voidaan peruuttaa käyttämällä kohdetta <\%.

Komentomerkkijonosovelmat

Komentomerkkijonosovelmat voivat sisältää minkä tahansa kelvollisen Java-koodin fragmentin.

Komentosarjasovelmat ajetaan mallipohjan kutsun aikana. Se, tuottavatko ne tulostetta tuloksen merkkijonoon vai eivät, vaihtelee todellisen koodin mukaan komentosarjasovelmassa. Komentosarjasovelmilla voi olla sivuvaikutuksia, jotka muuttavat niissä näkyviä objekteja.

Kun kaikki komentosarjasovelman fragmentit tietyssä käännösyksikössä yhditetään siinä järjestyksessä, jossa ne ovat JET-mallipohjassa, niiden pitäisi tuottaa kelvollinen Java-lause tai lausesarja.

Esimerkki:
 <% if (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM) {%>
 Good Morning
 <% } else { %>
 Good Afternoon
 <% } %>

Syntaksi

<% komentosarjasovelma %>

Lausekkeet

JET-lauseke-elementti on Java-lauseke, joka lasketaan ja jonka tulos liitetään StringBuffer-objektiin, jonka Luo-metodi palauttaa. Lausekkeet lasketaan mallipohjan kutsumisen aikana.

Jos lausekkeen tulosta ei voida liittää StringBuffer-objektiin, virhe tapahtuu muunnoksen aikana. JET-lausekkeen sisällön on oltava täydellinen Java-lauseke.

Sivuvaikutuksia tuetaan lausekkeissa. Ne tulevat voimaan, kun JET-lauseketta lasketaan. JET-lausekkeet lasketaan vasemmalta oikealle JET-mallipohjassa.

Seuraavassa esimerkissä nykyinen päivämäärä liitetään StringBuffer-tulokseen.

<%= (new java.util.Date()).toLocaleString() %> 

Syntaksi

<%= lauseke %>

Resurssit

http://www.javaworld.com/javaworld/jw-11-2001/jw-1102-codegen.html

http://www.eclipse.org/emf/