© Copyright Azzurri Ltd. 2003 - 2005. Minden jog fenntartva
 Eclipse Corner cikk

JET ismertető 1. rész (JET bemutatása)

Összegzés

A forráskód előállítása időt spórolhat a projektekben és csökkentheti a redundáns programozás mennyiségét. A forráskód előállítása hatékony lehet, de a kódot író program rövid idő alatt nagyon összetetté és nehezen érthetővé válhat. Az összetettség csökkentésének és az olvashatóság javításának egyik módja a sablonok használata.

Az Eclipse Modeling Framework (EMF) projekt két nagyon hatékony eszközt biztosít a forráskód előállításához: JET (Java kibocsájtó sablonok) és JMerge (Java összevonás). A JET-tel lehetősége van a JSP-hez hasonló szintaxis (valójában a JSP szintaxis egy részhalmazának) használatára, mellyel igen könnyű olyan sablonokat írni, amelyek kifejezik az előállítani kívánt kódot. A JET olyan általános sablon alrendszer, mellyel SQL, XML, Java forráskódkódolt és egyéb kimenetet állíthat elő sablonokból. Az org.eclipse.emf.codegen bedolgozóban található az EMF futási környezet letöltés részeként.

A cikkből megtudhatja, hogy hogyan hozhat létre JET sablonokat, hogyan fordíthatja le automatikusan a sablonokat Java osztályokra a JET jelleg és a JET összeépítő használatával, és hogyan használhatja ezeket az osztályokat forráskód előállításához. A cikk egy rövid JET szintaxis referenciát is tartalmaz.

Közreműködő: Remko Popma, Azzurri Ltd., remko.popma kukac azzurri pont jp, 2003. július 30. Engedéllyel használva. Utolsó frissítés: 2007. január 3.


Tartalom

Kezdeti lépések
A JET modell
Utasítások
JET parancsfájl elemek
Erőforrások

Kezdeti lépések

Mielőtt létrehozhatná az első sablonját, szüksége van az EMF bedolgozóra. Ha még nem telepítette, akkor telepítse most, mielőtt továbbhaladna ebben az ismertetőben.

A képernyőképek az Eclipse SDK 3.1.0 RC2 változatán és az EMF 2.1.0 I200506160200 változatán alapulnak. A Java 5.0 szerkezetek, például az általános típusok használatához azonban legalább Eclipse 3.3M4 és EMF 2.3.0M4 kell.

A JET sablon olyan szövegfájl, melynek neve a "jet" karakterekre végződik. Az EMF egyezmény szerint a "jet" karaktereket kell hozzáfűzni ahhoz, ami az előállított kód fájlkiterjesztése lenne, így a .javajet azt jelzi, hogy a sablon egy .java fájlt állít elő, az .xmljet sablon XML fájlt, az .sqljet sablon SQL fájlt és így tovább.

JET jelleg és JET összeépítő

A hagyományoknak megfelelően kezdjük egy olyan sablonnal, amely létrehozza a "Hello, world" üzenetet. Az alábbi, négy lépésből álló folyamattal hozzuk létre az első sablont:

  1. Új Java projekt létrehozása "src" forrás mappával
  2. A JET jelleg adása a projektnek. Ez létrehozza a "templates" mappát a projekt gyökere alatt
  3. A projekt JET tulajdonságainak módosítása annak biztosítása érdekében, hogy a sablonok a projekt "src" forrás mappájába legyenek lefordítva
  4. Új fájl létrehozása "helloworld.txtjet" névvel és mentése a templates mappába

1. lépés: Projekt létrehozása

Kattintson a munkaterület menü Fájl > Új > Projekt menüpontjára, hogy megnyíljon az Új projekt varázsló. Hozzon létre egy új Java projektet, és vegye fel hozzá az src nevű forrás mappát.

Új Java projekt az src mappával

2. lépés: A projekt átalakítása JET projektté

Miután létrehozta a projektet, kattintson rá a jobb egérgombbal a Csomagböngésző vagy a Hierarchia nézetben, majd válassza az előugró menü Új > Egyéb... > Java kibocsátó sablonok > Projektek átalakítása JET projektté menüpontját.

Új Java projekt az src mappával

Miután megnyomta a Tovább gombot, válassza ki a létrehozott projektet, és kattintson a Befejezés gombra.

JET jelleg adása a projektnek

A varázsló hozzáadja a JET jelleget a projekthez azzal, hogy létrehoz egy templates mappát a projekt gyökere alatt, ahogyan az az alábbi képen látható. A JET összeépítő is hozzáadásra kerül a projekthez. Ez automatikusan lefordítja Java osztályra a templates mappa összes olyan fájlját, melynek neve a "jet" karakterekre végződik.

Létrehozott templates mappa

3. lépés: JET beállítások módosítása

Mielőtt létrehozná az első sablont, gondoskodjék róla, hogy a projekt src forrás mappája legyen a lefordított sablonok cél mappája. Kattintson a jobb egérgombbal a projektre, majd válassza az előugró menü "Tulajdonságok" menüpontját. A Projekt tulajdonságai párbeszédablakban válassza a JET beállítások lehetőséget a bal oldali menüből, és adja meg az "src" értéket (a forrás mappa nevét) a "Forrás tároló" szövegmezőben. Az alábbi képen a Projekt tulajdonságai párbeszédablak JET beállítások tulajdonságoldala látható.

Forrás tároló hozzáadása mappa

Tipp: Megjegyzés: több mappát is megadhat a Sablon tárolók mezőben, egymástól szóközzel vagy pontosvesszővel elválasztva. Ha azonban különböző mappákban található sablonoknak ugyanaz a fájlneve, akkor csak az első mappában található sablont fordítja le automatikusan a JET összeépítő. Ha azt akarja, hogy az összes sablon le legyen fordítva, akkor gondoskodjék róla, hogy eltérő legyen a fájlnevük.

4. lépés: JET sablonfájl létrehozása

A JET összeépítő most lefordítja Java forrásfájlokra a projekt src mappájában található összes sablont.

Előszöris, az összeépítési problémák elkerülése érdekében kapcsolja ki az automatikus összeépítéseket. A Projekt menüben szüntesse meg az "Automatikus összeépítés" lehetőség bejelölését.

Projekt menü az Összes összeépítése és az Automatikus összeépítés menüponttal

Most pedig hozza létre az első sablont. Kattintson a munkaterület menü Fájl > Új > Fájlt menüpontjára, hogy megnyíljon az Új fájl varázsló. Válassza a templates könyvtárat szülő mappának, és legyen a fájl neve helloworld.txtjet.

Üres helloworld.txtjet fájl létrehozása

Ha az "Automatikus összeépítés" tiltott, akkor nem kapja a következő hibát, amikor a Befejezés gombra kattint: "A 'jet' utasítás hiányzik a 'helloworld.txtjet' fájlból az 1. sorban", ahogyan az az alábbi képen látható.

Hiba a JetBuilder futtatásakor az üres .txtjet fájlra

Ha az automatikus összeépítés engedélyezett, akkor a fenti hibaüzenetet kapja. Szerencsére ez nem jelent valós problémát, mindössze azt, hogy a JET összeépítő rögtön a létrehozás után megpróbálta lefordítani a sablont, és azt találta, hogy az még üres. Kattintson az OK gombra a hiba párbeszédablak bezárásához. Nyissa meg a helloworld.txtjet fájlt, amennyiben az nincs nyitva, és írja be vagy vágja ki és másolja be az alábbi tartalmat a szerkesztőben.

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

 Hello, world!

Amikor elmenti a sablonfájlt, a JET összeépítő automatikusan lefordítja azt, amennyiben be van jelölve az 'Automatikus összeépítés' lehetőség. Ha nem, akkor válassza a Projekt menü "Projekt összeépítése" menüpontját.

Mivel megadta a hello csomagot és a HelloWorldTemplate osztályt a sablon első sorában, ezért az összeépítő létrehoz egy hello csomagot az src mappában és elmenti a HelloWorldTemplate.java Java fájlt a csomagba, ahogy az az alábbi képen látható.

A hello csomag most már tartalmazza a HelloWorldTemplate.java osztályfájlt

A Java osztály a sablon fordításának eredménye, egy úgynevezett sablon megvalósítási osztály. Az osztály rendelkezik generate metódussal. Ez a metódus állítja elő a sablonban jelzett kódot.

Próbálja ki!Hozza létre a HelloWorldTemplate sablon megvalósítási osztály egy példányát és hívja meg annak generate metódusát az alábbiak szerint:

A fentiek megvalósításához hozzon létre egy új osztályt HelloWorldImpl névvel. Kattintson a jobb egérgombbal a hello csomagra a Csomagböngésző vagy a Hierarchia nézetben, majd válassza az előugró menü Új > Osztály menüpontját.

Új osztály létrehozása

Legyen az osztály neve "HelloWorldImpl", és biztosítsa a public static void main(String[] args) csonk bejelölését.

A HelloWorldImpl nevű új osztály létrehozása, mely rendelkezik a main metódus csonkkal

Most másolja be az alábbi kódot a main() metódusba:

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

A HelloWorldImpl osztály a minta main metódussal

A futtatásához válassza a "Futtatás" eszköztár legördülő menü "Futtatás mint/Java alkalmazás" menüpontját. A rendszer kinyomtatja a "Hello, world!" szavakat a konzolra.

Argumentumok átadása a sablonnak

Összefoglalva: Létrehozta első sablonját és előállított vele némi kódot. Lehet, hogy az eredmény nem túl látványos, de ezzel elvégzett minden beállítást, és most már elkezdheti felfedezni, hogy miben tudja a JET segíteni a munkáját. A következő lépés egy argumentum átadása a sablonnak.

Próbálja ki!Vegyen fel egy új JET sablonfájlt vagy módosítsa a meglévőt, hogy az alábbi legyen a tartalma:


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

A JET összeépítő lefordítja ezt a sablont a GreetingTemplate osztályra a hello csomagban. Itt is létrehoz egy példányt a sablon osztályból (vagy módosítja a meglévő HelloWorldImpl példányt, de most átad egy karaktersorozat argumentumot a generate metódusnak:

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

A fenti kód kinyomtatja a "Hello, Tutorial Reader!" szavakat a konzolra.

Csomagok importálása

A sablonnak átadott argumentum tetszőleges objektum lehet. Az előző példában egy karaktersorozatot adott át a generate metódusnak, de az alkalmazásban valószínűleg a saját modell objektumát akarja. Ha az argumentum nem a java.lang csomagban van, vagy ha a sablon olyan más osztályokat használ, amelyek nem a java.lang csomagban vannak, akkor importálnia kell ezeket az osztályokat a sablon jet utasításában. Az Tag 1imports attribútummal rendelkező jet utasítás így néz ki:

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

A cikk JET szintaxis referencia szakasza további részletekkel szolgál a jet utasításról és annak attribútumairól.

A következő példában létrehoz egy XML kódot előállító sablont. Hogy tartsa magát az EMF egyezményhez, miszerint hozzá kell fűzni a "jet" karaktereket az előállított kód fájlkiterjesztéséhez, az importdemo.xmljet fájlba mentse a sablont. Egy java.util.List objektumot ad át a sablonnak, amely tartalmazza az XML előállításakor használni kívánt adatokat.

   <%@ 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>

Az alábbi kód bemutatja a sablonpéldány meghívását. Létrehoz egy Tag 2listát és Tag 3átadja azt a sablon megvalósítási osztály generate metódusának:

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);
  }
}

Ez kinyomtatja az alábbi XML eredményt a konzolra:

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

Ez egy nagyon egyszerű példa, mely nagyon egyszerű XML kódot állít elő. Természetesen bonyolultabb XML kódot is létrehozhat a JET használatával, ha attribútumokat és névtartományokat használ. Amikor ezt teszi, kényelmesebb lehet egy speciális osztályt létrehozni, ami jobb modellje az XML dokumentumnak, mint a java.util.ArrayList. Általában minél összetettebb a JET sablon, annál több működést érdemes a sablonnak átadott modell objektumba foglalni, hogy a sablon olvasható maradjon. Ezt tovább részletezzük az ismertető 2. részében.

Címkék módosítása

A JET okos szolgáltatása, hogy módosíthatja azokat a címkéket, amelyek a kódrészleteket jelölik a sablonfájlban. Ez igen kényelmes, amikor az előállított kód szintaxisa nagyon hasonló az alapértelmezett JET szintaxishoz, például ha JSP oldalakat állít elő a JET használatával.

A következő példában egy egyszerű JSP oldalt hoz létre a JET használatával. Módosítja a JET címkéket, hogy a "<$" karaktersorozattal kezdődjenek a sabloncímkék, és a "$>" karakterrel fejeződjenek be. A sablon továbbra is tartalmaz "<%" és "%>" karaktersorozatokat, de a JET alrendszer most már nem tekinti speciálisnak őket, hanem ugyanúgy kiírja őket az eredménybe, mint bármely más karaktersorozatot.

Próbálja ki!A címkejelzők módosításához vegyen fel egy Tag 1startTag és egy Tag 2endTag attribútumot a sablon első sorában található JET utasításba, az alábbi példában látható módon.

 <%@ 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 -->

 <$ } $>

Most is egy karaktersorozat argumentummal hívja meg ezt a megvalósítási osztályt, az alábbiak szerint:

 System.out.println(new tags.demo.JspTemplate().generate("button"));
Az alábbi kimenet jelenik meg a konzolon. A kimenet tartalmazza a sértetlen JSP címkét: a "<%" és a "%>" karaktersorozatot nem JET kódrészletként értelmezi a rendszer, hanem egyszerűen beilleszti az előállított kódba.
 Tag 3  <%= request.getParameter("button") %> <!-- this is generated JSP -->

A motorháztető alatt

Az alábbi szakaszban megnéztük a JET sablonok létrehozását, a JET jelleg beállítását a sablonok automatikus lefordításához Java megvalósítási osztályokra, valamint a Java megvalósítási osztályok használatát a kód előállítására.

Ebben a szakaszban közelebbről szemügyre vesszük a sablon lefordításának eredményeként kapott Java megvalósítási osztályokat. Megnézzük, hogy miért használható az argument és a stringBuffer implicit objektum a sablonokban, valamint hogy hogyan lehet személyre szabni a lefordított megvalósítási osztályt egyéni "váz" megadásával.

Lefordított sablonok

A JET sablont lefordítja Java megvalósítás osztályra. Vannak olyan objektumok a Java megvalósítási osztályban, amelyekre közvetlenül hivatkozhat a JET sablonban. Az alábbi példa bemutatja, hogy hogyan használható az argument és a stringBuffer implicit objektum a sablonokban.

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

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

A fenti sablon az alábbiak szerint kerül lefordításra Java megvalósítási osztályra:

 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();
   }
 }

Figyelje meg, hogy a Java megvalósítási osztály generate metódusának van egy Object paramétere, egy úgynevezett argument. Ez ugyanaz az objektum, mint a sablon második sorában szereplő Tag 1paraméter. Azt is figyelje meg, hogy a Java megvalósítási osztály StringBuffer objektumot használ az eredményül kapott előállított kód begyűjtésére. A sablonban közvetlenül hivatkozhat erre az objektumra Tag 2a nevével: stringBuffer.

A Tag 3create statikus metódus lehetővé teszi az alkalmazás számára egy TranslationDemoTemplate példányosítását, amely egy bizonyos karaktersorozatot használ sorelválasztóként.

A lefordított megvalósítási osztály vázának módosítása

A fenti TranslationDemoTemplate osztály generate metódusa a megvalósítási osztály "vázának" része. A JET alrendszer által használt alapértelmezett váz a következőképp néz ki:

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

A váz meghatározása majdnem úgy néz ki, mint egy normál Java osztály, kivéve az osztály nevét. Az osztály neve (CLASS) a jet utasításban szereplő class attribútum értéke lesz. Valamint a váz meghatározásában szerepel a korábban bemutatott generate metódus. A váz módosításával személyre szabhatja a sablon megvalósítási osztályt, például megvalósíthat vele felületet vagy módosíthatja az osztály egyéb jellemzőit.

Próbálja ki!Például tegyük fel, hogy azt szeretné, hogy minden sablon megvalósítási osztály megvalósítson egy felületet. A felület az alábbihoz hasonló lehet:

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

Az egyéni váz használatát úgy lehet a JET alrendszer tudomására hozni, hogy beállítja a jet utasítás skeleton attribútumát a sablonfájl első sorában. A skeleton attribútum értéke egy olyan URI, amely az egyéni váz meghatározását tartalmazó fájlra mutat.

Ennek kipróbálásához először hozzon létre egy új Névtelen szövegfájlt a Fájl > Új menüből vagy az eszköztárból.

Új Névtelen szövegfájl létrehozása a Fájl - Új menüből

Nyissa meg, és írja vagy másolja bele az alábbi tartalmat:

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

Most mentse el ezt a fájlt generator.skeleton néven a templates könyvtárba, az alábbi képen látható módon.

A generator.skeleton szövegfájl a templates mappában

Ez a fájl az egyéni váz. A vázat használó összes sablon az IGenerator felületet megvalósító osztályokra lesz lefordítva. A váz használatához vegye fel a skeleton attribútumot a sablon jet utasításába az alábbiak szerint:

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

Miután a JET összeépítő lefordította a sablont, a megvalósítási osztály így néz ki:

 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();
   }
 }

A lefordított sablon most már Tag 1megvalósítja az IGenerator felületet, és a Tag 3generate metódus most már rendelkezik Tag 2a generator.skeleton fájlban megadott megjegyzésekkel. Ez példa arra, hogy hogyan lehet személyre szabni a lefordított sablont vázmeghatározással. A vázmeghatározások extra metódusokat, belső osztályokat stb. is tartalmazhatnak. Kis kísérletezéssel megismerheti, hogy mi minden lehetséges.

JET szintaxis referencia

Ha használt már JSP technológiát korábban, akkor a JET szintaxis valószínűleg nagyon ismerős lesz. A JET szintaxis a JSP szintaxis részhalmaza, így nem lesz benne sok újdonság.

A szakasz a JET szintaxis félformális leírásával és referenciával szolgál.

A JET modell

A JET sablont lefordítja Java megvalósítás osztályra. Ez a megvalósítási osztály rendelkezik egy metódussal, melynek meghívásával beszerezheti az eredmény karaktersorozatot. A metódus neve általában generate (lásd még a jet utasítás skeleton attribútumát).

Ha nincs megadva skeleton attribútum a jet utasításban, akkor a Java megvalósítás az alábbi implicit objektumokkal rendelkezik, amelyekre hivatkozhat a JET sablonban:

Utasítások

Az utasítások a JET alrendszernek szóló üzenetek. Az utasítások szintaxisa a következő:

<%@ utasítás { attribútum="érték" }* %>

Lehet nem kötelező üres hely a "<%@" után és a "%>" előtt.

Az utasítások befolyásolják, hogy hogyan kerül lefordításra a sablon de nem írnak semmilyen kimenetet az előállított karaktersorozatba a sablon meghívásakor.

Jet utasítás

A jet utasítás meghatároz számos attribútumot és kommunikálja ezeket a JET alrendszer felé. A JET sablonfájlban lennie kell jet utasításnak a fájl első sorában, különben a sablonfájl nem fordítható le. Az esetleges további jet utasítások figyelmen kívül maradnak. Az ismeretlen attribútumok végzetes fordítási hibákat eredményeznek.

Az alábbi utasítás azt jelzi, hogy a sablont a hello csomagban található HelloWorldTemplate.java Java megvalósítási osztályra kell lefordítani. A megvalósítási osztálynak importálnia kell a java.io.* és a java.util.* csomagot.

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

A jet utasítás attribútumainak részletei a következők:

Attribútum Érték
package Annak a Java megvalósítási osztálynak a csomagneve, amelyre lefordítja a sablont. Ha az attribútum nincs jelen, akkor a Java megvalósítási osztály az alapértelmezett csomagban jön létre.
class Annak a Java megvalósítási osztálynak az osztályneve, amelyre lefordítja a sablont. Ha nincs jelen, akkor a Java megvalósítási osztály neve CLASS.
imports A Java sablon osztályba importálni kívánt csomagok és/vagy osztályok szóközzel elválasztott listája.
startTag Az a karaktersorozat a JET sablonban, ami a kódrészletek, kifejezések vagy include utasítások kezdetét jelzi. Az alapértelmezett érték: "<%". Az attribútum és rokona, az endTag akkor nagyon kényelmes, amikor az előállított kód szintaxisa nagyon hasonló az alapértelmezett JET szintaxishoz, például ha JSP oldalakat állít elő a JET használatával.
endTag Az a karaktersorozat a JET sablonban, ami a kódrészletek, kifejezések vagy include utasítások végét jelzi. Az alapértelmezett érték: "%>". Lásd még: startTag.
skeleton Annak a Java megvalósítási osztálynak a vázmeghatározását tartalmazó fájl URI azonosítója, amelyre lefordítja a sablont. Az URI hasonló módon kerül feloldásra, mint a file attribútum értéke az include utasításban. Ha nincs megadva vázmeghatározás fájl, akkor a JET alrendszer az alábbi formátumú alapértelmezett vázat használ: "public class CLASS\n{\n public String generate(Object argument)\n {\n return \"\";\n }\n}\n". A váz osztálymeghatározásában szereplő osztálynév CLASS kell, hogy legyen.
nlString A Java sablon osztályban használni kívánt új sor karaktersorozat. Az alapértelmezett érték: "System.getProperties().getProperty(\"line.separator\")"

Include utasítás

Az include utasítással lehetősége van szöveg és/vagy kód kicserélésére a sablon fordításakor. A <%@ include file="urlSpec" %> utasítás beilleszti a megadott erőforrás szövegét a JET sablonfájlba. A tartalmazott fájlban JET parancsfájl-elemek is lehetnek, amelyeket szintén feldolgoz a rendszer.

Az utasítás egyetlen attribútummal rendelkezik, ez a file. Az attribútum értéke a befoglalni kívánt fájl helyének URI azonosítója. Ez az URI lehet abszolút vagy relatív útvonal. A relatív URI-kat az include utasítást tartalmazó sablon mappájához viszonyítva értelmezi a rendszer.

Például:

Az alábbi példa a szerzői jogi nyilatkozatot tartalmazó fájl befoglalását kéri a fordításkor.

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

Tipp: Megjegyzés: A JET támogatja a sablon elérési utak újradefiniálását. Lehetőség van úgy beállítani a JET alrendszert, hogy több Sablon tárolót használjon. Ilyenkor az első tároló elsőbbséget élvez a másodikkal szemben, a második a harmadikkal szemben stb. Ez azt jelenti, hogy ha azonos fájlnévvel rendelkező sablonfájlok vagy tartalmazott fájlok vannak több Sablon tárolóban, akkor az első mappában található fájl kerül felhasználásra, és a többi(ek) figyelmen kívül marad(nak). A JET alapú alkalmazás ügyfelei ezzel a mechanizmussal egyéni tartalmazott fájlokat biztosíthatnak, amelyek az eredeti alkalmazás sablonjainak módosítása nélkül definiálják újra az eredeti tartalmazott fájlokat.

JET parancsfájl elemek

A JET-ben kétféle parancsfájlnyelv-elemek vannak: kódrészletek és kifejezések. A kódrészlet egy utasítástöredék, a kifejezés pedig egy teljes Java kifejezés.

Minden egyes parancsfájl-elemnek "<%" alapú szintaxisa van az alábbiak szerint:

 <% ez egy kódrészlet %>
 <%= ez egy kifejezés %>

Az üres hely nem kötelező a "<%" és "<%=" után és a "%>" előtt.

Ha a kódrészlet lezárása helyett literál karakterekként akarja használni a %> karaktersorozatot a kódrészletben, akkor a %\> beírásával védheti le. Hasonlóan, a <% karaktersorozatot a <\% beírásával védheti le.

Kódrészletek

A kódrészletek tetszőleges érvényes Java kódtöredéket tartalmazhatnak.

A kódrészletek a sablon hívásakor kerülnek végrehajtásra. Az, hogy állítanak-e elő kimenetet az eredmény karaktersorozatba, a kódrészletben található tényleges kódtól függ. A kódrészleteknek lehetnek mellékhatásai, amelyek módosítják a bennük látható objektumokat.

Amikor az adott fordítási egységben található összes kódrészlet kombinálva van abban a sorrendben, ahogyan a JET sablonban szerepelnek, akkor érvényes Java utasítást vagy utasítássorozatot kell adniuk.

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

Szintaxis

<% scriptlet %>

Kifejezések

A JET kifejezés elem egy Java kifejezés, amelyet kiértékel a rendszer és hozzáfűzi az eredményt a generate metódus által visszaadott StringBuffer objektumhoz. A kifejezések kiértékelésére a sablon hívásakor kerül sor.

Ha a kifejezés eredménye nem fűzhető hozzá a StringBuffer objektumhoz, akkor fordítási hiba történik. A JET kifejezés tartalmának teljes Java kifejezésnek kell lennie.

A kifejezésekben támogatottak a mellékhatások. Ezek a JET kifejezés kiértékelésekor hatnak. A JET kifejezések balról jobbra kerülnek kiértékelésre a JET sablonban.

A következő példában az aktuális dátumot fűzi hozzá a StringBuffer eredményhez.

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

Szintaxis

<%= kifejezés %>

Erőforrások

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

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