Upload
helder-da-rocha
View
43
Download
1
Embed Size (px)
Citation preview
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
< >
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
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
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
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
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>
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.
argo
navi
s.co
m.b
rar
gona
vis.
com
.br
aabbxxjj
8
ArquiteturaArquitetura
Fonte: java.sun.com/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.
argo
navi
s.co
m.b
rar
gona
vis.
com
.br
aabbxxjj
10
Processo JAXBProcesso JAXB
Fonte: java.sun.com/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.
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
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
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
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
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
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
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>
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>
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>
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*)
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*)
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
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
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
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>
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>
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>
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!
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);
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);
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();
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)
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...
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
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
< >