A saját elemek. JSP standard elemkönyvtár JSTL alap elemkönyvtár (core) nemzetköziesítés (internationalization) Saját elemkönyvtárak (Custom Tags)

Hasonló dokumentumok
JSP standard elemkönyvtár JSTL. alap elemkönyvtár (core) nemzetköziesítés (internationalization) Saját elemkönyvtárak (Custom Tags)

A Java Server Pages technológia. JSP és JSP elemkönyvtárak, JSTL alapok

Szerver oldali Java programozás /II. 1. óra. Elemkönyvtárak. Elemkönyvtárak használata Saját elemkönyvtár készítése.

Java Server Pages - JSP. Web Technológiák. Java Server Pages - JSP. JSP lapok életciklusa

JSP életciklusa Szkript elemek, implicit objektumok, bean-ek, EL include, (forward) Visszatekintés MVC

JSP technológia. A JSP elemek kétféle szintaxissal használhatók: A JSP

A JSP életciklusa Szkript elemek Dinamikus tartalom létrehozása Kifejezés nyelv Tartalom újrafelhasználása Vezérlés átadása Visszatekintés

A JSP életciklusa Szkript elemek Dinamikus tartalom létrehozása Kifejezés nyelv Tartalom újrafelhasználása Vezérlés átadása Visszatekintés

JavaServer Pages JSTL, EL

A WEB programozása - JSP1 dr.gál Tibor őszi félév

JSP (Java Server Pages) technológia

Java servlet technológia 1 / 40

Java servlet technológia. Web alkalmazások. Servlet-et használni érdemes, ha. JSP-t használni érdemes, ha. Servlet-JSP kombináció (MVC) szükséges, ha

A JavaServer Pages (JSP)

és az instanceof operátor

2. rész: JSP-k és szervletek készítése. Bakay Árpád NETvisor kft (30)

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

A JavaServer Pages (JSP)

A JavaServer Pages (JSP)

Struts2 keretrendszer

Web-fejlesztés NGM_IN002_1

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Szervlet-JSP együttműködés

Java Servlet technológia

JAVA webes alkalmazások

Már megismert fogalmak áttekintése

3. Osztályok II. Programozás II

OOP: Java 8.Gy: Abstract osztályok, interfészek

MVC Java EE Java EE Kliensek JavaBeanek Java EE komponensek Web-alkalmazások Fejlesztői környezet. Java Web technológiák

2010. őszi félév. A WEB programozása -JSP3 dr.gál Tibor. // Kötelező csomagbeli elhelyezés package customtags;

Bevezető. Servlet alapgondolatok

Osztályok. 4. gyakorlat

Szkriptnyelvek. 1. UNIX shell

Interfészek. PPT 2007/2008 tavasz.

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Grafikus keretrendszer komponensalapú webalkalmazások fejlesztéséhez

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem

Komputeralgebra Rendszerek

Web-technológia PHP-vel

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Objektumok inicializálása

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

MVC desktop alkalmazás esetén. MVC Model-View-Controller. eredete: Model View Controller (MVC) elv Java EE Java alapú Web alkalmazások

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

JEE tutorial. Zsíros Levente, 2012

JavaServer Pages (JSP) (folytatás)

BASH script programozás II. Vezérlési szerkezetek

OOP és UML Áttekintés

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

A Java EE 5 plattform

Java szervlet technológia

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Java programozási nyelv 6. rész Java a gyakorlatban

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Enterprise JavaBeans. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem. Az Enterprise JavaBeans

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

PHP. Telepítése: Indítás/újraindítás/leállítás: Beállítások: A PHP nyelv

Programozási nyelvek JAVA EA+GY 1. gyakolat

3D-s technológiák a játékfejlesztésben UDK bevezetés

OOP #14 (referencia-elv)

Egészítsük ki a Drupal-t. Drupal modul fejlesztés

Enterprise JavaBeans 1.4 platform (EJB 2.0)

Informatika terméktervezőknek

Készítette: Nagy Tibor István

ELTE SAP Excellence Center Oktatóanyag 1

1. Alapok. #!/bin/bash

Apple Swift kurzus 3. gyakorlat

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Flash és PHP kommunikáció. Web Konferencia 2007 Ferencz Tamás Jasmin Media Group Kft

Forráskód formázási szabályok

C++ programozási nyelv Konstruktorok-destruktorok

Java Web technológiák

JAVA PROGRAMOZÁS 2.ELŐADÁS

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

MVC Java EE Java EE Kliensek JavaBeanek Java EE komponensek Web-alkalmazások Fejlesztői környezet

AWK programozás, minták, vezérlési szerkezetek

PHP. Adatbázisok gyakorlat

Programozási nyelvek Java

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

C++ programozási nyelv

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás C és C++ -ban

Java programozási nyelv 5. rész Osztályok III.

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Java II. I A Java programozási nyelv alapelemei

MicroSigner Közvetítő Szerver fejlesztői dokumentáció

OOP. Alapelvek Elek Tibor

A J2EE fejlesztési si platform (application. model) 1.4 platform. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem

Programozási nyelvek Java

Java programozási nyelv 4. rész Osztályok II.

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

MicroSigner Közvetítő Szerver fejlesztői dokumentáció

A JavaScript főbb tulajdonságai

Tájékoztató. Használható segédeszköz: -

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Átírás:

Áttekintés JSP elemkönyvtárak Bevezetés JSP standard elemkönyvtár JSTL alap elemkönyvtár (core) nemzetköziesítés (internationalization) Saját elemkönyvtárak (Custom Tags) 1 / 46 2 / 46 Elemkönyvtárak A JSP technológia segítségével könnyen lehet Java kódot HTML dokumentumokba beágyazni. Ez a megoldás nem ideális HTML tartalom fejlesztők számára, akik pl. nem tudnak Java-ul. A JSP technológia biztosítja, hogy elemkönyvtárakba szervezett saját elemeket hozzunk létre. A Java-fejlesztő kibővítheti a JSP oldalakat saját elemek írásával és HTML-be ágyazásával. A saját elemek tehát jobb csomagolást biztosítanak azáltal, hogy az üzleti logikát elválasztják a megjelenítési logikától, de nem biztosítanak több funkcionalitást, mint a szkriptletek. A saját elemek fejlesztő által definált JSP nyelvi elemek, amelyek ismétlődő feladatokat oldanak meg elemkönyvtárakba (tag library) vannak szervezve, amelyek több (álatalában összefüggő) elemet definiálhatnak tartalmazzák az elem implementációját is 3 / 46 4 / 46

Saját elemek előnyei Szintaxis Saját elemek előnyei Csökkentik vagy kiküszöbölik a szkriptlet kódot a JSP-ben. Az elem működése függhet az attribútumok értékétől valamint a törzs (body) tartalmától Egyszerűbb a szintaxis. A szkriptletek Java kódot tartalmaznak a saját elemek HTML-hez hasonló kódot használnak. A termelékenységet javíthatják azáltal, hogy a (programozni nem feltétlenül tudó) tartalom-fejlesztők elemkönyvtárak segítségével dinamikus tartalmat hozhatnak létre Java kód használata nélkül. Újrafelhasználhatók: fejlesztési és tesztelési időt takaríthatunk meg a segítségükkel. A szkritpletek nem újrafelhasználhatók (hacsak a copy-paste módszert nem nevezzük annak). Szintaxis: törzs nélküli: <prefix:tag attr1="value1"attrn="valuen"/> törzs tartalommal: <prefix:tag attr1="value1"attrn="valuen"> body </prefix:tag> ahol prefix az elemkönyvtárat azonosítja, a tag az elem azonosító, attr1 attrn pedig az attribútum nevek, amelyek módosítják az elem viselkedését. 5 / 46 6 / 46 JSP Standard elemkönyvtár A JSP Standard elem könyvtár (JSTL) használatának előnyei: a JSP alkalmazásokban a JSTL segítségével egy egységes elem-csomagot használunk az alkalmazás bármely alkalmazásszerverre telepíthető lesz az elemek implementációja optimalizálva van A JSTL széles elem-választékot kínál a különböző területekre. A különböző elemkönyvtárak URI-jai: Core: http://java.sun.com/jsp/jstl/core Internationalization: http://java.sun.com/jsp/jstl/fmt XML: http://java.sun.com/jsp/jstl/xml SQL: http://java.sun.com/jsp/jstl/sql Functions: http://java.sun.com/jsp/jstl/functions Core: folyamatvezérlés (flow control), URL feldolgozás, egyéb I18n: lokalizálás, üzenet formázás, szám ill. dátum formázás XML: alap (core), folyamatvezérlés (flow control), transzformációk, Adatbázis: Sql lekérdezések Függvények: Kollekcióhossz, karaktersorműveletek letöltés/információ http://jstl.java.net/ A JSP-ben a következőképpen hivatkozunk egy elemkönyvtárra: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 7 / 46 8 / 46

Együttműködés elemek között Az elemek implicit vagy explicit módon működnek együtt környezetükkel. Implicit együttműködés egy jól meghatározott intrefészen keresztül történik, amely által a beágyazott elemek együttműködnek a szülő elemekkel. Ilyen együttműködést használnak például a JSTL feltételes elemek. Explicit együttműködésről beszélünk, ha egy elem információt kínál fel a környezetének egy változóban, amelynek a nevét a var attribútummal adjuk meg. Pl. a foreach elem az aktuális értékét az item változóban a következőképpen kínálja fel: <c:foreach var="item" items="${sessionscope.cart.items}"> </c:foreach> Alap (Core) elemkönyvtár Változók használatát támogató elemek Változók használatát támogató elemek A set elem beálĺıt egy változót egy EL kifejezés alapján egy bizonyos hatókörben (oldal, kérés, szesszió, vagy alkalmazás). Ha a változó még nem létezik, akkor létrehozza. Egy JSP EL változó beálĺıtható: a value attribútummal: <c:set var="valtozonev" scope="session" value=""/> az elem törzsével: <c:set var="valtozonev"> </c:set> A remove elem segítségével eltávoĺıtható egy EL változó <c:remove var="valtozonev" scope="session"/> 9 / 46 10 / 46 Folyamatvezérlés (Flow Control) elemek Elemek kollekciók bejárására A folyamatvezérlés szkriptletekkel nehézkes: <% Iterator i = cart.getitems().iterator(); while (i.hasnext()){ ShoppingCartItem item = (ShoppingCartItem)i.next(); %> <tr> <td> ${item.quantity} </td> </tr> <% } %> A folyamatvezérlés elemek (lásd pl. foreach) kiküszöbölik a szkriptleteket. A foreach elem segítségével egy objektumkollekciót járhatunk be. Többek között a következő típusú kollekciók járhatók be: java.util.collection, java.util.map implementációi (a var változó java.util.map.entry objektum lesz), tömbök (objektum vagy primitív elemek, a primitív elemek wrapper osztályokká lesznek átalakítva), Iterator, Enumeration implementációk, karaktersor (String), mely vesszővel elválasztott értékeket tartalmaz. (pl.: Monday, Tuesday, Wednesday, Thursday, Friday). 11 / 46 12 / 46

Feltételes elemek A korábbi (szkriptletes) példa így alakul: <c:foreach var="item" items="${sessionscope.cart.items}"> <tr> <td> ${item.quantity} </td> </tr> </c:foreach> Az if elem a test attribútumában található kifejezés értelmezésének eredményeképpen a törzsében levő tartalmat kiértékeli vagy sem. <c:if test="${empty param.add}"> </c:if> A choose elem feltételes blokkokat hajt végre a beágyazott when elemek által. Az első olyan when elem törzsét értelmezi, melynek a feltétele true. Ha egyik törzs feltétel sem true, akkor az otherwise elem törzse értékelődik ki (ha van ilyen). 13 / 46 14 / 46 Pl.: <c:choose> <c:when test="${customer.category == proba }"> </c:when> <c:when test="${customer.category == ismeros }"> </c:when> <c:when test="${customer.category == kedvenc }"> </c:when> <c:otherwise> </c:otherwise> </c:choose> az if-then-else a következőképpen szimulálható: <c:choose> <c:when test="${count == 0}"> Nincs egy találtat sem. </c:when> <c:otherwise> A találatok száma: </c:otherwise> </c:choose> ${count}. 15 / 46 16 / 46

URL elemek Az import elem segítségével URL alapján elérhetünk erőforrásokat, melyeknek tartalma befűzhető vagy feldolgozható a JSP-ben. Pl.: beolvasunk egy XML dokumentumot, aminek a tartalmát hozzárendeljük az xml nevű változóhoz, majd ezt felhasználjuk más elemekben: <c:import url="/books.xml" var="xml"/> <x:parse doc="${xml}" var="booklist" scope="application"/> A szessziókövetésnél szó volt róla, hogy egy alkalmazás át kell írja az URL-ket arra az esetre, ha a felhasználó kikapcsolja a sütiket (response.encodeurl()). Az url elem segítségével a JSP-ben található URL-k átíródnak. Ez az elem csak akkor fűzi hozzá a szesszió ID-t az URL-hez, ha a sütik ki vannak kapcsolva, egyébként nem módosítja az URL-t. Pl.: <c:url var="url" value="/catalog"> <c:param name="add" value="${bookid}"/> </c:url> <a href="${url}"></a> A param elem a jsp:param elemhez hasonlóan a többi URL elem törzsében használható, és kérés (request) paramétereket specifikál. A redirect elem egy HTTP átirányítást végez el. 17 / 46 18 / 46 Egyéb elemek A catch elem a JSP hibakezelés mellé egy kiegészítő mechanizmust ad. A fontos műveleteket nem kell egy catch elembe beágyazi, hanem hagyni kell, hogy továbbmenjenek a hibaoldalra. Kevésbé fontos hibákat egy catch elembe kell beágyazni, ezáltal a hiba nem jut el a hibaoldalig, hanem hamarabb le lesz kezelve. Az elkapott hiba a var változóban lesz tárolva, melynek hatóköre mindig az aktuális oldal. Ha a var nincs specifikálva, a hiba el lesz kapva, de nem lesz eltárolva egy változóban. Az out elem kiértékel egy kifejezést, majd az eredményt az aktuális JspWriter objektumba teszi: <c:out value="value" [escapexml="true false"] [default=""] /> Nemzetközivé tételt elősegítő (internationalization) elemkönyvtár JSTL elemeket határoz meg egy oldal nyelvspecifikus beálĺıtására, nyelvspecifikus üzenetek létrehozására, számok, pénznemek, dátumok, idő nyelfüggő formázására és beolvasására. A JSTL i18n elemek egy nyelvfüggő kontextust használnak, hogy a megfelelő adatot elérjék. Egy ilyen kontextus egy Locale és egy ResourceBundle instanciából áll. Mikor egy kérés jön, a JSTL automatikusan beálĺıtja a locale-t a kérés fejléce alapján és kiválasztja a helyes erőforrásfájlt felhasználva a JSTL elem paramétereként megadott alapnevet. 19 / 46 20 / 46

A Locale beálĺıtása Üzenetet megjelenítő (messaging) elemek A setlocale elem a kliens által a böngészőben specifikált locale felüĺırására használható. A requestencoding elem segítségével beálĺıthatjuk a kérés objektum karakter kódolását (character encoding), hogy helyesen dekódoljuk azon kérés paramétereket, melyek kódolása nem ISO-8859-1 Alapértelmezés szerint a JSTL érzékeli a böngésző nyelvbeálĺıtásait. (a kliens a böngészőbeálĺıtások segítségével meghatározhatja, hogy melyik nyelvet akarja használni) A message elem A message elem nyelvfüggő üzenetek megjelenítésére használható. Pl. <fmt:message key="choose"/> param elemekkel az üzenetnek további paramétereket adhatunk meg. 21 / 46 22 / 46 A setbundle és bundle elemek Formázó elemek Az fmt:setbundle és fmt:bundle elemek segítségével beálĺıthatók a nyelvhez kötött erőforrásfájlok. Az fmt:setbundle az erőforrásfájlt egy hatókörhöz rendelt változóba menti le. Az fmt:bundle egy adott elem törzsében használandó erőforrásfájlt álĺıt be. A JSTL több elemet biztosít nyelvfüggő adatok (számok, dátumok) feldolgozására és formázására. Ezek a következők: formatnumber formatdate parsedate parsenumber settimezone timezone 23 / 46 24 / 46

Saját elem fejlesztésének lépései Pl. <fmt:formatnumber value="${book.price}" type="currency"/> <jsp:usebean id="now" class="java.util.date"/> <jsp:setproperty name="now" property="time" value="${now.time +432000000}"/> <fmt:message key="shipdate"/> <fmt:formatdate value="${now}" type="date" datestyle="full"/> Pl. MVC elvre alapozó egyszerű web-alkalmazás korábbi példa átírva Egy saját elem fejlesztésének lépései: 1. Elemkezelő (tag handler) osztály implementálása 2. Elemkönyvtár leíró (tag library descriptor) létrehozása 3. Elem használata a továbbiakban: áttekintés: 3., 2., 1. sorrendben mvc2/index.jsp 25 / 46 26 / 46 3. Elem használata Ahhoz, hogy egy saját elemet egy JSP-ben használhassunk, deklarálni kell az elemkönyvtárat: <%@taglib prefix="tt" uri="uri"%> A prefix attribútum meghatározza azt a prefixet (előtagot), amelyik megkülönbözteti egy bizonyos elemkönyvtárban definiált elemeket a más könyvtárban definiált elemektől. Az uri attribútum megadja az URI-t, amely azonosítja az elemkönyvtár leíróját (TLD). A leíró fájlok kiterjesztése.tld. Ezek a TLD fájlok a következő helyeken lehetnek tárolva: a WEB-INF katalógusban vagy ennek egy alkatalógusában (főleg a sajátkezűleg írt elemek) JAR-ba csomagolt alkatalógusokban (a mások által előre megírt általánosan használható elemek) Egy TLD-re direkt vagy indirekt módon hivatkozhatunk: Név szerint (direkt módon): <%@taglib prefix="tlt" uri="/web-inf/iterator.tld"%> Logikai néven keresztül (indirekt módon): <%@taglib prefix="tlt" uri="/tlt"%> A TLD logikai név egy abszolút helyre való map-elését a web-alkalmazás leírójában (deployment descriptor) adhatjuk meg A /tlt URI-nak a /WEB-INF/tlds/iterator.tld felel meg. <taglib> <taglib-uri>tlt</taglib-uri> <taglib-location>/web-inf/tlds/iterator.tld </taglib-location> </taglib> Megj.: (JSP 2.0-tól) erre igazából nincs szükség, mivel a web-konténer megkeresi a.tld állományokat (a WEB-INF-ben, vagy ennek alkatalógusaiban, illetve a JAR állományokban) 27 / 46 28 / 46

2. Könyvtár leíró létrehozása Az URI lehet abszolút is: Például a Core JSTL könyvtár abszolút URI-ja a következő: Core: http://java.sun.com/jsp/jstl/core <%@taglib prefix="tlt" uri="http://java.sun.com/jsp/jstl/core"%> Ha az elemkönyvtárra indirekt módon hivatkozunk, akkor az uri értéke pontosan meg kell feleljen a TLD-ben deklarált taglib elembe ágyazott uri-elem értékének ahhoz, hogy A JSP konténer automatikusan megtalálja a TLD-t a korábban emĺıtett helyek valamelyikén. Fontosabb attribútumok a teljesség igénye nélkül: <taglib > (xsd sémaleíró és JSP verzió megadása) <tlib-version>ver</tlib-version> <short-name>first</short-name> <uri>unique URI</uri> <description>egyszeru peldakat tartalmazo elemkonyvtar</description> <tag> <name>hello</name> <tag-class>fully qualified type</tag-class> <tei-class>fully qualified type</tei-class> <body-content> empty tagdependent JSP scriptless </body-content> <description>koszon</description> 29 / 46 30 / 46 1. Saját elem definiálása <attribute> <name>attr1</name> <required>true false yes no</required> <rtexprvalue>true false yes no</rtexprvalue> <type>fully qualified type</type> </attribute> <variable> <name-from-attribute>id</name-from-attribute> <variable-class> fully qualified class </variable-class> <declare>true false</declare> <scope>nested AT BEGIN AT END </scope> </variable> </tag> </taglib> Az elemkezelő egy Java osztály, amely egy adott interfészt implementál. Egy elem lehet törzs nélküli törzset tartalmazó Törzs nélküli elem esetében (body-content = empty) vagy ha a törzset módosítás nélkül használjuk fel vagy egyáltalán nem használjuk fel, azaz ejtjük (body-content = scriptless vagy JSP), a Tag interfészt kell implementálni. Törzset tartalmazó és azt fel is dolgozó elem esetében (body-content=tagdependent scriptless JSP) pedig a BodyTag interfészt kell implementálni. 31 / 46 Egyszerűbb a TagSupport illetve a BodyTagSupport absztrakt osztályokat kibővíteni, hogy bizonyos standard metódusokat ne kelljen 32 / 46

Metódusok set-/get metódusok: setpagecontext: az elemet implementáló osztály a javax.servlet.jsp.pagecontext objektumon keresztül hozzáfér a JSP oldalhoz. Ebből az objektumból az összes többi implicit objektum kinyerhető (request, session és application) valamint természetesen az ezekhez rendelt hatókörben eltárolt attribútumok is a [set get]attribute metódusok által. get setparent: ha az elem beágyazott, a gyerek ezen keresztül fér hozzá a szülő elemhez. minden attribútumhoz tartoznia kell egy azonos nevű tulajdonságnak (elég ha setxxx metódus van), ezek az attribútumok aktuális értékeit kapják paraméterül. Ha engedélyezzük a TLD-ben a futásidejű paraméterek használatát, akkor az attribútumok értékeit eltároló setxxx metódusok paramétere konkrét típus is lehet (int, boolean, stb.), nem csak String. Megjegyzés: Az első két metódust a TagSupport illetve BodyTagSupport osztály is implementálja. A fenti setxxx metódusok meghívódnak rögtön az elemkezelő osztály példányosítása után, így a beálĺıtott értékek a getxxx metódusok segítségével vagy közvetlenül minden más metódusból elérhetők. További metódusok: típustól függően (Tag vagy BodyTag), azok a metódusok, amelyeken keresztül a JSP oldalból készült servlet az elemkezelő osztállyal kommunikál (lásd a következőket) 33 / 46 34 / 46 dostarttag: a JSP oldalból készített servletben ez hívódik meg a nyitóelem feldolgozásakor. a metódus törzsében felhasználhatjuk a pagecontext, a parent és az attribútumok értékeit. Az eljárás visszatérési értéke: Tag interfész implementálása esetén SKIP BODY vagy EVAL BODY INCLUDE lehet, az előbbi, alapértelmezés szerinti esetben a törzs nem kerül feldolgozásra, az utóbbi esetben viszont igen (de nem az elem hanem a JSP által). BodyTag interfész (törzs feldolgozása) esetén ezeken kívül lehet még: EVAL BODY BUFFERED vagy EVAL BODY AGAIN doendtag: a záró elem feldolgozásakor hívódik meg. Két lehetséges visszatérési értéke: EVAL PAGE, és SKIP PAGE. Az előbbi esetben, ami egyben az alapértelmezett is, folytatódik az oldal végrehajtása, az utóbbi esetben pedig befejeződik. release: ez akkor hívódik meg, ha a servlet már végzett az elem feldolgozásával. 35 / 46 36 / 46

Speciális BodyTag metódusok: doinitbody és a doafterbody A doinitbody egyszer, a törzs első kiértékelése előtt hívódik meg, a doafterbody viszont a törzs minden kiértékelése után meghívódik. (Ha nem volt törzs megadva, vagy a dostarttag metódus SKIP BODY értéket adott vissza, akkor persze egyik sem hívódik meg.) Mód van a törzs többszöri kiértékelésére: amennyiben a doafterbody EVAL BODY AGAIN értékkel tér vissza, akkor a törzs újra kiértékelődik, ha SKIP BODY-t ad vissza, akkor a törzs feldolgozása véget ér. (Az out implicit objektum értéke is visszaálĺıtódik a külső JspWriter-re.) get setbodycontent: A JSP oldalból készült servlet, mielőtt végrehajtaná a BodyTag típusú elemek törzsét, elmenti az implicit out objektum értékét, és egy BodyContent osztályú objektummal helyettesíti. (A BodyContent egy végtelen nagy pufferrel rendelkező JSPWriter) Ebbe írnak a saját elem törzsében lévő JSP elemek, és ez az, amit aztán a servlet a szülő elemkezelőnek átad. (A BodyTagSupport ezt a bodycontent változóban tárolja el.) A bodycontent tartalma már a kiértékelés eredménye, tehát nem tartalmaz esetleges saját elemeket vagy más JSP elemeket, hanem ezek kiértékelésének eredményét. 37 / 46 38 / 46 Szkriptváltozók bevezetése Azt már a saját elemkezelőnk döntheti el, hogy mit tesz a bodycontent tartalmával: lekérdezheti (getreader, getstring) módosíthatja kíırhatja a külső JSPWriter-re: bodycontent.writeout(getpreviousout()) vagy bodycontent.writeout(bodycontent.getenclosingwriter()) eldobhatja (clearbody) Példák: törzset fel nem dolgozó elemek: HelloTag.java (simple.jsp), HeadingTag.java (heading.jsp), DebugTag.java (debug.jsp), GreetingTag.java (repeat.jsp) törzset feldolgozó elemek: RepeatTag.java (repeat.jsp) Felmerül az igény arra, hogy valamilyen iterált típus (vektor, lista, sorozat stb.) elemein végiglépkedve egy listát vagy táblázatot jelenítsünk meg. A cél egy olyan saját elem készítése, ami annyiszor hajtja végre a törzsét, ahány feldolgozandó elem van, és a törzsében egy szkriptváltozón keresztül elérhetővé teszi az aktuális elemet. Szükség van tehát valami olyan módszerre, amellyel új szkriptváltozókat definiálhatunk, hasonlóan a standard jsp:usebean elemhez. 39 / 46 40 / 46

Nehézséget jelent ugyanakkor, hogy a JSP fordítónak már fordítási időben tudnia kell, hogy milyen nevű és típusú változókat akarunk bevezetni, hiszen az erre szolgáló programsorokat el kell helyeznie a JSP oldalból készülő servlet kódjában. Az erre vonatkozó információkat elhelyezhetjük a TLD variable elemében (kevésbé rugalmas, hardkódolt változó nevek), vagy egy külön osztályban (rugalmasabb, mivel az attribútumok alapján definiálhatjuk a változókat): egy, a TagExtraInfo-t kibővítő osztályban, ennek a nevét kell megadni a TLD teiclass elemében. A származtatáskor a getvariableinfo metódust kell felüldefiniálni, a JSP fordító ennek a meghívásával kérdezi le az új változók jellemzőit. Az eljárás paraméterül kapja a TagData típusú objektumot, melyen keresztül elérhetők az elem megadott attribútumainak értékei, amire szükség van, ha például az egyik attribútum értéke adja meg, hogy milyen néven is kell a változót létrehozni. A getvariableinfo visszatérési értéke VariableInfo objektumokat tartalmazó tömb kell legyen, ahol minden egyes VariableInfo egy új változó adatait tartalmazza. lásd pl. iterate.jsp, iteratetei.java, iteratetag.java 41 / 46 42 / 46 A VaribleInfo konstruktorának négy dolgot kell megadni: az új változó nevét osztályát azt, hogy tényleg új-e, vagy csak frissíteni kell az értékét a változó láthatóságát (VariableInfo.NESTED, VariableInfo.AT BEGIN vagy VariableInfo.AT END) Értékadás a változóknak: a pagecontext objektumon keresztül a page hatókörben (scope) tároljuk a változó neve mellé a beálĺıtandó értéket: pagecontext.setattribute(valtozonev, valtozoobjektum, PageContext.PAGE SCOPE); ahol a valtozoobjektum lehet pl. iterator.next() azaz egy lista következő elemét teszi be a page hatókörbe. Egymásbaágyazott elemek készítése A saját elemek együttműködésének egyik módja, hogy az egyik elem bevezet egy új szkriptváltozót, amit a másik elem felhasznál. Ez nem jelenti feltétlenül, hogy ezek az elemek egymásba kell legyenek ágyazva. Közvetlen kapcsolat nincs az elemek között. (Pl. az egyik elem előálĺıt egy listát, a másik a listát bejáró elem pedig a megfelelő formában kíırja azt.) 43 / 46 44 / 46

Az együttműködés másik módja az elemek egymásbaágyazása, ami az elemek közvetlenebb összetartozását feltételezi. Minden elemkezelő megkapja a JSP oldaltól a szülő elem osztályának referenciáját, ahol szülőnek azt az osztályt nevezik, aminek a törzsében az elem található. A Support osztályok ezt a referenciát, (ami lehet null is), eltárolják a parent osztályváltozóban. Az információátadás egyoldalú lehet csak, a gyerek meghívhatja a szülő metódusait, a szülő viszont nem tud a törzsében lévő elemekről. (Feldolgozhatja ugyan a törzsét karakterről karakterre, de ez igencsak körülményes... ) Arra sincs mód, hogy két gyerekelem közvetlenül elérje egymást, de a szülőn keresztül már megoszthatják az adataikat. A beágyazó elem megkeresésére a TagSupport osztály findancestorwithclass metódusa használható, (a beágyazó és a beágyazott elem közé ugyanis további saját elemek ékelődhetnek). Ez a parent értékéből kiindulva addig lépked felfelé a hierarchiában, amíg az adott osztályt meg nem találja. Példák if.jsp, IFTag.java, IfConditionTag.java, IfThenTag.java, IfElseTag.java: egymásbaágyazott elemek, melyek a szülő attribútumain keresztül kommunikálnak egymással repeat.jsp, RepeatTag.java, GreetingTag.java: egymásbaágyazott elemek, melyek nem kommunikálnak egymással 45 / 46 46 / 46