36
argonavis.com.br argonavis.com.br a a b b x x j j 1 v b a x j a m l [email protected] helder.da.rocha argonavis argonavis .com.br .com.br 2004 inding < >

JustJava 2004: JAXB

Embed Size (px)

Citation preview

Page 1: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

1

vbb

aaxxjjaml [email protected]

helder.da.rocha

argonavisargonavis.com.br.com.br

2004

inding

< >

Page 2: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

2

Explorar JAXB: uma arquitetura que permite a integração transparente de Java e XML

Tópicos abordados Introdução Arquitetura JAXB XML Schema Mapeamento XML-Java Como usar JAXB: passo-a-passo Demonstração

ObjetivosObjetivos

Page 3: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

3

Mapeamento Java - XMLMapeamento Java - XML

● Como integrar aplicações Java com XML?● Alternativas tradicionais: APIs nativas – JAXP

– SAX – leitura seqüencialcom captura de eventos

– DOM – montagem deárvore de elementos namemória

● Desvantagens:– Requerem conhecimento

de XML, uso de APIs burocráticas, ...– Queremos persistência sem precisar ver XML

JAXP

DocumentoXML

EstiloXSLT

DocumentoXML / HTML

DOM

SAX

Texto DOM

Page 4: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

4

O que é “XML data binding”?O que é “XML data binding”?● Mapeamento entre

– Classe – Esquema XML– Objeto – Instância (documento) XML

Contacodigo: String nome: Stringsaldo: double

conta_4:Contacodigo="4"nome="Morticia"saldo=82.00

<!ELEMENT conta (codigo, nome, saldo)<!ELEMENT codigo (#PCDATA)><!ELEMENT nome (#PCDATA)><!ELEMENT saldo (#PCDATA)>

<conta> <codigo>4</codigo> <nome>Morticia</nome> <saldo>199.35</saldo></conta>

<conta> <codigo>4</codigo> <nome>Morticia</nome> <saldo>0</saldo></conta>

<conta> <codigo>4</codigo> <nome>Morticia</nome> <saldo>82.00</saldo></conta>

conta_4.xml

conta_3.xml

conta_2.xml

conta.dtd

Page 5: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

5

Transparência com XML bindingTransparência com XML binding

● Com XML binding é possível ter persistência de dados em XML sem precisar conhecer XML

● Separação de responsabilidades: dois processos separados– 1. Mapeamento e construção das classes Java derivadas

de um esquema XML – requer a construção e compilação de um ou mais esquemas XML

– 2. Utilização das classes para serialização de objetos derivados das classes geradas – não requer nenhum conhecimento de XML: formato no qual os dados são guardados

Page 6: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

6

Solução para persistência de dadosSolução para persistência de dados

● Usando serialização Java

● Usando mapeamento Java-XML

ByteBLOB

writeObject() readObject()

marshal() unmarshal()

<xml><xml>

<xml>

Page 7: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

7

JAXBJAXB

● Java Architecture for XML Binding– Parte do Java Web Services Development Pack 1.3/1.4– Interface genérica para diferentes provedores de serviço

que façam mapeamento XML – Java– Suporta DTD, XML Schema e outros formatos de

esquema XML● O que faz

– Mapeia classes Java a documentos XML e gera JavaBeans a partir de um esquema XML

– Permite serializar objetos para XML e vice-versa, fazendo validação no processo.

Page 8: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

8

ArquiteturaArquitetura

Fonte: java.sun.com/jaxb/

Page 9: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

9

Típico processo JAXBTípico processo JAXB

● Gerar classes usando o compilador e um XSD● Compilar classes geradas e classes da aplicação.● Ler arquivos XML (unmarshal), nós DOM, fontes SAX,

etc. e gerar árvore de dados representando os documentos. Este processo pode ser precedido por uma etapa de validação do documento em relação ao seu esquema.

● Processar os dados através das interfaces dos objetos que representam as instâncias XML usando as classes geradas.

● Gravar arquivos XML (marshal). A árvore de dados é convertida em um ou mais documentos XML. O conteúdo pode ser validado antes da gravação.

Page 10: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

10

Processo JAXBProcesso JAXB

Fonte: java.sun.com/jaxb/

Page 11: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

11

Principais classes e pacotesPrincipais classes e pacotes

● Pacote javax.xml.bind e dois subpacotes● Classes mais importantes

– Unmarshaller – objeto que realiza a leitura de um arquivo XML e criação de um objeto derivado

– Marshaller – objeto que serializa um objeto em XML– Validator – objeto usado para validar o documento

XML e/ou os dados– JAXBContext – abstração usada para gerenciar o

processo de marshalling e unmarshalling. É preciso ter uma instância deste objeto para obter um Marshaller ou Unmarshaller.

Page 12: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

12

O qO que é um Esquema XML?ue é um Esquema XML? O esquema representa uma classe Os documentos são instâncias

Esquema (universo dedocumentos válidos)

Documentos que aderem àespecificação (válidos)

Documentofora da

especificação

Como definir esquemas:DTD - Document Type DefinitionW3C XML Schema

Page 13: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

13

DTD vs. XML SchemaDTD vs. XML Schema● Um esquema é essencial para que haja comunicação

usando XML– Pode ser estabelecido "informalmente" (via software)– Uso formal permite validação usando ferramentas

genéricas de manipulação de XML● Soluções padrão do W3C

DTD XML Schema<!ELEMENT contato (nome, email, telefone)><!ATTLIST contato codigo NMTOKEN #REQUIRED>

<xsd:schema xmlns:xsd=".../XMLSchema"> <xsd:element name="contato"> <xsd:complexType> <xsd:attribute name="codigo" use="required">

• É XML, porém mais complexo• Suporta namespaces• Permite definição de tipos

• Simples mas não é XML• Não suporta namespaces• Limitado quando a tipos de dados

Page 14: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

14

Atributos

Elementos

Um DTDUm DTD

<!ELEMENT astro (imagem*) ><!ELEMENT imagem EMPTY >

<!ATTLIST imagem href CDATA #REQUIRED >

<!ATTLIST astro id ID #REQUIRED ><!ATTLIST astro nome CDATA #REQUIRED ><!ATTLIST astro diametrokm NMTOKEN #IMPLIED >

Tipos de dados simples(somente para atributos)

Modelo de conteúdo (tipo de dados complexo)

Atributo sempreassociado a elemento

<astro id="p05" nome="Jupiter"> <imagem href="jup31.jpg" /> <imagem href="jup32.jpg" /></astro>

Exemplo de documento válidoem relação a este DTD

Page 15: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

15

Um XSD equivalenteUm XSD equivalente

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="astro" type="astroType" /> <xs:element name="imagem" type="imagemType"/> <xs:attribute name="href" type="xs:anyURI"/> <xs:attribute name="id" type="xs:ID"/> <xs:attribute name="nome" type="xs:string"/> <xs:attribute name="diametrokm" type="xs:decimal"/> <xs:complexType name="imagemType"> <xs:attribute ref="href" use="required"/> </xs:complexType> <xs:complexType name="astroType"> <xs:sequence> <xs:element ref="imagem" minOccurs="0"/> </xs:sequence> <xs:attribute ref="id" use="required"/> <xs:attribute ref="nome" use="required"/> <xs:attribute ref="diametrokm"/> </xs:complexType></xs:schema>

Definição detipos de dados

Elementos

Atributos

● Esta não é a única forma de construir XML schemas

Page 16: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

16

Fundamentos XML Schema: TiposFundamentos XML Schema: Tipos

● Há duas qualidades de tipos● Tipos simples representam tipos de dados básicos

como texto, números, tokens, booleanos– Fazem parte do namespace do XML Schema (requerem

prefixo associado ao identificador do namespace), por exemplo: xs:int, xs:string

● Tipos complexos representam estruturas do documento como entidades, atributos, etc.– Podem fazer parte do namespace default do próprio

documento (e não necessitar de prefixo) se definidos localmente

Page 17: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

17

Tipos simples do XML SchemaTipos simples do XML SchemaanySimpleType

duration dateTime time date gYearMonth gYear gMonth gDay

string

normalizedString

token

language Name NMTOKEN

NCName NMTOKENS

ID IDREF ENTITY

IDREFS ENTITIES

decimal

integernonPositiveInteger nonNegativeInteger

negativeInteger

positiveInteger

long

int

short

byte

unsignedLong

unsignedInt

unsignedShort

unsignedByte

boolean base64binary

hexbinary

float double anyURI QName NOTATION

Page 18: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

18

<element><element>● Define um elemento● Deve estar associado a um tipo de dados...

– por referência ...

– ... ou embutido

<xs:complexType name="cometaType"> <xs:attribute name="id" type="xs:ID" use="required"/> <xs:attribute name="nome" type="xs:string" use="required"/> <xs:attribute name="planetas" type="xs:IDREFS"/></xs:complexType><xs:element name="cometa" type="cometaType" />

<xs:element name="cometa"> <xs:complexType> <xs:attribute name="id" type="xs:ID" use="required"/> <xs:attribute name="nome" type="xs:string" use="required"/> <xs:attribute name="planetas" type="xs:IDREFS"/> </xs:complexType></xs:element>

Page 19: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

19

<attribute><attribute>

● Define um atributo● Pode estar embutido na definição de um tipo ou

globalmente acessível (para reutilização)

<xs:attribute name="raio" type="xs:decimal"/>

<xs:complexType name="sateliteType"> <xs:complexContent> <xs:extension base="astroType"> <xs:attribute ref="raio" use="required"/> <xs:attribute name="anoDesc" type="xs:int"/> </xs:extension> </xs:complexContent></xs:complexType>

Page 20: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

20

<complexType><complexType>

● Tipo que pode conter outros elementos ou atributos

<xs:complexType name="imagemType"> <xs:attribute name="href" type="xs:anyURI"/></xs:complexType>

<xs:complexType name="astroType"> <xs:sequence> <xs:element ref="imagem" minOccurs="0"/> <xs:element name="satelite" type="sateliteType" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="id" type="astroID" use="required"/> <xs:attribute name="nome" type="xs:token" /> <xs:attribute name="diametrokm" type="xs:decimal"/></xs:complexType>

Page 21: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

21

<sequence><sequence>

● Permite definir uma seqüência de elementos● Equivalente ao modelo de conteúdo (a, b, c) no

DTD<xs:element name="sistemaEstelar"> <xs:complexType> <xs:sequence> <xs:element name="centro" type="centroType"/> <xs:element name="orbita" type="orbitaType" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="cometa" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType></xs:element>

Equivale, em DTD, a (centro, orbita*, cometa*)

Page 22: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

22

<choice><choice>

● Permite escolher um elemento de um conjunto● Equivalente ao modelo de conteúdo (a | b | c) no

DTD<xs:complexType name="orbitaType"> <xs:choice> <xs:element name="estrela" type="estrelaType"/> <xs:element name="planeta" type="sateliteType"/> <xs:element name="asteroide" type="sateliteType" minOccurs="0" maxOccurs="unbounded"/> </xs:choice> <xs:attribute name="raioMedUA" type="xs:decimal"/></xs:complexType>

Equivalente a (estrela | planeta | asteroide*)

Page 23: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

23

Mapeamento XML JavaMapeamento XML Java

● Os tipos primitivos do XML Schema são mapeados a tipos primitivos da linguagem Java

● A tabela ao lado relaciona os mapeamentos

Page 24: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

24

Compilador de schemaCompilador de schema● Em JAXB, um esquema (DTD, XSD ou outro) está

associado a uma classe; documentos individuais (instâncias XML) estão associados a objetos

● Para gerar uma classe (e código auxiliar) a partir de um esquema, usa-se o compilador xjc

● Objetos criados a partir da classe gerada podem ser persistidos em XML

Classe Java

xjcEsquema XML(DTD, XSD, ...)

Java BindingSchema opcional

Binding

XMLunmarshal()

marshal()

Objeto JavaJAXB

Marshalling/Unmarshalling

Page 25: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

25

Um exemplo: JAXB passo-a-passoUm exemplo: JAXB passo-a-passo

● 1. Escrever o XML Schema● 2. Compilar o Schema e gerar classes● 3. Usar as classes para criar objetos● 4. Gravar objetos em XML● 5. Ler objetos do XML

Page 26: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

26

Passo 1: escrever o schemaPasso 1: escrever o schema<?xml version="1.0" encoding="iso-8859-1" ?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="contato" type="tipoContato" /> <xsd:complexType name="tipoContato"> <xsd:sequence> <xsd:element name="nome" type="xsd:string"/> <xsd:element name="telefone" type="tipoTelefone"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="tipoTelefone"> <xsd:sequence> <xsd:element name="ddd" type="xsd:int"/> <xsd:element name="numero" type="xsd:int"/> </xsd:sequence> </xsd:complexType></xsd:schema>

Page 27: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

27

Exemplos de XML compatíveisExemplos de XML compatíveis

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?> <contato> <nome>Bug Informática Ltda.</nome> <telefone> <ddd>19</ddd> <numero>77779191</numero> </telefone> </contato>

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?> <contato> <nome>Bug Informática Ltda.</nome> <telefone> <ddd>19</ddd> <numero>77779191</numero> </telefone> </contato>

Page 28: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

28

Passo 2: gerar as classesPasso 2: gerar as classes

● Configure as variáveis de ambiente e classpath– JWSDP_HOME– JAXB_HOME=$JWSDP_HOME/jaxb

● Execute a ferramenta xjc● $JWSDP_HOME/jaxb/bin/xjc.sh

-d gen.src -p agenda contato.xsd

● Nosso exemplo usa o Ant:<target name="compile-jaxb" ...> <java jar="${jaxb.home}/lib/jaxb-xjc.jar" fork="true"> <arg line="-d ${gen} -p ${pacote} ${etc}/contato.xsd"/> </java></target>

Page 29: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

29

Classes geradasClasses geradasPacote agenda.impl.runtime●ErrorHandlerAdaptor.java●ValidationContext.java●SAXUnmarshallerHandlerImpl.java●AbstractUnmarshallingEventHandlerImpl.java●ValidatableObject.java●NamespaceContextImpl.java●UnmarshallableObject.java●ContentHandlerAdaptor.java●Discarder.java●ValidatorImpl.java●Util.java●SAXUnmarshallerHandler.java●DefaultJAXBContextImpl.java●InterningUnmarshallerHandler.java●SAXMarshaller.java●GrammarInfo.java●UnmarshallingContext.java●GrammarInfoImpl.java●GrammarInfoFacade.java●ValidatingUnmarshaller.java

●Pacote agenda.impl●ContatoImpl.java●JAXBVersion.java●TipoContatoImpl.java●TipoTelefoneImpl.javaPacote agenda.●Contato.java●ObjectFactory.java●TipoContato.java●TipoTelefone.java●bgm.ser●jaxb.propertiesPacote agenda.impl.runtime●NamespaceContext2.java●UnmarshallingEventHandler.java●UnmarshallingEventHandlerAdaptor.java●PrefixCallback.java●MSVValidator.java●UnmarshallerImpl.java●MarshallerImpl.java●XMLSerializable.java●XMLSerializer.java

39 arquivos!

Page 30: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

30

Passo 3: usar classes geradas...Passo 3: usar classes geradas...

● ... para construir um objeto ContatoObjectFactory fabrica = new ObjectFactory();Contato contato = fabrica.createContato();contato.setNome("Nome");TipoTelefone tel =

fabrica.createTipoTelefone();contato.setTelefone(tel);contato.getTelefone().setDdd(11);contato.getTelefone().setNumero(1234567);

Page 31: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

31

Passo 4: serializar para XMLPasso 4: serializar para XML

● Gravação no arquivo XML arquivo

JAXBContext ctx = JAXBContext.newInstance("agenda");Marshaller marsh = ctx.createMarshaller();marsh.setProperty("jaxb.formatted.output", new Boolean(true));marsh.setProperty("jaxb.encoding", "iso-8859-1");File xmlf = new FileOutputStream(arquivo);marsh.marshal(contato, xmlf);

Page 32: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

32

Passo 5: ler do XMLPasso 5: ler do XML

● Arquivos XML estão em diretório xml.db (dir). Código abaixo é para cada arquivo arqXML.File arquivo = new File(dir, arqXML);JAXBContext ctx = JAXBContext.newInstance("agenda");Unmarshaller unmarshaller = ctx.createUnmarshaller();Contato contato = (Contato) unmarshaller.unmarshal(arquivo);String nome = contato.getNome();TipoTelefone tel = contato.getTelefone();String telefone = "("+tel.getDdd()+")"+tel.getNumero();

Page 33: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

33

DemonstraçãoDemonstração● Aplicação simples que utiliza o esquema mostrado

– Usa esquema (W3C XML Schema) para gerar classes– Cria cinco objetos usando classes geradas– Serializa os objetos em cinco documentos XML– Lê e desserializa os documentos XML e obtém objetos

● Para executar, é preciso– Ant (o script está em um build.xml)1.3 ou superior– Java Web Services Development Pack 1.3 ou superior– Definir variáveis de ambiente (build.properties)

● Targets– ant run.criar (cria objetos e grava XMLs em xml.db/)– ant run.listar (lista dados obtidos dos arquivos XML)

Page 34: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

34

ConclusõesConclusões● Esta palestra explorou os principais recursos do JAXB, que

são a capacidade de ler e gravar documentos XML de forma transparente, através da geração automática de código Java e documentos XML

● Vários aspectos importantes foram deixados de fora, como

– Validação na leitura e na gravação

– Manipulação de esquemas mais complexos (documentos compostos, com namespaces, imports, atributos, tipos estendidos, herança, etc.)

– Uso de configurações opcionais

– Aplicações em transformação XML e Web Services● Aprenda mais sobre JAXB nos links a seguir...

Page 35: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

35

FontesFontes

● Página principal. java.sun.com/xml/jaxb/

● Java Web Services Tutorial. java.sun.com/webservices/docs/1.4/tutorial/doc/JAXBWorks.html

● Fordin, Scott. Java Architecture for XML Bindingwwws.sun.com/software/xml/developers/jaxb/

● Shelby, J. Developing with JAXB and Antwww.onjava.com/pub/a/onjava/2002/03/06/jaxant1.html

● Steinberg, D. et al. Tutorial: Data Binding with JAXB. www-106.ibm.com/developerworks/edu/x-dw-xjaxb-i.html

Page 36: JustJava 2004: JAXB

argo

navi

s.co

m.b

rar

gona

vis.

com

.br

aabbxxjj

36

Esta palestra e código-fonte usado nos

exemplos demonstrados estão disponíveis em

www.argonavis.com.br/justjava2004

bbaaxxjj

< >