• Nenhum resultado encontrado

< > a m l. b x. helder.da.rocha. inding. argonavis.com.br

N/A
N/A
Protected

Academic year: 2021

Share "< > a m l. b x. helder.da.rocha. inding. argonavis.com.br"

Copied!
36
0
0

Texto

(1)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

1

v

b

b

a

a

x

x

j

j

a

ml

helder.da.rochahelder@argonavis.com.br argonavis

argonavis.com.br.com.br

2004

inding

< >

(2)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

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

Objetivos

(3)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

3

Mapeamento Java - XML

Mapeamento Java - XML

Como integrar aplicações Java com XML?

Alternativas tradicionais: APIs nativas –

JAXP

SAX – leitura seqüencial

com captura de eventos

DOM – montagem de

árvore de elementos na memória

Desvantagens:

Requerem conhecimento

de XML, uso de APIs burocráticas, ...

Queremos persistência sem precisar ver XML

JAXP Documento XML EstiloXSLT Documento XML / HTML DOM SAX Texto DOM

(4)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

4

O que é “XML data binding”?

O que é “XML data binding”?

Mapeamento entre

Classe – Esquema XML

Objeto – Instância (documento) XML

Conta codigo: String nome: String saldo: double conta_4:Conta codigo="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

(5)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

5

Transparência com XML binding

Transparê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

(6)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

6

Solução para persistência de dados

Solução para persistência de dados

Usando serialização Java

Usando mapeamento Java-XML

Byte BLOB writeObject() readObject() marshal() unmarshal() <xml> <xml> <xml>

(7)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

7

JAXB

JAXB

J

ava

A

rchitecture for

X

ML

B

inding

Parte do Java Web Services Development Pack 1.3/1.4Interface 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,

(8)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

8

Arquitetura

Arquitetura

Fonte: java.sun.com/jaxb/

(9)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

9

Típico processo JAXB

Típico processo JAXB

Gerar classes usando o compilador e um XSDCompilar 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.

(10)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

10

Processo JAXB

Processo JAXB

Fonte: java.sun.com/jaxb/

(11)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

11

Principais classes e pacotes

Principais 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 XMLValidator – 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.

(12)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

12

O q

O q

ue é um Esquema XML?

ue é um Esquema XML?

O esquema representa uma classe

Os documentos são instâncias

Esquema (universo de documentos válidos) Documentos que aderem à

especificação (válidos)

Documento fora da especificação

Como definir esquemas:

DTD - Document Type Definition

(13)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

13

DTD vs. XML Schema

DTD 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

(14)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

14 Atributos Elementos

Um DTD

Um 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 sempre associado a elemento

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

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

(15)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

15

Um XSD equivalente

Um 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 de tipos de dados Elementos Atributos

(16)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

16

Fundamentos XML Schema: Tipos

Fundamentos 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

(17)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

17

Tipos simples do XML Schema

Tipos simples do XML Schema

anySimpleType

duration dateTime time date gYearMonth gYear gMonth gDay

string

normalizedString token

language Name NMTOKEN NCName NMTOKENS ID IDREF ENTITY IDREFS ENTITIES decimal integer nonPositiveInteger nonNegativeInteger negativeInteger positiveInteger long int short byte unsignedLong unsignedInt unsignedShort unsignedByte boolean base64binary hexbinary

(18)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

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>

(19)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

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>

(20)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

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"/>

(21)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

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>

(22)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

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>

(23)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

23

Mapeamento XML Java

Mapeamento XML Java

Os tipos primitivos do

XML Schema são

mapeados a tipos

primitivos da linguagem

Java

A tabela ao lado

relaciona os

mapeamentos

(24)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

24

Compilador de schema

Compilador 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 xjc Esquema XML (DTD, XSD, ...) Java Binding Schema opcional Binding XML unmarshal() marshal() Objeto Java JAXB Marshalling/Unmarshalling

(25)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

25

Um exemplo: JAXB passo-a-passo

Um 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

(26)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

26

Passo 1: escrever o schema

Passo 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>

(27)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

27

Exemplos de XML compatíveis

Exemplos 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>

(28)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

28

Passo 2: gerar as classes

Passo 2: gerar as classes

Configure as variáveis de ambiente e classpath

JWSDP_HOMEJAXB_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>

(29)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

29

Classes geradas

Classes geradas

Pacote agenda.impl.runtimeErrorHandlerAdaptor.javaValidationContext.javaSAXUnmarshallerHandlerImpl.javaAbstractUnmarshallingEventHandlerImpl.javaValidatableObject.javaNamespaceContextImpl.javaUnmarshallableObject.javaContentHandlerAdaptor.javaDiscarder.javaValidatorImpl.javaUtil.javaSAXUnmarshallerHandler.javaDefaultJAXBContextImpl.javaInterningUnmarshallerHandler.javaSAXMarshaller.javaGrammarInfo.javaUnmarshallingContext.javaGrammarInfoImpl.javaGrammarInfoFacade.javaValidatingUnmarshaller.javaPacote agenda.implContatoImpl.javaJAXBVersion.javaTipoContatoImpl.javaTipoTelefoneImpl.java Pacote agenda.Contato.javaObjectFactory.javaTipoContato.javaTipoTelefone.javabgm.serjaxb.properties Pacote agenda.impl.runtimeNamespaceContext2.javaUnmarshallingEventHandler.javaUnmarshallingEventHandlerAdaptor.javaPrefixCallback.javaMSVValidator.javaUnmarshallerImpl.javaMarshallerImpl.javaXMLSerializable.javaXMLSerializer.java 39 arquivos!

(30)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

30

Passo 3: usar classes geradas...

Passo 3: usar classes geradas...

... para construir um objeto Contato

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

(31)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

31

Passo 4: serializar para XML

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

(32)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

32

Passo 5: ler do XML

Passo 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 =

(33)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

33

Demonstração

Demonstração

Aplicação simples que utiliza o esquema mostrado

Usa esquema (W3C XML Schema) para gerar classesCria 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 superiorJava Web Services Development Pack 1.3 ou superiorDefinir 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)

(34)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

34

Conclusões

Conclusõ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

(35)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

35

Fontes

Fontes

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 Binding

wwws.sun.com/software/xml/developers/jaxb/

Shelby, J. Developing with JAXB and Ant

www.onjava.com/pub/a/onjava/2002/03/06/jaxant1.html

Steinberg, D. et al. Tutorial: Data Binding with

(36)

ar gonav is.c om .b r ar gonav is.c om .b r

a

a

b

b

j

j

x

x

36 Esta palestra e

código-fonte usado nos exemplos demonstrados estão disponíveis em

www.argonavis.com.br/justjava2004

b

b

a

a

x

x

j

j

< >

Referências

Documentos relacionados

With this data, the descriptive analysis of the following phytosociological parameters for the species was performed: frequency (Fr) = number of plots containing the species/

Repare-se que no caso não newtoniano o carácter reofluidicante dos fluidos implica que um valor adimensional do gradiente de pressão de 8 irá produzir uma

Peregrinos polônicos de Bento Gonçalves Dia 10 de julho passado, mais de 20 pessoas de Braspol de Bento Gonçalves (cidade da Serra Gaúcha, distante 120 km de Porto

O discente principal que contem no anúncio é a frase “Não deixe que as florestas do Brasil fiquem no passado”, e outro discente que também pode ser percebido é o fato

PROFESSOR DE EDUCAÇÃO ESPECIAL – Identificar, elaborar, produzir e organizar serviços, recursos pedagógicos, de acessibilidade e estratégias, considerando as necessidades

O presente termo de Solicitação de Proposta tem por objeto a contratação de uma empresa especializada em confecção e instalação de outdoor em rodovias próximas as Unidades de

O (A) CANDIDATO (A) NÃO ANEXOU A DOCUMENTAÇÃO REQUERIDA (CURRÍCULO LATTES). 9484 VALESKA FERREIRA OLIVEIRA DEFERIDO - 9239 VALQUIRIA DA SILVA COSTA DEFERIDO - 9106

PRESTAÇAO DE CONTAS ORDENADOR DE DESPESAS REF A 2011 Documento(s) Anexo(s) na Origem : Não Cadastrado (13648-2/2014) 1 volume.. BENS PATRIMONIAIS MANOEL SEVERINO