Szerver oldali Java programozás 2007-08/II. 1. óra
Elemkönyvtárak Elemkönyvtárak használata Saját elemkönyvtár készítése
[email protected]
Adatbázisok elérése
Témakörök Elemkönyvtárak használata Egyszerű elemek készítése Törzset tartalmazó elemek
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
2
Elemkönyvtárak • JSP oldalakban lehetőség van saját akció-elemek (tagek) készítésére. Ezek az elemek valójában programkódot reprezentálnak, ezzel elrejthetik a weboldal készítője elől a tényleges implementációt. • Mivel egy JSP oldalban számos új akció-elem definiálására szükség lehet, ezeket célszerű elemkönyvtárakba rendezni (custom tag library) • Így a webalkalmazásokban ténylegesen elválhat egymástól a kód és a prezentáció (így ezeket készítheti két különböző személy) • Elemkönyvtárak használata: – – – – –
szükséges osztályok elhelyezése (WEB-INF/classes) Tag Library Descriptor állomány elhelyezése a (WEB-INF) web.xml állomány módosítása (amennyiben szükséges) JSP oldal fejlécében TagLib azonosítása, prefix hozzárendelése saját elemek használata az oldalban
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
3
Tag Library Descriptor • TagLib – az elemkönyvtár általános jellemzői – – – – –
tlib-version – könyvtár verziószáma jsp-version – szükséges JSP verziószám short-name – rövid név description – elemkönyvtár leírása uri – egy nyilvános URI, ami egyértelműen azonosítja a könyvtárat
• Tag – elemenként a részletes jellemzők – – – – – – –
name – a tag neve, ezzel lehet majd rá hivatkozni a JSP oldalon tag-class – az elemkezelő Java osztály neve tei-class – kiegészítő információkat tartalmazó osztály body-content – elem törzse: tagdependent, JSP, empty description – rövid leírás variable – scriptváltozók megadása (nem tárgyaljuk) attribute – az elem egy attribútumának leírása • • • •
name – megnevezése required – kötelező-e megadni: true, false, yes, no type – attribútum típusa description – rövid leírás
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
4
Tag Library Descriptor példa
1.0 <short-name>arfolyam /WEB-INF/tlds/Arfolyam Arfolyam teszt.atvalto.Arfolyam scriptless valuta java.lang.String true Arfolyam.tld állomány http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
5
web.xml állomány módosítása • A web.xml állomány minden használni kívánt elemkönyvtárról tárolja az alábbi struktúrát: – taglib – egy új elemkönyvtár hozzáadása – taglib-uri – az elemkönyvtár azonosítója – taglib-location – az elemkönyvtárt leíró állomány pontos helye
• Egy példa: <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmln ... /WEB-INF/tlds/Arfolyam /WEB-INF/tlds/Arfolyam ...
• WEB-INF/tld-be helyett taglibek esetén elhagyható (JSP2.0) http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
6
Elemkönyvtár használata JSP oldalban • Minden elemkönyvtár használat előtt a JSP oldalon azonosítani kell az elemkönyvtárat az URI segítéségével, illetve egy (az oldalon belül) egyedi prefixet kell hozzárendelni • Például: <%@ taglib prefix="arfolyam" uri="/WEB-INF/tlds/Arfolyam" %>
• A későbbiekben az elemkönyvtárban található saját akció elemek a <prefix:akciónév> módon elérhetők • Például: <arfolyam:Atvaltas arfolyam:Atvaltas osszeg="1000" valuta="EUR"> Átváltás után visszajár: <%= atvaltottosszeg %>
/arfolyam:MindenreValto> arfolyam:MindenreValto
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
7
Adatbázisok elérése
Témakörök Elemkönyvtárak használata Egyszerű elemek készítése Törzset tartalmazó elemek
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
8
Elemkezelő hierarchia • A hierarchia alapvető osztályait a javax.servlet.jsp.tagext csomag tartalmazza • Tag interfész – törzs nélküli (vagy nem feldolgozandó törzset tartalmazó) elem megvalósításához – tartalmazza a saját tag-ek alapvető metódusait
• IterationTag interfész – a Tag leszármazottja – olyan elem, amelyik a törzsében lévő kódot többször is végrehajthatja (de a kód értelmezését nem vállalja, így lehet ott akár scriptlet is) – segítő osztály: TagSupport
• BodyTag interfész – az IterationTag leszármazottja – a törzsét önmaga dolgozza fel – segítő osztály: BodyTagSupport
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
9
Tag interfész megvalósítása • Külső hivatkozások kezelése – void setParent(Tag t)
A JSP oldal hívja meg a tag létrehozásakor, ezzel van lehetőség a tag szülőjének referenciáját eltárolni
– Tag getParent()
A fenti objektum lekérdezése
– void setPageContext(PageContext pc) A PageContext objektum eltárolása. Ezen keresztül lehet hozzáférni a kérés/környezet további adataihoz – saját tulajdonságok
• Tag életciklusa – – – – –
objektum létrehozása tulajdonságok beállítása doStartTag() metódus doEndTag() metódus release() metódus
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
10
Tag interfész megvalósítása • int doStartTag() throws JspException – ez a metódus hívódik meg a nyitó tag feldolgozásakor (garantáltan a setParent és a setPageContext hívása után) – lehetséges visszatérési értékei: • Tag.EVAL_BODY_INCLUDE – a törzset fel kell dolgozni • Tag.SKIP_BODY – a törzset nem kell feldolgozni • BodyTag.EVAL_BODY_BUFFERED – lásd később
• int doEndTag() throws JspException – ez a metódus hívódik meg a záró tag feldolgozásakor – lehetséges visszatérési értékei: • Tag.EVAL_PAGE – az oldal feldolgozása folytatódhat • Tag.SKIP_PAGE – az oldal további részét nem kell feldolgozni
– A SKIP_PAGE nem az egész kérést fejezi be, csak a megadott JSP oldal feldolgozását (lehet, hogy pl. include hívás volt)
• void release() – a tag felszabadításakor hívódik meg
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
11
IterationTag interfész megvalósítása • Működése hasonló a Tag interfésznél látotthoz, annyi különbséggel, hogy lehetőséget ad a törzs többszöri feldolgozására is • Ehhez kiegészíti a Tag által definiált interfészt egy új metódussal, amely minden törzsfeldolgozás után lefut, és lehetőséget nyújt a továbblépésre, illetve az újboli feldolgozásra
• int doAfterBody() throws JspException – minden törzsfeldolgozás után lefut – visszatérési értéke lehet: • BodyTag.EVAL_BODY_TAG az elem törzsét újból fel kell dolgozni • Tag.SKIP_BODY az elem törzsét nem kell többször feldolgozni, a JSP oldal feldolgozása továbblép
• A módosult életciklus az ábrán http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
12
Script változók használata • Az IterationTag interfész használatakor gyakran szükség van arra, hogy a többször megismételt törzsben bizonyos helyen más-más kód jelenjen meg • Ennek talán a legjobban használható megvalósítása, ha a törzs belsejében tudnánk olyan „változókra” hivatkozni, amelyeknek az IterationTag metódusaiban adunk értéket • Egy ilyen script változó létrehozásának lépései: – Tag elemen belül Variable elem létrehozása az alábbiakkal: • • • • • •
name-given – a létrehozandó script változó neve name-from-attribute – ha a változó neve egy attribútum értéke variable-class – a változó típusa (alapértelmezett a String) declare – kell-e a változót deklarálni scope – változó hatóköre (NESTED, AT_BEGIN, AT_END) description – változó rövid leírása
– IterationTag osztályon belül értékadás az alábbi formában: pageContext.setAttribute(név, érték, PageContext.PAGE_SCOPE); – JSP oldalban változó értékére hivatkozás a megszokott módon: <= scriptváltozóneve > http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
13
Adatbázisok elérése
Témakörök Elemkönyvtárak használata Egyszerű elemek készítése Törzset tartalmazó elemek
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
14
BodyTag interfész megvalósítása • int doStartTag() throws JspException – visszatérési értéke lehet EVAL_BODY_TAG is – ebben az esetben, a JSP oldal a törzs végrehajtása előtt azt elhelyezi egy BodyContent típusú objektumban (ez a JSPWriter leszármazottja)
• void setBodyContent(BodyContent b) – a fent említett objektumot ezen a metóduson keresztül kapja meg a saját akcióelem, itt célszerű eltárolni
• void doInitBody() throws JspException – a setBodyContent hívása után, még a törzs feldolgozása előtt hívodik meg – ha szükséges módosíthatja a törzset
• void doAfterBody() throws JspException • int doEndTag() throws JspException http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
az eddig megismerteknek megfelelően használhatók 15
Nem tárgyalt témakörök • Egymásbaágyazott elemek lehetőségei – minden tag az inicializáláskor megkapja az őt tartalmazó „szülő” referenciáját, ezen keresztül fel lehet térképezni a teljes oldal szerkezetét – az egyes elemek szkriptváltozókon keresztül is kommunikálhatnak egymással
• Elemkönyvtárak validálása – lehetőség van a tag-ek adatait ellenőrző osztályok létrehozására – TagExtraInfo osztály metódusai – TagLibraryValidator
• Egyéb osztályok – SimpleTag – SimpleTagSupport – stb.
• Konkrét megvalósítások – JSF stb.
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
16
• http://java.sun.com/javaee/5/docs/api/
http://nik.bmf.hu/szoja
Szerver oldali Java programozás 2007-2008/II.
17