Informatikai Navigátor Érdekes Java Programozói könyvtárak



Hasonló dokumentumok
Programozási nyelvek Java

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

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

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

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

Programozási nyelvek Java

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

117. AA Megoldó Alfréd AA 117.

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

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

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Bevezető. Servlet alapgondolatok

C#, OOP. Osztályok tervezése C#-ban

Programozási nyelvek JAVA EA+GY 1. gyakolat

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Programozási nyelvek Java

JNDI - alapok. Java Naming and Directory Interface

Programozási nyelvek Java

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

XML sémanyelvek Jeszenszky, Péter

Osztályok. 4. gyakorlat

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

Segédanyag: Java alkalmazások gyakorlat

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

Metamodellezés. Simon Balázs BME IIT, 2011.

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

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

3. SZÁMÚ MELLÉKLET. Elektronikus számla - XML definíciók. a) Számla. 1. ábra Számla

SQLServer. DB Recovery modes

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?

Modellinformációk szabványos cseréje. Papp Ágnes, Debreceni Egyetem EFK

A Java EE 5 plattform

Szoftvertechnológia alapjai Java előadások

Általános nyomtatványok xml szerkezete. (v1.3)

Generikus Típusok, Kollekciók

3. SZÁMÚ MELLÉKLET. Elektronikus számla - XML definíciók. a) Számla. 1. ábra Számla

Programozási alapismeretek 4.

Gépi tanulás a Rapidminer programmal. Stubendek Attila

XmlGessünk 13. rész - Az XML Schema II.

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

Javadoc. Dokumentációs megjegyzés (2) Dokumentációs megjegyzés (1) Dokumentációs megjegyzés felépítése

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Adatbázis-kezelés ODBC driverrel

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

XML adatkezelés. 5. témakör. Nincs explicit névtér kijelölve. <?xml version="1.0"?> <xs:schema xmlns:xs="

Segédanyag: Java alkalmazások gyakorlat

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

C# osztályok. Krizsán Zoltán

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

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

BME MOGI Gépészeti informatika 8.

Objektumorientált programozás C# nyelven

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

1. Alapok. Programozás II

Java programozási nyelv 10. rész Input/output kezelés

OOP: Java 4.Gy: Java osztályok

Web-technológia PHP-vel

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

OOP #14 (referencia-elv)

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

Informatika terméktervezőknek

Collections. Összetett adatstruktúrák

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

3. Osztályok II. Programozás II

Kalapácsvetés 2016 szöveges

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

Cikktípusok készítése a Xarayában

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

5. téma XML DB. Az adatkezelés és XML kapcsolata. Miért fontos az XML használata az adatbázis kezelésben?

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Java I. A Java programozási nyelv

Java Programozás 11. Ea: MVC modell

Előszó. Bevezetés. Java objektumok leképzése relációs adatbázisokra OJB-vel Viczián István Viczián István

Programozási nyelvek II.: JAVA

Java és web programozás

C++ programozási nyelv Konstruktorok-destruktorok

Java és web programozás

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

OOP: Java 8.Gy: Gyakorlás

Programozási technológia

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

JAVA SE/ME tanfolyam tematika

és az instanceof operátor

Java gyakorlat feladatai e s megolda sai ( )

Osztály és objektum fogalma

PHP5 Új generáció (2. rész)

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

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

Bevezetés a programozásba I.

Bánsághi Anna

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

SZOFTVERES SZEMLÉLTETÉS A MESTERSÉGES INTELLIGENCIA OKTATÁSÁBAN _ Jeszenszky Péter Debreceni Egyetem, Informatikai Kar jeszenszky.peter@inf.unideb.

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Átírás:

2013. Július Informatikai Navigátor Érdekes Java Programozói könyvtárak Gondolatok a szoftverek használatáról és fejlesztéséről 9. szám

Informatikai Navigator Gondolatok a szoftverek használatáról és fejlesztéséről Tartalomjegyzék 1. JAXB - A Java és XML összekötése 3 2. BeanShell - Könnyűsúlyú scriptek Java nyelvbe ágyazva 32 3. Apache Commons - BeanUtils 44 4. Apache Commons - Lang 53 5. Joda.org - Programozás dátumokkal és időkkel 67 6. Apache Commons - Virtual File System 78 7. Apache Commons - FileUpload 87 8. Apache Commons - IO 94 9. Az Active Directory elérése 104 Főszerkesztő: Nyiri Imre (imre.nyiri@gmail.com) 2

JAXB - A Java és XML összekötése 1. JAXB - A Java és XML összekötése Az XML adatok és a Java objektumok közötti leképzés fontos eszköze egy korszerű fejlesztői környezetnek. Sok olyan Java API létezik, amelyek XML-t kezelnek, de itt most az a kérdés, hogy egy XML-ben tárolt adatszerkezetet hogyan konvertálunk oda-vissza egy alkalmas Java objektumba. Ezt oldja meg a JDK 1.6 óta beépített részként működő JAXB könyvtár. A JAXB 1 az XML adatok és a Java objektumok közötti leképzést valósítja meg, aminek nyilvánvaló előnye az, hogy az XML adatstruktúrákat Java objektumként tudjuk kezelni és fordítva. A Java sok helyen felhasználja ezt a beépített szolgáltatást, erre jó példa az JAX-WS webservice technológia XML Java leképzése. A leképzés azt jelenti, hogy a Java objektum adattagjait (vagy más néven a property-ket) leképezzük (ezt nevezzük binding-nak) az XML tagekre. Ezt a feladatot a JAXB kifinomultan és rugalmasan képes ellátni. A fejlesztést végezhetjük a Java osztályokból kiindulva, de lehetséges az is, hogy az XML sémák alapján generáljuk a befogadó objektumok osztályait. A következő egyszerű példa az alapszintű használatba vezet be. Bevezető példa A Java osztályok Legyen a célunk az, hogy az 1-1. Programlistán látható Employee class objektumait XML formátumra alakítsuk (perzisztáljuk). Amint látjuk ez az osztály egy egyszerű JavaBean (más szavakkal POJO 2 ), aminek van néhány adatmezője, köztük az egyik az Address class maga is egy osztály, amit az 1-2. Programlista mutat. Mindez igazán egyszerű, de most szeretnénk egy olyan XML modellt rendelni ehhez, amibe egy Employee példány elmenthető. A JAXB 2.0 óta mindez úgy valósítható meg, hogy a Java 1 JAXB=Java API for XML Binding 2 POJO=Plain Old Java Object osztályt annotáljuk a JAXB-os @ -okkal. Tekintettel arra, hogy az Employee class reprezentálja az egész objektum kezdetét, így az őt leíró XML gyökérelemének is ez felel meg. Ezt reprezentálja a @XmlRootElement, aminek paraméterében még azt is megadtuk, hogy ez a gyökér XML tag az org.ceg.test XML névtérben lesz. Az @XmlType annotáció azt mondja meg, hogy ez a class egyben egy XSD-beli típusnév is lenne, amit láthatunk is, amennyiben XML sémát szeretnénk a későbbiekben legenerálni. A névteret itt is meg kell adni. // 1 1. Programlista : Employee. j a v a package org. c s. t e s t ; import javax. xml. bind. annotation. XmlElement ; import javax. xml. bind. annotation. XmlRootElement ; import javax. xml. bind. annotation. XmlType ; @XmlRootElement ( namespace = " org. ceg. t e s t " ) @XmlType( namespace = " org. ceg. t e s t " ) public class Employee @XmlElement Address a d d r e s s ; @XmlElement ( namespace = " org. ceg. t e s t " ) S t r i n g name ; @XmlElement S t r i n g sex ; @XmlElement int kor ; @XmlElement double s u l y ; Most az Employee mindegyik adattagját elláttuk @XmlElement jelzéssel, ami azt jelenti, 3

JAXB - A Java és XML összekötése hogy ezen mezők mindegyikének egy-egy XML tag-et szeretnénk megfeleltetni. A tag neve a bean property neve lesz, de egy esetleges name annotáció attribútum megadással explicit is megadhatjuk, hogy mi legyen az adott XML címke neve. Esetünkben most csak a namespace paramétert használjuk próbaként, hagyjuk, hogy az XML tag nevek automatikusan képződjenek a class adatmezők nevéből. Az Address class annotálása ezek után már érthető. // 1 2. Programlista : Address. j a v a package org. c s. t e s t ; import javax. xml. bind. annotation. XmlElement ; import javax. xml. bind. annotation. XmlType ; @XmlType( namespace = " org. ceg. t e s t " ) public class Address @XmlElement S t r i n g s t r e e t ; @XmlElement int housenumber ; Az eddigiekben odáig jutottunk, hogy az Employee és Address osztályokat elláttuk JAXB annotációkkal, ezzel megteremtettük a lehetőségét annak, hogy kipróbáljuk a JAXB Java Object XML leképzési lehetőségét, amit marshallingnak nevezünk. Nézzük is meg a használatát! Az XML előállítása (marshaller) Az 1-3. Programlista a JAXB használatát szemlélteti, feladata az, hogy egy 15-24 sorok között előállított e Employee objektumot XML fájlba mentse. Ehhez először a 26. sorban egy jaxb- Context objektum előállítása szükséges, amely az Employee class mentén ad egy kezelő kontextust, ezért volt szükséges ezt a newinstance() metódusban paraméterül átadni. A 27. sorban egy általános eljárással lekérünk a kontextustól egy jaxbmarshaller objektumot, ami a tényleges Java Object XML átalakítást fogja végezni. A 28. sor nem kötelező lépés, de mi azt szeretnénk, hogy az előállított XML szépen formázva nézzen ki. A 30. sor egy xmlfile nevű File objektum, ahova majd az eredményül kapott XML-t mentjük. Végül a 30. sorban elvégezzük a feladatot, azaz az e objektumot perzisztáljuk az xmlfile helyre. 1 // 1 3. Programlista : TestJAXBMarshaller. j a v a 2 3 package org. c s. t e s t ; 4 5 import java. i o. F i l e ; 6 import javax. xml. bind. JAXBContext ; 7 import javax. xml. bind. JAXBException ; 8 import javax. xml. bind. M a r s h a l l e r ; 9 10 public class TestJAXBMarshaller 11 12 public s t a t i c void main ( S t r i n g [ ] a r g s ) 13 throws JAXBException 14 15 Address a = new Address ( ) ; 16 a. housenumber = 1 2 ; 17 a. s t r e e t = " Váci út " ; 18 19 Employee e = new Employee ( ) ; 20 e. a d d r e s s = a ; 21 e. kor = 3 2 ; 22 e. name = "Alma Ferenc " ; 23 e. sex = " f é r f i " ; 24 e. s u l y = 8 8 ; 25 26 JAXBContext jaxbcontext = JAXBContext. newinstance ( Employee. class ) ; 27 M a r s h a l l e r j a x b M a r s h a l l e r = jaxbcontext. c r e a t e M a r s h a l l e r ( ) ; 4

JAXB - A Java és XML összekötése 28 j a x b M a r s h a l l e r. s e t P r o p e r t y ( M a r s h a l l e r.jaxb_formatted_output, Boolean.TRUE) ; 29 F i l e xmlfile = new F i l e ( "/home/ t a n u l a s /xml/employee. xml" ) ; 30 j a x b M a r s h a l l e r. marshal ( e, xmlfile ) ; 31 32 A program lefuttatása után az 1-4. Programlista mutatja a legyártott Employee.xml fájl tartalmát. Az alábbiakat javasoljuk megfigyelni: A class nevek alapértelmezetten kisbetűvel kezdődnek. Az adatmező nevek teljesen megmaradnak. Az XML névtér minden olyan tag-hez bekerült, ahol ezt kértük a @ -ok megadásánál. rendelkező objektumba pakoljuk az XML outputot, ilyen lehet például a StringWriter class, aminek a használatát a 1-5. Programlistáról tanulmányozhatjuk. Ekkor a marshal() metódus a writer objektumba teszi az eredményt, ahonnan azt String vagy StringBuffer objektumként is lekérhetjük. // 1 5. Programlista : S t r i n g W r i t e r S t r i n g W r i t e r w r i t e r = new S t r i n g W r i t e r ( ) ; j a x b M a r s h a l l e r. marshal ( e, w r i t e r ) ; S t r i n g data = w r i t e r. t o S t r i n g ( ) ; S t r i n g B u f f e r d a t a B u f f e r = w r i t e r. g e t B u f f e r ( ) ; // 1 4. P r o g r a m l i s t a : Employee. xml <?xml version=" 1. 0 " encoding="utf 8" standalone=" yes "? > <n s 2 : e m p l o y e e x m l n s : n s 2=" org. ceg. t e s t "> <a d d r e s s> < s t r e e t>váci út</ s t r e e t> <housenumber>12</ housenumber> </ a d d r e s s> <ns2:name>alma Ferenc</ ns2:name> <s e x> f é r f i</ s e x> <kor>32</ kor> <s u l y>8 8. 0</ s u l y> </ n s 2 :employee> Az esetek jelentős részénél nem mindig fájlba szeretnénk tenni az előállított XML-t, ezért a marshal() metódusnak is több alakja van. Tipikus használat, hogy egy Writer interface-szel Az XML visszaolvasása (unmarshaller) Most végezzük el a fordított feladatot, azaz írjunk egy olyan JAXB alapú programot, ami az XML Java Object beolvasást (unmarshalling) valósítja meg. Mindezt végezzük el a most előállított Employee.xml fájlra. Amennyiben nem lenne megfelelően @ -olt (azaz szebben fogalmazva: annotált) befogadó Java class, akkor azt el kéne készítenünk, de ezek már itt vannak: Emloyee, Address. A feladat megoldását az 1-6. Programlista mutatja. 1 // 1 6. Programlista : TestJAXBUnmarshaller. j a v a 2 3 package org. c s. t e s t ; 4 5 import java. i o. F i l e ; 6 import javax. xml. bind. JAXBContext ; 7 import javax. xml. bind. JAXBException ; 8 import javax. xml. bind. Unmarshaller ; 9 10 public class TestJAXBUnmarshaller 11 12 public s t a t i c void main ( S t r i n g [ ] a r g s ) 13 throws JAXBException 14 15 JAXBContext jaxbcontext = JAXBContext. newinstance ( Employee. class ) ; 16 Unmarshaller jaxbunmarshaller = jaxbcontext. c r e a t e U n m a r s h a l l e r ( ) ; 17 F i l e xmlfile = new F i l e ( "/home/ t a n u l a s /xml/employee. xml" ) ; 18 Employee e = ( Employee ) jaxbunmarshaller. unmarshal ( xmlfile ) ; 5

JAXB - A Java és XML összekötése 19 System. out. p r i n t l n ( e. name ) ; 20 System. out. p r i n t l n ( e. a d d r e s s. s t r e e t ) ; 21 22 A 15. sorban a már ismert módon egy JAXB- Context objektumot készítünk, amiben csak az Employee class játszik szerepet. Ezt azért emeltük most ki, mert általában több osztály is megadható lenne a gyártómetódusnak, erre majd a későbbiekben mutatunk példát. A 16. sorban természetesen most egy Unmarshaller objektumot kérünk le, hogy azt a 17. sorban megadott fájlra működtessük. Magát a beolvasást a 18. sor unmarshal() metódusa végzi, amelynek használatában nincs semmi különleges. Az utolsó 2 sor csak tesztelésként kiírja a képernyőre az XML fájlból létrehozott objektum 2 mezőjének az értékét. Az XML Java Object átalakításnál is gyakori eset, amikor nem fájlból érkezik az input XML, ezért az unmarshal() metódusnak is sok alakja van. A gyakorlatban talán az egyik leghasznosabb esetet mutatja az 1-7. Programlista, ahol egy Java String objektumban van az XML, amit egy StringReader objektum közbeiktatásával már át is adhatunk a metódusnak. // 1 7. Programlista : StringReader S t r i n g xmlstring = beolvasfromxmlfile ( ) ; StringReader r e a d e r = new StringReader ( xmlstring ) ; Employee em = ( Employee ) jaxbunmarshaller. unmarshal ( r e a d e r ) ; Az XML séma (XSD) előállítása Alapvetően fontos az XML világban, hogy annak a sémáját is lehetőleg birtokoljuk, így annak előállításához a JAXB a schemagen parancsot biztosítja, ami a JDK része. Amennyiben a java/javac elérhető, úgy ez a parancs is rendelkezésre áll. Használata egyszerű, mindössze meg kell adnunk azt a Java forrásfájlt, amiben egy JAXB annotált class található. Az Employee class-ra esetünkben ez a parancs futtatható: schemagen cp / opt / netbeans / myprojects / TestProjects / JavaTest / s r c / opt / n e t b e a n s / m y p r o j e c t s / T e s t P r o j e c t s / JavaTest / s r c / org / c s / t e s t / Employee. j a v a A -cp kapcsolót azért adtuk meg, hogy a beágyazott Address osztályt is megtalálja a parancs, hiszen ez a séma része kell legyen. A parancs lefutása után az 1-8. Programlista által tartalmazott sémát kapjuk meg. 1 // 1 8. P r o g r a m l i s t a : Employee XML séma 2 3 <?xml version=" 1. 0 " encoding="utf 8" standalone=" yes "?> 4 <x s:schema version=" 1. 0 " targetnamespace=" org. ceg. t e s t " x m l n s : t n s=" org. ceg. t e s t " x m l n s : x s=" h t t p : //www. w3. org /2001/XMLSchema"> 5 6 <xs: element name=" employee " type=" tns: employee "/> 7 8 <xs:complextype name=" employee "> 9 <x s : s e q u e n c e> 10 <x s : e l e m e n t name=" a d d r e s s " type=" t n s : a d d r e s s " minoccurs="0"/> 11 <x s : e l e m e n t name="name" type=" x s : s t r i n g " form=" q u a l i f i e d " minoccurs="0"/> 12 <x s : e l e m e n t name=" s e x " type=" x s : s t r i n g " minoccurs="0"/> 13 <x s : e l e m e n t name=" kor " type=" x s : i n t "/> 14 <xs: element name=" suly " type=" xs: double "/> 15 </ x s : s e q u e n c e> 16 </ xs:complextype> 17 18 <xs:complextype name=" address "> 19 <x s : s e q u e n c e> 20 <x s : e l e m e n t name=" s t r e e t " type=" x s : s t r i n g " minoccurs="0"/> 21 <xs: element name="housenumber " type=" x s : i n t "/> 22 </ x s : s e q u e n c e> 23 </ xs:complextype> 24 </ x s :schema> 6

JAXB - A Java és XML összekötése Ránézésre tetszetős, az XSD típusok szépen leképződtek a megfelelő Java típusokról. A szerkezete is megfelelő. A 11. sor form="qualified" jelzése azt jelenti, hogy ez a tag a targetnamespace-ben (org.ceg.test) van. Az address complextype a várt módon, külön nevesítve megtalálható és a 10. sorban korrekt módon került használatra. Java osztályok generálása XML sémából A gyakorlatban az is sokszor előfordul, hogy az XSD már rendelkezésünkre áll. Nagyon sok munkát jelentene a megfelelő befogadó Java osztály létrehozása és JAXB @ -ok elhelyezése, de szerencsére a JAXB erre is tartalmaz egy JDK parancsot, aminek a neve xjc. A sémák általában valamilyen szabvány részeként állnak rendelkezésünkre, például: UBL (Universal Business Language), ebxml, OFX (Open Financial Exchange), de az is lehet, hogy a rendszerek közötti kommunikáció egy sémával, platformfüggetlen módon volt csak definiálható, ami nagy előny. Az Employee class alapján generált séma felhasználásával generáljuk le a Java osztályokat, azaz tegyünk úgy mintha azok még nem léteznének: x j c Employee. xsd Az eredményt az 1-9., 1-10. és 1-11. Programlisták tartalmazzák. 1 // 1 9. Programlista : Az x j c á l t a l g e n e r á l t Address o s z t á l y 2 3 // 4 // This f i l e was g e n e r a ted by t h e JavaTM A r c h i t e c t u r e f o r XML Binding (JAXB) Reference Implementation, v2.2.4 2 5 // See <a h r e f="h t t p :// j a v a. sun. com/xml/ j a x b">h t t p :// j a v a. sun. com/xml/ jaxb </a> 6 // Any m o d i f i c a t i o n s to t h i s f i l e w i l l be l o s t upon r e c o m p i l a t i o n o f t h e source schema. 7 // Generated on : 2013.03.19 at 0 6 : 4 9 : 0 4 PM GMT 8 // 9 package t e s t. ceg. org ; 10 11 import javax. xml. bind. annotation. XmlAccessType ; 12 import javax. xml. bind. annotation. XmlAccessorType ; 13 import javax. xml. bind. annotation. XmlType ; 14 15 / 16 <p>java c l a s s f o r address complex t y p e. 17 18 <p>the f o l l o w i n g schema fragment s p e c i f i e s t h e e x p e c t e d c o n t e n t contained 19 w i t h i n t h i s c l a s s. 20 21 <pre> 22 & l t ; complextype name="address"> 23 & l t ; complexcontent> 24 &l t ; r e s t r i c t i o n base=" h t t p ://www. w3. org /2001/XMLSchemaanyType"> 25 &l t ; sequence> 26 &l t ; element name=" s t r e e t " t y p e =" h t t p ://www. w3. org /2001/XMLSchema s t r i n g " minoccurs ="0"/> 27 &l t ; element name="housenumber" t y p e=" h t t p ://www. w3. org /2001/XMLSchema i n t "/> 28 &l t ; / sequence> 29 &l t ; / r e s t r i c t i o n > 30 &l t ; / complexcontent> 31 &l t ; / complextype> 32 </pre> 33 34 35 / 36 @XmlAccessorType ( XmlAccessType. FIELD) 37 @XmlType( name = " a d d r e s s ", proporder = 38 7

JAXB - A Java és XML összekötése 39 " s t r e e t ", 40 " housenumber" 41 ) 42 public class Address 43 44 45 protected S t r i n g s t r e e t ; 46 protected int housenumber ; 47 48 / 49 Gets t h e v a l u e o f t h e s t r e e t p r o p e r t y. 50 51 @return p o s s i b l e o b j e c t i s @link S t r i n g 52 53 / 54 public S t r i n g g e t S t r e e t ( ) 55 56 return s t r e e t ; 57 58 59 / 60 S e t s t h e v a l u e o f t h e s t r e e t p r o p e r t y. 61 62 @param v a l u e a l l o w e d o b j e c t i s @link S t r i n g 63 64 / 65 public void s e t S t r e e t ( S t r i n g value ) 66 67 this. s t r e e t = value ; 68 69 70 / 71 Gets t h e v a l u e o f t h e housenumber p r o p e r t y. 72 73 / 74 public int gethousenumber ( ) 75 76 return housenumber ; 77 78 79 / 80 S e t s t h e v a l u e o f t h e housenumber p r o p e r t y. 81 82 / 83 public void sethousenumber ( int value ) 84 85 this. housenumber = value ; 86 87 1 // 1 10. Programlista : Az x j c á l t a l g e n e r á l t Employee o s z t á l y 2 3 // 4 // This f i l e was g e n e r a ted by t h e JavaTM A r c h i t e c t u r e f o r XML Binding (JAXB) Reference Implementation, v2.2.4 2 5 // See <a h r e f="h t t p :// j a v a. sun. com/xml/ j a x b">h t t p :// j a v a. sun. com/xml/ jaxb </a> 6 // Any m o d i f i c a t i o n s to t h i s f i l e w i l l be l o s t upon r e c o m p i l a t i o n o f t h e source schema. 7 // Generated on : 2013.03.19 at 0 6 : 4 9 : 0 4 PM GMT 8 // 9 package t e s t. ceg. org ; 10 11 import javax. xml. bind. annotation. XmlAccessType ; 12 import javax. xml. bind. annotation. XmlAccessorType ; 13 import javax. xml. bind. annotation. XmlElement ; 14 import javax. xml. bind. annotation. XmlRootElement ; 8

JAXB - A Java és XML összekötése 15 import javax. xml. bind. annotation. XmlType ; 16 17 / 18 <p>java c l a s s f o r employee complex t y p e. 19 20 <p>the f o l l o w i n g schema fragment s p e c i f i e s t h e e x p e c t e d c o n t e n t contained 21 w i t h i n t h i s c l a s s. 22 23 <pre> 24 & l t ; complextype name="employee"> 25 & l t ; complexcontent> 26 &l t ; r e s t r i c t i o n base=" h t t p ://www. w3. org /2001/XMLSchemaanyType"> 27 &l t ; sequence> 28 &l t ; element name="address " t y p e="org. ceg. t e s t address " minoccurs="0"/> 29 &l t ; element name="name" t y p e=" h t t p ://www. w3. org /2001/XMLSchema s t r i n g " minoccurs="0" form=" q u a l i f i e d "/> 30 &l t ; element name="sex " t y p e=" h t t p ://www. w3. org /2001/XMLSchema s t r i n g " minoccurs ="0"/> 31 &l t ; element name="kor " t y p e=" h t t p ://www. w3. org /2001/XMLSchema i n t "/> 32 &l t ; element name="s u l y " t y p e=" h t t p ://www. w3. org /2001/XMLSchema d o u b l e "/> 33 &l t ; / sequence> 34 &l t ; / r e s t r i c t i o n > 35 &l t ; / complexcontent> 36 &l t ; / complextype> 37 </pre> 38 39 40 / 41 @XmlRootElement ( namespace = " org. ceg. t e s t " ) 42 @XmlAccessorType ( XmlAccessType. FIELD) 43 @XmlType( name = " employee ", proporder = 44 45 " a d d r e s s ", 46 "name", 47 " sex ", 48 " kor ", 49 " s u l y " 50 ) 51 public class Employee 52 53 54 protected Address a d d r e s s ; 55 @XmlElement ( namespace = " org. ceg. t e s t " ) 56 protected S t r i n g name ; 57 protected S t r i n g sex ; 58 protected int kor ; 59 protected double s u l y ; 60 61 / 62 Gets t h e v a l u e o f t h e address p r o p e r t y. 63 64 @return p o s s i b l e o b j e c t i s @link Address 65 66 / 67 public Address getaddress ( ) 68 69 return a d d r e s s ; 70 71 72 / 73 S e t s t h e v a l u e o f t h e address p r o p e r t y. 74 75 @param v a l u e a l l o w e d o b j e c t i s @link Address 76 77 / 9

JAXB - A Java és XML összekötése 78 public void setaddress ( Address value ) 79 80 this. a d d r e s s = value ; 81 82 83 / 84 Gets t h e v a l u e o f t h e name p r o p e r t y. 85 86 @return p o s s i b l e o b j e c t i s @link S t r i n g 87 88 / 89 public S t r i n g getname ( ) 90 91 return name ; 92 93 94 / 95 S e t s t h e v a l u e o f t h e name p r o p e r t y. 96 97 @param v a l u e a l l o w e d o b j e c t i s @link S t r i n g 98 99 / 100 public void setname ( S t r i n g value ) 101 102 this. name = value ; 103 104 105 / 106 Gets t h e v a l u e o f t h e sex p r o p e r t y. 107 108 @return p o s s i b l e o b j e c t i s @link S t r i n g 109 110 / 111 public S t r i n g getsex ( ) 112 113 return sex ; 114 115 116 / 117 S e t s t h e v a l u e o f t h e sex p r o p e r t y. 118 119 @param v a l u e a l l o w e d o b j e c t i s @link S t r i n g 120 121 / 122 public void s e t S e x ( S t r i n g value ) 123 124 this. sex = value ; 125 126 127 / 128 Gets t h e v a l u e o f t h e kor p r o p e r t y. 129 130 / 131 public int getkor ( ) 132 133 return kor ; 134 135 136 / 137 S e t s t h e v a l u e o f t h e kor p r o p e r t y. 138 139 / 140 public void setkor ( int value ) 141 142 this. kor = value ; 10

JAXB - A Java és XML összekötése 143 144 145 / 146 Gets t h e v a l u e o f t h e s u l y p r o p e r t y. 147 148 / 149 public double g e t S u l y ( ) 150 151 return s u l y ; 152 153 154 / 155 S e t s t h e v a l u e o f t h e s u l y p r o p e r t y. 156 157 / 158 public void s e t S u l y ( double value ) 159 160 this. s u l y = value ; 161 162 1 // 1 11. Programlista : Az x j c á l t a l g e n e r á l t ObjectFactory o s z t á l y 2 3 // 4 // This f i l e was g e n e r a ted by t h e JavaTM A r c h i t e c t u r e f o r XML Binding (JAXB) Reference Implementation, v2.2.4 2 5 // See <a h r e f="h t t p :// j a v a. sun. com/xml/ j a x b">h t t p :// j a v a. sun. com/xml/ jaxb </a> 6 // Any m o d i f i c a t i o n s to t h i s f i l e w i l l be l o s t upon r e c o m p i l a t i o n o f t h e source schema. 7 // Generated on : 2013.03.19 at 0 6 : 4 9 : 0 4 PM GMT 8 // 9 10 11 package t e s t. ceg. org ; 12 13 import javax. xml. bind. JAXBElement ; 14 import javax. xml. bind. annotation. XmlElementDecl ; 15 import javax. xml. bind. annotation. XmlRegistry ; 16 import javax. xml. namespace. QName; 17 18 19 / 20 This o b j e c t c o n t a i n s f a c t o r y methods f o r each 21 Java c o n t e n t i n t e r f a c e and Java element i n t e r f a c e 22 g e n e rated in t h e t e s t. ceg. org package. 23 <p>an ObjectFactory a l l o w s you to p r o g r a m a t i c a l l y 24 c o n s t r u c t new i n s t a n c e s o f t h e Java r e p r e s e n t a t i o n 25 f o r XML c o n t e n t. The Java r e p r e s e n t a t i o n o f XML 26 c o n t e n t can c o n s i s t o f schema d e r i v e d i n t e r f a c e s 27 and c l a s s e s r e p r e s e n t i n g t h e b i n d i n g o f schema 28 t y p e d e f i n i t i o n s, element d e c l a r a t i o n s and model 29 groups. Factory methods f o r each o f t h e s e are 30 p r o v i d e d in t h i s c l a s s. 31 32 / 33 @XmlRegistry 34 public class ObjectFactory 35 36 private f i n a l s t a t i c QName _Employee_QNAME = new QName( " org. ceg. t e s t ", " employee " ) ; 37 38 / 39 Create a new ObjectFactory t h a t can be used to c r e a t e new i n s t a n c e s o f schema d e r i v e d c l a s s e s f o r package : t e s t. ceg. org 40 41 / 42 public ObjectFactory ( ) 11

JAXB - A Java és XML összekötése 43 44 45 / 46 Create an i n s t a n c e o f @link Employee 47 48 / 49 public Employee createemployee ( ) 50 return new Employee ( ) ; 51 52 53 / 54 Create an i n s t a n c e o f @link Address 55 56 / 57 public Address c r e a t e A d d r e s s ( ) 58 return new Address ( ) ; 59 60 61 / 62 Create an i n s t a n c e o f @link JAXBElement @code <@link Employee @code > 63 64 / 65 @XmlElementDecl ( namespace = " org. ceg. t e s t ", name = " employee " ) 66 public JAXBElement<Employee> createemployee ( Employee value ) 67 return new JAXBElement<Employee>(_Employee_QNAME, Employee. class, null, value ) ; 68 69 70 Szeretnénk kiemelni, hogy az Employee classhoz mi írtuk oda a @XmlRootElement annotációt, mert az xjc ezt valami miatt nem tette meg. Ettől eltekintve korrekt Java forrás jött létre, gyakorlatilag kézzel is ezt írtuk meg korábban. Az Employee.xml XML fájl beolvasása ezekkel a generált osztályokkal természetesen ugyanúgy működik, ha kipróbáljuk. Az ObjectFactory osztály gyártómetódusokat ad az Employee és Address objektumok előállítására, de ezek csak kényelmi funkciók. Néhány apró változtatás A példa befejezéseként teszünk néhány változtatást az eredeti 2 Java osztályunkon, majd megnézzük, hogy milyen sémát lehet velük generálni. A megváltoztatott 2 bean-t az 1-12. és 1-13. Programlisták mutatják. // 1 12. Programlista : Employee. j a v a package org. c s. t e s t. t t t ; import javax. xml. bind. annotation. XmlElement ; import javax. xml. bind. annotation. XmlRootElement ; import javax. xml. bind. annotation. XmlType ; @XmlRootElement ( namespace = " org. ceg. t e s t ", name = " Dolgozo " ) @XmlType( namespace = " org. ceg. t e s t " ) public class Employee @XmlElement ( name=" cim", namespace = " http : / / org. c s. a d d r e s s " ) Address a d d r e s s ; @XmlElement ( name=" nev ", namespace = " org. ceg. t e s t " ) S t r i n g name ; @XmlElement ( name="nem" ) S t r i n g sex ; @XmlElement int kor ; @XmlElement double s u l y ; // 1 13. Programlista : Address. j a v a package org. c s. t e s t. t t t ; import javax. xml. bind. annotation. XmlElement ; 12

JAXB - A Java és XML összekötése import javax. xml. bind. annotation. XmlType ; @XmlType( name=" cim", namespace = " org. ceg. t e s t " ) public class Address @XmlElement ( name=" utca " ) S t r i n g s t r e e t ; Ahol nem volt magyar az adatmező neve, ott magyar name értékre állítottuk a generált címke nevet. Példa: street utca. Az address mezőt egy minden eddigitől eltérő másik, http://org.cs.address nevű névtérbe tettük. @XmlElement ( name=" hazszam" ) int housenumber ; A változtatások ezek voltak: A schemagen parancs futtatása után most 2 XSD fájl keletkezett, amit az 1-14. és 1-15. Programlisták mutatnak. 1 // 1 14. P r o g r a m l i s t a : schema1. xsd 2 3 <?xml version=" 1. 0 " encoding="utf 8" standalone=" yes "?> 4 <x s:schema version=" 1. 0 " targetnamespace=" org. ceg. t e s t " x m l n s : n s 1=" h t t p : // org. c s. a d d r e s s " x m l n s : t n s=" org. ceg. t e s t " xm 5 6 <xs: import namespace=" http: // org. cs. address " schemalocation=" schema2. xsd "/> 7 8 <xs: element name=" Dolgozo " type=" tns: employee "/> 9 10 <xs:complextype name=" employee "> 11 <x s : s e q u e n c e> 12 <xs: element r e f=" ns1:cim " minoccurs="0"/> 13 <x s : e l e m e n t name=" nev " type=" x s : s t r i n g " form=" q u a l i f i e d " minoccurs="0"/> 14 <x s : e l e m e n t name="nem" type=" x s : s t r i n g " minoccurs="0"/> 15 <x s : e l e m e n t name=" kor " type=" x s : i n t "/> 16 <xs: element name=" suly " type=" xs: double "/> 17 </ x s : s e q u e n c e> 18 </ xs:complextype> 19 20 <xs:complextype name=" cim "> 21 <x s : s e q u e n c e> 22 <x s : e l e m e n t name=" utca " type=" x s : s t r i n g " minoccurs="0"/> 23 <xs: element name=" hazszam " type=" x s : i n t "/> 24 </ x s : s e q u e n c e> 25 </ xs:complextype> 26 </ x s :schema> 1 // 1 15. P r o g r a m l i s t a : schema2. xsd 2 3 <?xml version=" 1. 0 " encoding="utf 8" standalone=" yes "?> 4 <xs:schema version=" 1. 0 " targetnamespace=" http: // org. cs. address " xmlns:ns1=" org. ceg. t e s t " xmlns:xs=" http: //www. w3. org 5 6 <x s : i m p o r t namespace=" org. ceg. t e s t " schemalocation=" schema1. xsd "/> 7 8 <xs: element name="cim " type=" ns1:cim "/> 9 </xs:schema > Mit tanulhatunk ebből? Az első, amit észrevehetünk, hogy az XML tag neveket megváltoztattuk, azaz nem automatikusan a Java bean property névből képződnek ott, ahol eredetileg angol mező nevek voltak. A másik lényeges és megjegyzésre érdemes momentum az, hogy a 2 névtér miatt 2 darab XSD keletkezett, amik egymást beimportálják. Ezzel lehetővé vált, hogy mindkét targetnamespace létezzen és a megfelelően adjuk meg a névtérbe tartozó XML sématípust. Az XML sémák fordítása Az előző példában minden alapvető dolgot megtanultunk, ezért a továbbiakban csak a tudásunkat mélyítjük egy kicsit tovább. Az 1-16. Programlistán látható XML séma egy minden nap használt, produktív megoldás része. A következőkben megnézzük, hogy milyen Java kód gene- 13

JAXB - A Java és XML összekötése rálható erre és az egyes típusokhoz milyen Java típusok tartoznak majd. A sémával kapcsolatosan a következőkre hívjuk fel a figyelmet: Van benne 4 darab complextype A targetnamespace: urn:jaxbtest/xsd2java Mindegyik XSD skalár típus megtalálható benne Van olyan, ahol a maxoccurs="unbounded", azaz a címke akárhányszor ismétlődhet. Amikor nem adjuk meg egy sémarészhez a minoccurs és maxoccurs attribútumokat, akkor az elem pontosan 1 alkalommal kell, hogy előforduljon. A minoccurs="0" azt jelenti, hogy 0 darab is lehet 1 XML-ben ebből a tag-ból, míg a maxoccurs="unbounded" pedig azt engedi, hogy akármennyi. Ekkor itt egy Java tömb vagy List várható majd a generálás eredményeként. Ennyi előzmény után futtassuk le a következő xjc parancsot, ami legyártja a Java class-okat: x j c p c s. org. jaxb. t e s t j a x b T e s t. xsd A -p kapcsolóval azt adtuk meg, hogy a forrás milyen Java csomagba kerüljön, így a generált kód az cs/org/jaxb/test könyvtárba került. 1 // 1 16. P r o g r a m l i s t a : jaxbtest. xsd 2 3 <?xml version=" 1. 0 " encoding="utf 8"?> 4 <x s:schema a t t r i b u t e F o r m D e f a u l t=" u n q u a l i f i e d " elementformdefault=" q u a l i f i e d " targetnamespace=" u r n : j a x b t e s t / xsd2java " xmlns:xs=" http: //www. w3. org /2001/XMLSchema"> 5 <x s : e l e m e n t name=" s e l e c t " type=" s c h : s e l e c t T y p e " x m l n s : s c h=" u r n : j a x b t e s t / x s d 2 j a v a "/> 6 <xs:complextype name=" datatype "> 7 <x s : s e q u e n c e minoccurs="0" maxoccurs="unbounded "> 8 <x s : e l e m e n t type=" sch:rowtype " name="row" x m l n s : s c h=" u r n : j a x b t e s t / x s d 2 j a v a "/> 9 </ x s : s e q u e n c e> 10 </ xs:complextype> 11 <xs:complextype name="rowtype"> 12 <x s : s e q u e n c e> 13 <x s : e l e m e n t type=" x s : s t r i n g " name=" t e s t S t r i n g "/> 14 <x s : e l e m e n t type=" x s : i n t e g e r " name=" t e s t I n t e g e r "/> 15 <x s : e l e m e n t type=" x s : i n t " name=" t e s t I n t "/> 16 <x s : e l e m e n t type=" x s : l o n g " name=" t e s t L o n g "/> 17 <x s : e l e m e n t type=" x s : s h o r t " name=" t e s t S h o r t "/> 18 <xs: element type=" xs: decimal " name=" testdecimal "/> 19 <x s : e l e m e n t type=" x s : f l o a t " name=" t e s t F l o a t "/> 20 <xs: element type=" xs: double " name=" testdouble "/> 21 <xs: element type=" xs: boolean " name=" testboolean "/> 22 <xs: element type=" xs: byte " name=" testbyte "/> 23 <x s : e l e m e n t type="xs:qname" name="testqname"/> 24 <xs: element type=" xs:datetime " name=" testdatetime "/> 25 <xs: element type=" xs: base64binary " name=" testbase64binary "/> 26 <xs: element type=" xs: hexbinary " name=" testhexbinary "/> 27 <xs: element type=" xs: unsignedint " name=" testunsignedint "/> 28 <xs: element type=" xs: unsignedshort " name=" testunsignedshort "/> 29 <xs: element type=" xs: unsignedbyte " name=" testunsignedbyte2 "/> 30 <xs: element type=" xs: time " name=" testtime "/> 31 <xs: element type=" xs: date " name=" testdate "/> 32 <xs: element type=" xs:anysimpletype " name=" testanysimpletype "/> 33 <x s : e l e m e n t type=" x s : d u r a t i o n " name=" t e s t D u r a t i o n "/> 34 </ x s : s e q u e n c e> 35 </ xs:complextype> 36 <xs:complextype name=" controlltype "> 37 <x s : s e q u e n c e> 38 <x s : e l e m e n t type=" x s : s t r i n g " name=" theme "/> 39 <xs: element type=" xs:datetime " name=" timestamp "/> 40 <x s : e l e m e n t type=" x s : s t r i n g " name=" query "/> 41 <x s : e l e m e n t type=" x s : s t r i n g " name=" t a b l e "/> 42 <x s : e l e m e n t type=" x s : s t r i n g " name=" d a t a s o u r c e "/> 43 <x s : e l e m e n t type=" x s : l o n g " name=" rowcnt "/> 44 <x s : e l e m e n t type=" x s : l o n g " name=" r e s u l t s e t i d "/> 45 </ x s : s e q u e n c e> 46 </ xs:complextype> 47 <xs:complextype name=" selecttype "> 48 <x s : s e q u e n c e> 49 <x s : e l e m e n t type=" s c h : c o n t r o l l T y p e " name=" c o n t r o l l " x m l n s : s c h=" u r n : j a x b t e s t / x s d 2 j a v a "/> 50 <x s : e l e m e n t type=" sch:datatype " name=" data " x m l n s : s c h=" u r n : j a x b t e s t / x s d 2 j a v a "/> 51 </ x s : s e q u e n c e> 52 </ xs:complextype> 53 </ x s :schema> 14

JAXB - A Java és XML összekötése 1 // 1 17. Programlista : ControllType. j av a 2 3 // 4 // This f i l e was g e n e r a ted by t h e JavaTM A r c h i t e c t u r e f o r XML Binding (JAXB) Reference Implementation, v2.2.4 2 5 // See <a h r e f="h t t p :// j a v a. sun. com/xml/ j a x b">h t t p :// j a v a. sun. com/xml/ jaxb </a> 6 // Any m o d i f i c a t i o n s to t h i s f i l e w i l l be l o s t upon r e c o m p i l a t i o n o f t h e source schema. 7 // Generated on : 2013.04.06 at 0 2 : 5 9 : 4 5 PM GMT 8 // 9 10 11 package c s. org. jaxb. t e s t ; 12 13 import javax. xml. bind. annotation. XmlAccessType ; 14 import javax. xml. bind. annotation. XmlAccessorType ; 15 import javax. xml. bind. annotation. XmlElement ; 16 import javax. xml. bind. annotation. XmlSchemaType ; 17 import javax. xml. bind. annotation. XmlType ; 18 import javax. xml. datatype. XMLGregorianCalendar ; 19 20 21 / 22 <p>java c l a s s f o r c o n t r o l l T y p e complex t y p e. 23 24 <p>the f o l l o w i n g schema fragment s p e c i f i e s t h e e x p e c t e d c o n t e n t contained w i t h i n t h i s c l a s s. 25 26 <pre> 27 &l t ; complextype name="c o n t r o l l T y p e"> 28 & l t ; complexcontent> 29 &l t ; r e s t r i c t i o n base=" h t t p ://www. w3. org /2001/XMLSchemaanyType"> 30 &l t ; sequence> 31 &l t ; element name="theme" t y p e=" h t t p ://www. w3. org /2001/XMLSchema s t r i n g "/> 32 &l t ; element name="timestamp " t y p e=" h t t p ://www. w3. org /2001/XMLSchemadateTime"/> 33 &l t ; element name="query " t y p e=" h t t p ://www. w3. org /2001/XMLSchema s t r i n g "/> 34 &l t ; element name=" t a b l e " t y p e=" h t t p ://www. w3. org /2001/XMLSchema s t r i n g "/> 35 &l t ; element name="d atasource " t y p e =" h t t p ://www. w3. org /2001/XMLSchema s t r i n g "/> 36 &l t ; element name="rowcnt " t y p e=" h t t p ://www. w3. org /2001/XMLSchema l o n g"/> 37 &l t ; element name=" r e s u l t s e t i d " t y p e=" h t t p ://www. w3. org /2001/XMLSchema l o n g"/> 38 &l t ; / sequence> 39 &l t ; / r e s t r i c t i o n > 40 &l t ; / complexcontent> 41 &l t ; / complextype> 42 </pre> 43 44 45 / 46 @XmlAccessorType ( XmlAccessType. FIELD) 47 @XmlType( name = " c o n t r o l l T y p e ", proporder = 48 "theme", 49 " timestamp ", 50 " query ", 51 " t a b l e ", 52 " d a t a s o u r c e ", 53 " rowcnt ", 54 " r e s u l t s e t i d " 55 ) 56 public class ControllType 57 58 @XmlElement ( r e q u i r e d = true ) 59 protected S t r i n g theme ; 60 @XmlElement ( r e q u i r e d = true ) 61 @XmlSchemaType ( name = " datetime " ) 62 protected XMLGregorianCalendar timestamp ; 63 @XmlElement ( r e q u i r e d = true ) 15

JAXB - A Java és XML összekötése 64 protected S t r i n g query ; 65 @XmlElement ( r e q u i r e d = true ) 66 protected S t r i n g t a b l e ; 67 @XmlElement ( r e q u i r e d = true ) 68 protected S t r i n g d a t a s o u r c e ; 69 protected long rowcnt ; 70 protected long r e s u l t s e t i d ; 71 72 s e t t e r é s g e t t e r metódusok 73 / 74 Gets t h e v a l u e o f t h e timestamp p r o p e r t y. 75 76 @return 77 p o s s i b l e o b j e c t i s 78 @ link XMLGregorianCalendar 79 80 / 81 public XMLGregorianCalendar gettimestamp ( ) 82 return timestamp ; 83 84 85 / 86 S e t s t h e v a l u e o f t h e timestamp p r o p e r t y. 87 88 @param v a l u e 89 a l l o w e d o b j e c t i s 90 @ link XMLGregorianCalendar 91 92 / 93 public void settimestamp ( XMLGregorianCalendar value ) 94 this. timestamp = value ; 95 96 1 // 1 18. Programlista : RowType. j a v a 2 3 package c s. org. jaxb. t e s t ; 4 5 import java. math. BigDecimal ; 6 import java. math. B i g I n t e g e r ; 7 import javax. xml. bind. annotation. XmlAccessType ; 8 import javax. xml. bind. annotation. XmlAccessorType ; 9 import javax. xml. bind. annotation. XmlElement ; 10 import javax. xml. bind. annotation. XmlSchemaType ; 11 import javax. xml. bind. annotation. XmlType ; 12 import javax. xml. bind. annotation. a d a p t e r s. HexBinaryAdapter ; 13 import javax. xml. bind. annotation. a d a p t e r s. XmlJavaTypeAdapter ; 14 import javax. xml. datatype. Duration ; 15 import javax. xml. datatype. XMLGregorianCalendar ; 16 import javax. xml. namespace. QName; 17 18 19 / 20 <p>java c l a s s f o r rowtype complex t y p e. 21 22 <p>the f o l l o w i n g schema fragment s p e c i f i e s t h e e x p e c t e d c o n t e n t contained w i t h i n t h i s c l a s s. 23 24 <pre> 25 & l t ; complextype name="rowtype"> 26 & l t ; complexcontent> 27 &l t ; r e s t r i c t i o n base=" h t t p ://www. w3. org /2001/XMLSchemaanyType"> 28 &l t ; sequence> 29 &l t ; element name=" t e s t S t r i n g " t y p e=" h t t p ://www. w3. org /2001/XMLSchema s t r i n g "/> 30 &l t ; element name=" t e s t I n t e g e r " t y p e=" h t t p ://www. w3. org /2001/XMLSchema i n t e g e r "/> 31 &l t ; element name=" t e s t I n t " t y p e=" h t t p ://www. w3. org /2001/XMLSchema i n t "/> 16

JAXB - A Java és XML összekötése 32 &l t ; element name="t e s t L o n g " t y p e =" h t t p ://www. w3. org /2001/XMLSchema l o n g"/> 33 &l t ; element name=" t e s t S h o r t " t y p e=" h t t p ://www. w3. org /2001/XMLSchema s h o r t "/> 34 &l t ; element name="t e s t D e c i m a l " t y p e=" h t t p ://www. w3. org /2001/XMLSchema decimal"/> 35 &l t ; element name=" t e s t F l o a t " t y p e=" h t t p ://www. w3. org /2001/XMLSchema f l o a t "/> 36 &l t ; element name="t e s t D o u b l e " t y p e=" h t t p ://www. w3. org /2001/XMLSchema d o u b l e "/> 37 &l t ; element name="t e s t B o o l e a n " t y p e=" h t t p ://www. w3. org /2001/XMLSchema boolean"/> 38 &l t ; element name="t e s t B y t e " t y p e=" h t t p ://www. w3. org /2001/XMLSchema b y t e "/> 39 &l t ; element name="testqname" t y p e=" h t t p ://www. w3. org /2001/XMLSchemaQName"/> 40 &l t ; element name="testdatetime " t y p e=" h t t p ://www. w3. org /2001/XMLSchemadateTime"/> 41 &l t ; element name="testbase64binary " t y p e=" h t t p ://www. w3. org /2001/XMLSchema base64binary"/> 42 &l t ; element name="testhexbinary " t y p e=" h t t p ://www. w3. org /2001/XMLSchema hexbinary"/> 43 &l t ; element name="t e s t U n s i g n e d I n t " t y p e=" h t t p ://www. w3. org /2001/XMLSchema u n s i g n e d I n t "/> 44 &l t ; element name="t e s t U n s i g n e d S h o r t " t y p e=" h t t p ://www. w3. org /2001/XMLSchema unsignedshort"/> 45 &l t ; element name="testunsignedbyte2 " t y p e=" h t t p ://www. w3. org /2001/XMLSchema unsignedbyte"/> 46 &l t ; element name="testtime " t y p e=" h t t p ://www. w3. org /2001/XMLSchema time"/> 47 &l t ; element name="t e s t D a t e " t y p e=" h t t p ://www. w3. org /2001/XMLSchema date"/> 48 &l t ; element name="testanysimpletype " t y p e=" h t t p ://www. w3. org /2001/XMLSchema anysimpletype"/> 49 &l t ; element name="t e s t D u r a t i o n " t y p e=" h t t p ://www. w3. org /2001/XMLSchema d u r a t i o n"/> 50 &l t ; / sequence> 51 &l t ; / r e s t r i c t i o n > 52 &l t ; / complexcontent> 53 &l t ; / complextype> 54 </pre> 55 56 57 / 58 @XmlAccessorType ( XmlAccessType. FIELD) 59 @XmlType( name = "rowtype", proporder = 60 " t e s t S t r i n g ", 61 " t e s t I n t e g e r ", 62 " t e s t I n t ", 63 " testlong ", 64 " t e s t S h o r t ", 65 " t e s t D e c i m a l ", 66 " t e s t F l o a t ", 67 " testdouble ", 68 " t e s t B o o l e a n ", 69 " t e s t B y t e ", 70 "testqname", 71 " testdatetime ", 72 " testbase64binary ", 73 " testhexbinary ", 74 " t e s t U n s i g n e d I n t ", 75 " t e s t U n s i g n e d S h o r t ", 76 " testunsignedbyte2 ", 77 " testtime ", 78 " t e s t D a t e ", 79 " testanysimpletype ", 80 " t e s t D u r a t i o n " 81 ) 82 public class RowType 83 84 @XmlElement ( r e q u i r e d = true ) 85 protected S t r i n g t e s t S t r i n g ; 86 @XmlElement ( r e q u i r e d = true ) 87 protected B i g I n t e g e r t e s t I n t e g e r ; 88 protected int t e s t I n t ; 89 protected long testlong ; 90 protected short t e s t S h o r t ; 91 @XmlElement ( r e q u i r e d = true ) 17

JAXB - A Java és XML összekötése 92 protected BigDecimal t e s t D e c i m a l ; 93 protected f l o a t t e s t F l o a t ; 94 protected double testdouble ; 95 protected boolean t e s t B o o l e a n ; 96 protected byte t e s t B y t e ; 97 @XmlElement ( r e q u i r e d = true ) 98 protected QName testqname ; 99 @XmlElement ( r e q u i r e d = true ) 100 @XmlSchemaType ( name = " datetime " ) 101 protected XMLGregorianCalendar testdatetime ; 102 @XmlElement ( r e q u i r e d = true ) 103 protected byte [ ] testbase64binary ; 104 @XmlElement ( r e q u i r e d = true, type = S t r i n g. class ) 105 @XmlJavaTypeAdapter ( HexBinaryAdapter. class ) 106 @XmlSchemaType ( name = " hexbinary " ) 107 protected byte [ ] testhexbinary ; 108 @XmlSchemaType ( name = " u n s i g n e d I n t " ) 109 protected long t e s t U n s i g n e d I n t ; 110 @XmlSchemaType ( name = " unsignedshort " ) 111 protected int t e s t U n s i g n e d S h o r t ; 112 @XmlSchemaType ( name = " unsignedbyte " ) 113 protected short testunsignedbyte2 ; 114 @XmlElement ( r e q u i r e d = true ) 115 @XmlSchemaType ( name = " time " ) 116 protected XMLGregorianCalendar testtime ; 117 @XmlElement ( r e q u i r e d = true ) 118 @XmlSchemaType ( name = " date " ) 119 protected XMLGregorianCalendar t e s t D a t e ; 120 @XmlElement ( r e q u i r e d = true ) 121 @XmlSchemaType ( name = " anysimpletype " ) 122 protected Object testanysimpletype ; 123 @XmlElement ( r e q u i r e d = true ) 124 protected Duration t e s t D u r a t i o n ; 125 126 s e t t e r é s g e t t e r metódusok 127 128 A létrehozott Java osztályok közül most csak a ControllType és RowType egy-egy részlete került be a fenti programlistákba.a további generált Java forrásfájlok ezek: DataType.java a datatype complextype részére SelectType.java a selecttype complextype részére ObjectFactory kényelmi osztály Figyeljük meg a RowType tanulmányozásával, hogy az egyes XML séma típusok milyen Java típusokra képződtek le. Az @XmlElement required = true attribútuma azt jelenti, hogy ez a mező kötelezően megjelenő az XML, ami azért van, mert itt nem adtuk meg a minoccurs és maxoccurs paramétereket, tehát az előfordulás értéke 1. További érdekesség, hogy az @XmlType annotációnál létrejött a propordert is, ami felsorolásként tartalmazza azt a tag sorrendet, amit az érvényes XML-nek prezentálnia kell. Ez nem véletlen, hiszen ez az XSD xs:sequence részénél felsorolt elemeket jelenti. Dinamikus XML feldolgozás Gyakori feladat, hogy különféle XML szövegek érkeznek, amiket a típusuktól függően kell feldolgoznunk. Kommunikációs, integrációs környezetekben például egy sorba (Queue) érkezhetnek ezek az XML üzenetek, amiket más-más módon kell kezelnünk. Ebben a pontban azt mutatjuk 18

JAXB - A Java és XML összekötése meg, hogy az ilyen típusú feladatokat milyen módon tudjuk kezelni JAXB környezetben. Példaként tekintsük az 1-19. és 1-21. Programlistákat, amikhez tartozó XSD-ket is láthatjuk (1-20. és 1-22. Programlisták). @XmlElement S t r i n g t i t l e ; @XmlElement int pages ; // 1 19. Programlista : C l a s s F i r s t. j a v a package org. c s. jaxb. t e s t ; import javax. xml. bind. annotation. XmlElement ; import javax. xml. bind. annotation. XmlRootElement ; import javax. xml. bind. annotation. XmlType ; @XmlRootElement ( namespace = " org. c s. jaxb. t e s t " ) @XmlType( namespace = " org. c s. jaxb. t e s t " ) public class C l a s s F i r s t @XmlElement S t r i n g name ; @XmlElement int value ; // 1 20. P r o g r a m l i s t a : C l a s s F i r s t. xsd <?xml version=" 1. 0 " encoding="utf 8" standalone=" yes "?> <xs: schema version=" 1. 0 " targetnamespace=" org. c s. jaxb. t e s t " x m l n s : t n s=" org. c s. jaxb. t e s t " xmlns:xs=" h t t p : //www. w3. org / <x s : e l e m e n t name=" c l a s s F i r s t " type=" t n s : c l a s s F i r s t "/> <xs:complextype name=" c l a s s F i r s t "> <x s : s e q u e n c e > <x s : e l e m e n t name="name" type=" x s : s t r i n g " minoccurs=" 0"/> <x s : e l e m e n t name=" value " type=" x s : i n t "/> </x s : s e q u e n c e > </xs:complextype> </xs:schema> // 1 21. Programlista : ClassSecond. j a v a package org. c s. jaxb. t e s t ; import javax. xml. bind. annotation. XmlElement ; import javax. xml. bind. annotation. XmlRootElement ; import javax. xml. bind. annotation. XmlType ; @XmlRootElement ( namespace = " org. c s. jaxb. t e s t " ) @XmlType( namespace = " org. c s. jaxb. t e s t " ) public class ClassSecond @XmlElement S t r i n g d e s c r i p t i o n ; // 1 22. P r o g r a m l i s t a : ClassSecond. xsd <?xml version=" 1. 0 " encoding="utf 8" standalone=" yes "?> <xs: schema version=" 1. 0 " targetnamespace=" org. c s. jaxb. t e s t " x m l n s : t n s=" org. c s. jaxb. t e s t " xmlns:xs=" h t t p : //www. w3. org / <x s : e l e m e n t name=" c l a s s S e c o n d " type=" t n s : c l a s s S e c o n d "/> <xs:complextype name=" c l a s s S e c o n d "> <x s : s e q u e n c e > <x s : e l e m e n t name=" d e s c r i p t i o n " type=" x s : s t r i n g " minoccurs="0"/> <x s : e l e m e n t name=" t i t l e " type=" x s : s t r i n g " minoccurs=" 0"/> <x s : e l e m e n t name=" pages " type=" x s : i n t "/> </x s : s e q u e n c e > </xs:complextype> </xs:schema> A GenXML osztály (1-23. Programlista) segítségével legyártottuk a ClassFirst.xml és ClassSecond.xml XML fájlokat, ezek lesznek a minta üzenetek, amiket különféle módon kell feldolgozni. A 15-22 sorok között létrehozzunk egyegy ClassFirst és ClassSecond objektumot. A 27. sor nagyon fontos, mert ez egy olyan Class[] tömböt hoz létre, ami azokat az osztályokat sorolja fel, amiket majd a JAXB kontextusban kezelni, ismerni akarunk. A 29. sor ennek megfelelően hoz létre egy JAXBContext objektumot, amitől a következő sorban egy Marshaller objektumot igénylünk. A 32-33 sorokban mindkét előzetesen létrehozott objektumunkat XML fájlba perzisztáljuk. Most, hogy van 2 különböző XML üzenetünk, elérkeztünk oda, hogy be tudjuk mutatni az azok egyedi kezelését megvalósító XMLProcessor osztályt (1-24. Programlista). Nézzük meg röviden a működését! A 14-23 sorok jelentése már bizonyára mindenkinek világos, ezért a 25. sorban lévő unmarshal() metódushívásra hívnánk fel először a figyelmet, ahol a beolvasott XML egy általános Object sta- 19

JAXB - A Java és XML összekötése tikus típusú objektumba kerül. A trükk igazából csak ennyi, mert utána az egyes elágazásokban az instanceof utasításra épülő döntés már segít a konkrét esetek szétválasztásában és feldolgozásában. 1 // 1 23. Programlista : GenXML. j a v a 2 3 package org. c s. jaxb. t e s t ; 4 5 import java. i o. F i l e ; 6 import javax. xml. bind. JAXBContext ; 7 import javax. xml. bind. JAXBException ; 8 import javax. xml. bind. M a r s h a l l e r ; 9 import t e s t. ceg. org. Employee ; 10 11 public class GenXML 12 13 public s t a t i c void main ( S t r i n g [ ] a r g s ) throws JAXBException 14 15 C l a s s F i r s t c f = new C l a s s F i r s t ( ) ; 16 c f. name = " N y i r i Imre " ; 17 c f. value = 5 ; 18 19 ClassSecond c s = new ClassSecond ( ) ; 20 c s. d e s c r i p t i o n = "Ez egy j ó l e c k e v o l t. " ; 21 c s. pages = 1 0 0 ; 22 c s. t i t l e = " I n f o r m a t i k a i Navigátor " ; 23 24 F i l e x m l f i l e 1 = new F i l e ( "/home/ t a n u l a s /xml/ C l a s s F i r s t. xml" ) ; 25 F i l e x m l f i l e 2 = new F i l e ( "/home/ t a n u l a s /xml/ ClassSecond. xml" ) ; 26 27 C l a s s [ ] c l a s s e s = new C l a s s [ ] C l a s s F i r s t. class, ClassSecond. class ; 28 29 JAXBContext jaxbcontext = JAXBContext. newinstance ( c l a s s e s ) ; 30 M a r s h a l l e r j a x b M a r s h a l l e r = jaxbcontext. c r e a t e M a r s h a l l e r ( ) ; 31 j a x b M a r s h a l l e r. s e t P r o p e r t y ( M a r s h a l l e r.jaxb_formatted_output, Boolean.TRUE) ; 32 j a x b M a r s h a l l e r. marshal ( cf, x m l f i l e 1 ) ; 33 j a x b M a r s h a l l e r. marshal ( cs, x m l f i l e 2 ) ; 34 35 1 // 1 24. Programlista : XMLProcessor. j av a 2 3 package org. c s. jaxb. t e s t ; 4 5 import java. i o. F i l e ; 6 import javax. xml. bind. JAXBContext ; 7 import javax. xml. bind. JAXBException ; 8 import javax. xml. bind. Unmarshaller ; 9 10 public class XMLProcessor 11 12 public s t a t i c void main ( S t r i n g [ ] a r g s ) throws JAXBException 13 14 C l a s s [ ] c l a s s e s = new C l a s s [ ] 15 16 org. c s. jaxb. t e s t. C l a s s F i r s t. class, 17 org. c s. jaxb. t e s t. ClassSecond. class 18 ; 19 20 JAXBContext jaxbcontext = JAXBContext. newinstance ( c l a s s e s ) ; 21 Unmarshaller jaxbunmarshaller = jaxbcontext. c r e a t e U n m a r s h a l l e r ( ) ; 22 23 F i l e x m l f i l e = new F i l e ( "/home/ t a n u l a s /xml/ ClassSecond. xml" ) ; 20

JAXB - A Java és XML összekötése 24 25 Object xmlobject = jaxbunmarshaller. unmarshal ( x m l f i l e ) ; 26 27 i f ( xmlobject instanceof C l a s s F i r s t ) 28 29 C l a s s F i r s t c f = ( C l a s s F i r s t ) xmlobject ; 30 System. out. p r i n t l n ( c f. name ) ; 31 System. out. p r i n t l n ( c f. value ) ; 32 33 else i f ( xmlobject instanceof ClassSecond ) 34 35 ClassSecond c f = ( ClassSecond ) xmlobject ; 36 System. out. p r i n t l n ( c f. d e s c r i p t i o n ) ; 37 System. out. p r i n t l n ( c f. pages ) ; 38 System. out. p r i n t l n ( c f. t i t l e ) ; 39 40 else 41 42 System. out. p r i n t l n ( " I s m e r e t l e n XML! " ) ; 43 44 45 Érdekes XML séma lehetőségek Ebben a pontban az 1-16. Programlista sémáját néhány helyen megváltoztatjuk és tanulmányozzuk, hogy mindez milyen hatással van a generált Java osztályokra. Ez a módszer azért lesz tanulságos, mert azután mi is tudunk így annotált class-okat készíteni, azaz sokat tanulhatunk a JAXB @ -okról. Ismétlődések és XML tag számosságok Eddig nem mutattuk meg, hogy milyen lett a generált DataType class, pedig lehet belőle tanulni, emiatt nézzük is meg! Amit meg kell figyelnünk, az a protected List<RowType> row sor (45. sor), ugyanis a row tag 0 vagy több ismétlődéssel lehet a séma szerint, amit ez a konstrukció jól leképez. 1 // 1 25. Programlista : DataType. j a v a 2 3 // 4 // This f i l e was g e n e r a ted by t h e JavaTM A r c h i t e c t u r e f o r XML Binding (JAXB) Reference Implementation, v2.2.4 2 5 // See <a h r e f="h t t p :// j a v a. sun. com/xml/ j a x b">h t t p :// j a v a. sun. com/xml/ jaxb </a> 6 // Any m o d i f i c a t i o n s to t h i s f i l e w i l l be l o s t upon r e c o m p i l a t i o n o f t h e source schema. 7 // Generated on : 2013.04.06 at 0 4 : 2 2 : 1 6 PM GMT 8 // 9 10 11 package c s. org. jaxb. t e s t ; 12 13 import java. u t i l. ArrayList ; 14 import java. u t i l. L i s t ; 15 import javax. xml. bind. annotation. XmlAccessType ; 16 import javax. xml. bind. annotation. XmlAccessorType ; 17 import javax. xml. bind. annotation. XmlType ; 18 19 20 / 21 <p>java c l a s s f o r datatype complex t y p e. 22 23 <p>the f o l l o w i n g schema fragment s p e c i f i e s t h e e x p e c t e d c o n t e n t contained w i t h i n t h i s c l a s s. 24 25 <pre> 21