infraestrutura para sistemas java ee

262
7/21/2019 Infraestrutura para Sistemas Java EE http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 1/262 Java Message Service Enterprise JavaBeans Web Services com JAX-WS e JAX-RS Clientes Ajax com JavaScript, JQuery, HTML e CSS Helder da Rocha  ([email protected]) Infraestrutura de sistemas Java EE

Upload: helder-da-rocha

Post on 05-Feb-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 1/262

Java Message Service 

Enterprise JavaBeansWeb Services com JAX-WS e JAX-RSClientes Ajax com JavaScript, JQuery, HTML e CSS

Helder da Rocha ([email protected])

Infraestrutura de sistemas 

Java EE

Page 2: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 2/262

Sobre este tutorial !  Este material foi originalmente escrito por Helder da Rocha em agosto

de 2013 (para um treinamento contradado sob demanda), e poderá serusado de acordo com os termos da licença Creative Commons BY-SA

(Attribution-ShareAlike) descrita em

http://creativecommons.org/licenses/by-sa/3.0/br/legalcode 

!  Parte do código usado em exemplos e exercícios pode ser baixado dos

seguintes repositórios!

 

https://github.com/helderdarocha/cursojaxrs 

https://github.com/helderdarocha/cursojaxws 

https://github.com/helderdarocha/ExercicioMinicursoJMS 

https://github.com/helderdarocha/JavaXMLExamples 

Para treinamento presencial, particular ou online entre em contato:!  Helder da Rocha ( www.argonavis.com.br  )

[email protected] 

WebServices em Java EE 7 (31-08-2013)Java Message Service 2.0 (31-08-2013)

Integração de sistemas com Java EE (05-12-2013)Aplicações Web dinâmicas (18-03-2014)

2

Page 3: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 3/262

Conteúdo resumido

1. Enterprise JavaBeans e Java Message Service:Arquiteturas de sistemas distribuídos,Serviços síncronos e assíncronosJava RMI e Java Messaging; EJB e MDB

2. 

Tecnologias para representação de dados:

XML, XML Schema, XPath, JSON, DOM, SAX, JAXP e JAXB

3. SOAP Web Services:Aplicações em Java usando JAX-WS e Java EE 7

4. REST Web Services:

Aplicações em Java usando JAX-RS e Java EE 7

5. Clientes Ajax para serviços JavaInfraestrutura: HTML5, CSS e JavaScriptClientes dinâmicos para Web Services usando Ajax e JQuery

3

Page 4: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 4/262

Conteúdo detalhado (1)

(1) Enterprise JavaBeans e Java Message Service

1. 

Métodos de comunicação síncrono e assíncrono!  Arquiteturas!  Tecnologias

2. 

Session Beans com clientes locais e remotos3.  Messaging e Java Message Service (JMS)

!  Configuração de ambiente!  JMS API: conexões, sessões, produtores, consumidores, mensagens

Criação de produtores e consumidores JMS4.

 

Message Driven Beans

5.  JMS 2.0 (Java EE 7)

4

Page 5: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 5/262

Conteúdo detalhado

(2) Representação de dados: XML e JSON1.

 

Formatos de dados usados em Web Services!  XML!  JSON

2. 

XML!  Tecnologias XML: DTD, XML Schema, XPath!  APIs de manipulação do XML - JAXP: DOM, SAX, StAX e TrAX!  XML Java Binding: JAXB

3. 

JSON!  JSON

!  JSON Java APIs!  JSON Java Binding

5

Page 6: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 6/262

Conteúdo detalhado

(3) SOAP Web Services

1.  Introdução a SOAP Web Services!  Fundamentos da tecnologia!  Protocolos e mensagens: SOAP, WSDL

2.  Como criar um serviço SOAP com EJB e JAX-WS!  Como componente Web!

 

Como session bean

3.  Como criar um cliente SOAP usando JAX-WS!  Tipos de clientes!  Cliente estático!  Clientes dinâmicos

4. 

Tópicos avançados!  Handlers e MessageContext!  WS-Addressing!  WS-Security!  SOAP sobre JMS

6

Page 7: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 7/262

Conteúdo detalhado

(4) REST Web Services1.  Introdução a REST

!  Arquitetura REST! 

Fundamentos de WebServices usando REST

2.  Como criar um serviço RESTful usando JAX-RS!

 

MediaTypes, resources, parâmetros!  Anotações @Path, @PathParam, etc.!  Metadados, ResponseBuilder e URIBuilders!  Estratégias de segurança e contextos

3.  Como criar um cliente RESTful!

 

Usando comunicação HTTP simples!  Usando APIs RESTEasy e Jersey!  Clientes RESTful em aplicativos Web e mobile!  WADL e JAX-RS 2.0

7

Page 8: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 8/262

Conteúdo detalhado

(5) Clientes Web1.  Introdução a interfaces Web estáticas

!  HTML e CSS essencial! 

Formulários do HTML!  Document Object Model! 

JavaScript essencial2.  Interfaces Web dinâmicas

!  Manipulação da árvore DOM com JavaScript!  Alteração de classes CSS! 

Recursos essenciais do HTML5 e CSS3! 

Ajax e comunicação com Web Services3. JQuery essencial

!  Seletores e acesso a dados em HTML, XML e JSON!  Ajax usando JQuery!  Formulários dinâmicos! 

Boas práticas e técnicas essenciais para aplicações assíncronas

8

Page 9: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 9/262

Agenda de treinamento (40h)

1

EJBJMS

2

XMLJSON

3

SOAPWeb Services

JAX-WS

4

RESTWeb Services

JAX-RS8h

Dia 1 Dia 2 Dia 4

9

Dia 3

JavaScript JQuery HTML/CSS

Dia 5(opcional)

Page 10: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 10/262

Estrutura das aulas

Apresentação e discussão!  Demonstrações e exemplos

!  Exercícios práticos em sala

Referências adicionais!  Especificações

!  Tutoriais

!  Artigos

!  Documentação de produtos

Fontes para pesquisa, discussão e aprofundamento

!  Ferramentas

10

Page 11: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 11/262

Instrutor

!  Helder da Rocha (Argo Navis)

!  Mestre em informática (UFCG, 1999)

!  Autor de cursos e apostilas sobre Java, Java

EE, Arquitetura da JVM, Design Patterns, Ant &Maven, HTML5 e CSS, SVG, JavaScript, Perl, iOS3, 4 e 5, Objective-C. Autor de livros de HTML,CSS e JavaScript (1996, IBPI Press)

!  Autor de tutoriais do site argonavis.com.br

Também ator, músico, artista visual epaleoartista

www.argonavis.com.br  (apenas TI)

!  www.helderdarocha.com.br  (tudo menos TI)

[email protected]

11

Page 12: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 12/262

EJB e JMSArquitetura de sistemas distribuídos, serviços síncronose assíncronos, Java RMI e Java Messaging, EJB e MDB

1Infraestrutura de sistemas

Java EE

Page 13: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 13/262

Conteúdo

1. 

Métodos de comunicação síncrono e assíncrono!  Arquiteturas

!  Tecnologias

2. 

Session Beans com clientes locais e remotos

3. 

Messaging e Java Message Service (JMS)!  Configuração de ambiente

!  JMS API: conexões, sessões, produtores, consumidores, mensagens

!  Criação de produtores e consumidores JMS

4. 

Message Driven Beans

5. 

JMS 2.0 (Java EE 7)

13

Page 14: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 14/262

Métodos de comunicação

Síncrono: cliente chama oserviço e espera pelofim da execução daoperação

!  RPC

Assíncrono: cliente chamao serviço e não espera aoperação terminar

!  Messaging

14

operacao()

fim

chamada

continua

operacao()

continua

chamada

espera

fim

Page 15: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 15/262

Comunicação entre objetos

Local (mesma JVM)! 

Síncrono, passagem do objeto por referência (comportamento default para objetos)

Síncrono, passagem do objeto por valor (cópia do estado deobjetos via clone() ou serialização)

Assíncrono (eventos, listeners, observers)

Remota (JVMs diferentes)!  Síncrono, via proxy (passagem do objeto por referência) –

tecnologias RMI/JRMP, RMI/IIOP, SOAP

!  Síncrono, via objeto serializado (passagem do objeto por valor) –tecnologia Java (java.io.Serialization), XML (JAXB, Web Objects),JavaScript (JSON)

Assíncrono, via mediador (JMS, SOAP Messaging)

15

Page 16: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 16/262

Acesso local síncrono!  Referência de memória !  Value objects

16

...

...

...

341

 xyz

0xF934A5

pilha heap...

Point

int x = 1

int y = 1int z = 1

115

 xyz

0xF93FF9

...

0xF934A5

0xF93FF9

0xF934A5

p1

p2

p3

Point p1, p2, p3; p1 = new Point(); p2 = new Point(); p3 = p2; p2.x = 3; p1.y = 4; p3.z = 5;

3 referências2 objetos

...

...

...

141

 xyz

0xF9AF8B

pilha heap

...0xF9A119

...

0xF9AF8B

0xF9A119

0xF9B119

p1

p2

p3

Point c1, c2, c3;c1 = new Point();c2 = c1.clone();ostream.writeObject(c2);c3 = (Point)istream.readObject(); p2.x = 3; p1.y = 4; p3.z = 5;

Point é Serializable.ostream é ObjectOutputStreame istream é ObjectInputStreamconectados ao mesmo node.

3

11

 x

yz

115

 xyz

0xF9B119

Page 17: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 17/262

Acesso local assíncrono! 

Notificações usando referências locais

Padrão Observer!  Exemplo: listeners de eventos do sistema operacional

17

ListenerDoBotaoactionPerformed(ActionEvent)

ListenerDeCliquesmouseEntered(MouseEvent)

mouseExited(MouseEvent)

...

1. Registra-se

1. Registra-se

«interface» ActionListener 

actionPerformed(...)

«interface» MouseListener

mouseEntered(...)

mouseExited(...)

...

2. Usuário clicano botão

x = 344y = 230

#=0xF93A16B

...

...

Fonte: Botão Evento capturado peloS.O. contém dados sobreo clique do mouse eoutras informações

 x=344y=230

3. Envia objeto

Objeto do tipo

MouseEventcom dados sobreclique do mouse

Objeto do tipo ActionEvent com dados sobre ocomponente

actionCommandOK

3. Envia objetoJButton button =

new JButton(”OK );

ActionListener o1 =

new ListenerDoBotao();

MouseListener o2 =

new ListenerDeCliques();

button.addActionListener(o1);

button.addMouseListener(o2);

Page 18: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 18/262

«de-serializa»

bytes[]

Acesso remoto síncrono (RMI/IIOP)

!  Por referência: proxy RMI/

IIOP (java.rmi.Remote)!  Geralmente encapsulam

comportamento

!  Acessados via referênciade rede (proxy, stub)

!  Por valor: value objects (não

implementam Remote)!  Geralmente objetos que

representam estado

!  Podem ser transferidos porvalor se Serializable

18

Livro getLivro(){ ... }  

BibliotecaImpl  

…ref.getLivro();  

Cliente  

Comunicação aparente  

Livro getLivro();  

 java.rmi.Remote  

Biblioteca  

OR

OR

Proxy

IIOP  IIOP  

Internet  

Biblioteca ref = (Biblioteca) jndi.lookup(“proxy”);Livro obj = ref.getLivro(); // chamada de método remoto

ref:Biblioteca obj:Livro

proxy:Biblioteca

objRemoto:

BibliotecaImpl

getLivro(): Livro «cria»

«serializa»

obj:Livro

Referência Value object

IIOPRede

Page 19: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 19/262

Web Services: arquiteturas!  Web Services*: ambiente de computação distribuída

que usa o protocolo HTTP como camada detransporte e texto (XML, JSON) como formato de dados!

 

Solução de integração independente de linguagem (cliente e servidorpodem ser implementados em linguagens diferentes)

!  Duas arquiteturas: SOAP e REST

SOAP Web Services

!  Solução de objetos distribuídos (RMI, similar a CORBA, DCOM, DCE) que usaXML (SOAP) como protocolo de comunicação e como IDL (WSDL) paradescrição de interface de serviços

!  Também usada para messaging assíncrono

Geralmente implementada sobre HTTP

RESTful Web Services

Arquitetura de Web Services que aproveita a infraestrutura da Web comoprotocolo HTTP, tipos MIME e URIs (sem acrescentar o overhead do SOAP)

* Em 2013 (definição de ‘web services’ tem mudado desde que foi criado)

19

Page 20: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 20/262

Acesso remoto síncrono (SOAP)

Por referência: proxy JAX-WS

(Web Service SOAP)!  Gerados a partir de WSDL

Runtime JAX-WS sincronizamensagens SOAP derequisição e resposta

Por valor: value objects (XML

mapeado a objetos)!  Declarados em WSDL usando

XML Schema

Serializados (marshaled) comJAXB e anexos na msg SOAP

20

Livro getLivro(){ ... }  

BibliotecaImpl  

…ref.getLivro();  

Cliente  

Comunicação aparente  

Livro getLivro();  

WSDL 

Biblioteca  

Servidor Web

 

Runtime W S

 

ProxyHTTP  

Biblioteca ref = (Biblioteca) stub.getProxy(wsdl);Livro obj = ref.getLivro(); // chamada de método remoto

SOAP

Endpoint

ref:Biblioteca obj:Livro

proxy:Biblioteca

objRemoto:

BibliotecaImpl

getLivro(): Livro «cria»

«unmarshal»

obj:Livro

Referência Value object

SOAPRede

JAXB

«marshal»XML

Page 21: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 21/262

Acesso remoto síncrono (REST)

!  Interface remota é formada por

combinação método HTTP + URI! 

Método Java remotomapeado à URI e métodoHTTP responde a requisição

Cliente Java local precisaconstruir requisição HTTP e

depois decodificar dados daresposta HTTP (ex: com JAXB)

!  Pode haver value objects (XML

ou JSON mapeado a objetos)! 

Serializados (marshaled) comJAXB em formato JSON ouXML e anexados emrequisições e respostas

21

Livro getLivro() {}  

Servlet: doGet(){ getLivro() }  

GET /livro/123

Cliente   Requisição HTTP  

Servidor Web

 

Cliente HTTP 

JAXB

Resposta HTTP  

HttpURLConnection con = new URL("http://host/livro/123").openConnection();BufferedReader r = new BufferedReader(new InputStreamReader(con.getInputStream()));

String json = rd.readLine(); // objeto recebido como JSON string precisa ser decodificado

JAXB

GET /livro/123 obj:Livro

@Path(/livro/{c})

getLivro(c): Livro«cria»

«unmarshal»

obj:Livro

HTTP «marshal»

XML/JSON

XML/JSON

Page 22: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 22/262

Session Beans

!

 

Objeto gerenciado (Enterprise JavaBean)!  Ciclo de vida gerenciado pelo container (com

callbacks configuráveis via anotações)

!  Permite configuração declarativa de serviços (transações,segurança, etc.)

Pode oferecer serviço síncrono local ou remoto

!  Três tipos! 

Stateless – propósito geral, sem garantir estado entre chamadas

Stateful – preserva estado entre chamadas de mesmo cliente

Singleton – compartilha estado entre clientes, suporta inicializaçãoprévia @Startup e cadeias de beans dependentes @DependsOn

Pode ser configurado via anotações e/ou ejb-jar.xml

22

Page 23: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 23/262

Stateless local bean

!

 

Mais simples!  Anotação @Stateless e vários comportamentos default

(transações, ciclo de vida, etc)

!  Se não houver declaração @Local ou @Remote, todos os métodosautomaticamente são incluídos(no-interface)

!

 

Se houver interface @Local, apenas métodos declarados nainterface serão gerenciados

23

@Statelesspublic class CalculatorBean implements Calculator {

public float add (int a, int b) {return a + b;

}

public float subtract (int a, int b) {return a - b;

}} @Local

public interface Calculator {public float add (int a, int b);public float subtract (int a, int b);

}

Page 24: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 24/262

Exemplo de cliente SB local

!

 

Outros objetos dentro do servidor de aplicaçõespodem referir-se ao serviço do EJB através deJNDI ou injeção de recursos/dependências!  Nome da classe do bean (tipo) é usado em JNDI e em DI

!  Chamada de métodos é igual ao uso normal de Java standalone

Objetos retornados são referências, sejam ou não gerenciados

24

!"#$#%&'(&#$*+,-./ /-#00 1#-/+-#2345&,(&#$ 6

!78(*4.9#2& !"#$%#"&'( /#-/:*4.9#2& ;-3#2 *<= *>= 4&0+-2:

*+,-./ ?24.$% /#-/+-#2&@A 64&0+-2 B /#-/C#''@*<= *>A:4&2+4$ $+--:

DE

D

…public CalculatorWebBean () {  Context jndi =

new InitialContext(); 

calc = (Calculator)jndi.lookup(“Calculator”);

}…

Inicialização usando JNDI em construtor(em vez de usar de @EJB)

Page 25: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 25/262

Stateless remote (IIOP) bean

!  Permite acesso remoto (clientes de outras JVMs)

!  Exporta OMG IDL (independente de linguagem)

Como criar!  Fornecer uma interface anotada com @Remote para o session bean

25

@Statelesspublic class CalculatorBean implements Calculator {

public float add (int a, int b) {return a + b;

}public float subtract (int a, int b) {return a - b;

}} @Remote

public interface Calculator {public float add (int a, int b);public float subtract (int a, int b);

}

Page 26: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 26/262

Clientes remotos (RMI/IIOP)

!

 

Precisam obter autorização de acesso e baixarproxy de rede (stub) para realizar a comunicação!  Cliente Java standalone pode obter via JNDI (pode ser preciso

configurar autorização de acesso externo para o serviço EJB)

!  Cliente executando em container Java EE pode obter stub através

de injeção de dependências @Inject ou resource @EJB!  Clientes IIOP podem usar o IDL do serviço e ferramentas para gerar

componentes em outras linguagens (mas isto, hoje, é 100x mais fácilcom Web Services)

!  Uma vez obtido o proxy, métodos remotos podem ser

chamados normalmente como se fossem locais!  Valores retornados podem ser value objects (serializados) ou proxies 

para objetos remotos: há diferença se comparado ao acesso local

26

Page 27: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 27/262

Exemplo de cliente SB remoto

!

 

Se não estiver em container, precisa ter acesso aremoto a componente cliente JNDI!  Requer configuração (veja configuração JNDI para clientes JMS)

!  Objetos retornados em métodos são value objects (serializados) amenos que sejam também proxies para objetos remotos (SB)

27

public class CalculatorClient {

  public static void main(String[] args) throws Exception {

  Context jndi = new InitialContext(); // conf. via jndi.properties  String nome = “java:/global/mathbeans/Calculator”;

  Calculator calc = (Calculator) jndi.lookup(nome);

  BigDecimal result = calc.add(3, 4);  }}

Proxy (referência)Value object

Page 28: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 28/262

Messaging e JMS

!

 

Messaging! 

Método de comunicação assíncrono

!  Permite comunicação com baixo acoplamento

!  Provedor de serviços de messaging(Message Oriented Middleware – MOM)!  Aplicação que oferece o serviço de enfileiramento de mensagens

!  Disponibiliza infraestrutura de mediação de mensagens, fábrica paracriação de conexões, filas e tópicos para troca de mensagens

!  Oferece serviços adicionais como transações, segurança, QoS, etc.

Java Message Service!  API Java que consiste de uma coleção de interfaces uniformes para

serviços de messaging

!  Permite escrever aplicações que irão rodar em diferentes provedores

28

MOM

C

S S

C

C

C

Page 29: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 29/262

MOM

Messaging vs. RMI/RPC

!  Sistema de Messaging

!  Protocolo comum:mensagem

!  Sistema RMI/RPC

(Java RMI, CORBA, WS)

!  Protocolo comum:interface dos objetos

Message Broker

ORB

049CF&23'3@A:

stub

Cliente

ORB

049CF&23'3@A:

stub

Cliente

ORB

skeleton

F&23'3@A 6GG CCC

D

Objeto Remoto

Inter-ORB Protocol / SOAP

F3FC0&$'@F0%A:

Remetente

3$"&00#%&@F0%A6 C C CD

Destinatário

msgmsg

i   n  s  c r   e v  e -  s  e  

notifica

29

Page 30: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 30/262

Java Message Service 1.1!

  Serviço JMS age como um mediador entre

clientes produtores e consumidores!  Ponto de comunicação (destino): fila ou tópico

!  Produtores e consumidores comunicam-se comum destino comum através de mensagens

!  Permite recebimento síncrono (blocking

method) ou assíncrono (listener de eventos)!  Permite transferir dados, texto, tipos primitivos,

objetos serializados, XML, JSON, etc.

!  JMS API!  Objetos gerenciados (obtidos via injeção de

recursos ou JNDI): destinos e conexões!  Abstract Factory: interfaces para conexões

(multithreaded), sessões (um thread),produtores, consumidores e mensagens

30

ConnectionFactory

Connection 

Session MessageProducer

 MessageConsumer

 Message

Destination

createSession()

jndi.lookup(factory)

createConnection()

createMessage()

create() create()

receive()send()

jndi.lookup(destination)

Page 31: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 31/262

Arquitetura JMS

JMS API

Provedor JMS  oferece:- Sistema de mensagens

- Serviços administrativos- Sistemas de controle

Cliente JMS Cliente JMSClientes: produzem econsomem mensagens

Mensagens: objetos que passam informações

entre clientes JMS

Objetos gerenciados Acessíveis via JNDI e DI

Ferramentas deadministração

do provedor

Espaço denomes JNDI

Destinostipo Fila

Destinostipo Topico

Destinos

tipo Fila

Destinos

tipo Tópico

Fábricas deConexões

Fábricas de

Conexões

Mensagem Mensagem

JNDI bind()

JNDIlookup()

Toda a comunicaçãocom o provedor JMS é

realizada através de

JNDI/DI e da API JMS

31

Page 32: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 32/262

Domínios de messaging!  Provedores de messaging distinguem dois estilos,

suportados por JMS

Ponto a ponto (PTP)

!  Publish/subscribe (pub/sub)

!  Desde JMS 1.1 pode-se usar o mesmo código para criar aplicações queusam qualquer um dos estilos

Características de PTP

!  Cada mensagem tem apenas um consumidor

!  O consumidor pode consumir a mensagem mesmo que não esteja rodandoquando ela foi enviada pelo produtor

!

 

Características de pub/sub!  Consumidores têm assinaturas para um tópico

!  Cada mensagem é enviada para todos os assinantes

!  Clientes podem consumir mensagens depois que a assinatura foi iniciada, e eleprecisa estar ativo quando a mensagem for iniciada para recebê-la (a menosque ele tenha uma assinatura durável)

32

Page 33: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 33/262

Arquitetura JMS: domínios!  Estilo ponto-a-ponto: filas, remetentes, destinatários

!  Estilo publish-subscribe: tópicos, publicadores, assinantes

33

 MessageProducer s;s.send( m1);

...s.send( m5);

 m1

 m4

Remetente s

Destinatário r

Envia

Consome

Confirma Recebimento

 m5

Fila (queue) Provedor JMS

 MessageConsumer r;

 Message m  =r.receive();

 Message m5

FIFO

 m1Publicador p

 Assinante s2

Publica

Inscreve-se em Tópico

Fornece

Tópico (topic)

Provedor JMS

 m4

 m1  Assinante s1

Inscreve-se em Tópico

Fornece

 m3

 m2 MessageProducer p; p.send( m1);

... p.send( m5);

s1.onMessage( m1);

s2.onMessage( m1);

Fila

 m5

s2.setMessageListener(listener);

s1.setMessageListener(listener);

Consumo síncronoatravés de blockingmethod

receive )

Consumo assíncrono viaimplementação de

MessageListener e

event handler method

onMessage  )

Estratégias deconsumo

síncrono ouassíncronopodem ser

usados nos doisestilos

Page 34: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 34/262

Tópicos duráveis e não-duráveis

!  Cada mensagem enviada a um tópico pode ter

múltiplos consumidores!  Depois que assinatura é iniciada, consumidor pode

receber mensagens

!  Em tópicos duráveis mensagem permanece disponívelaté que todos os assinantes a tenham retirado

Em tópicos não-duráveis assinante perde as mensagensenviadas nos seus períodos de inatividade

A

B

C

D

Mensagens recebidas

A

C

D

   t  e  m  p  o

Se tópico fornão-durável

Se tópico fordurável

A

C

D

B

!"#$%&'()

!"#$%&'+ )

!"#$%&',)

!"#$%&' -)

Produtor

Inativo

 Ativo

 Ativo

 Ativo

 AssinanteTópico

34

Page 35: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 35/262

Configuração

Clientes JMS internos a um servidor Java EE têm

várias alternativas para obter acesso a fábricas deconexões e destinos

!  Via lookup JNDI

!  Via injeção de recursos @Resource

!  Via injeção de dependências (CDI) @Inject

Para clientes JMS externos, servidores de aplicação podemimport diversas restrições (autenticação, autorização, nomesJNDI distintos, etc.) que precisam ser configuradas

!  Configurar o acesso JMS/EJB remoto no servidor de aplicação;cada servidor requer JARs e propriedades JNDI próprias

!  Para aplicações JMS que não necessitam dos recursos de umservidor de aplicações, pode-se usar servidores JMS standalonecomo o ActiveMQ ou o HornetQ

35

Page 36: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 36/262

Configuração para clientes!  Aplicações-cliente externas precisam configurar cliente JNDI

para ter acesso a recursos gerenciados (conexões, destinos)!  Incluir classes do cliente JNDI no classpath da aplicação

!  Configurar InitialContext do JNDI com propriedades

!  Os detalhes da configuração dependem do servidor usado

Exemplo de configuração do contexto JNDI via jndi.properties

Conteúdo de arquivo jndi.properties (acessível pelo classpath do cliente)java.naming.factory.initial=nome-da-classejava.naming.provider.url=urljava.naming.outra.propriedade.requerida.pelo.fabricante=valor

!  No código Javajavax.naming.Context ctx = new InitialContext();

Exemplo de configuração do contexto JNDI via objeto java.util.PropertiesProperties props = new Properties(); props.setProperty(Context.INITIAL_CONTEXT_FACTORY,”nome-da-classe"); props.setProperty(Context.PROVIDER_URL,”url"); props.setProperty(“outra.propriedade.requerida.pelo.fabricante”,”valor");javax.naming.Context ctx = new InitialContext(props);

36

Page 37: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 37/262

Servidores JMS standalone!  ActiveMQ 5.x (veja detalhes em http://activemq.apache.org)

!

 

JARs a incluir no classpath (além da API JMS)!  activemq-5.x.jar, spring-1.x.jar

!  Propriedades JNDI:

!   java.naming.factory.initial (Context.INITIAL_CONTEXT_FACTORY):org.apache.activemq.jndi.ActiveMQInitialContextFactory

!   java.naming.provider.url (Context.PROVIDER_URL) :vm://localhost ou tcp://host:port

!  HornetQ (veja detalhes em http://hornetq.sourceforge.net/docs)

!  JARs para clientes JMS standalone usando JNDI! 

hornetq-core-client.jar, hornet-jms-client.jar, jnp-client.jar

Fábricas, queues e topics configurados em hornetq-jms.xml!  Não é necessário configurar JNDI (pode ser feito em hornet-

beans.xml). Há uma API cliente para instanciar fábricas e filasConnectionFactory cf = HornetQJMSClient.createConnectionFactory(...);

Queue orderQueue = HornetQJMSClient.createQueue(”fila");

37

C fi ã JB AS 7 1

Page 38: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 38/262

Configuração JBoss AS 7.1 (HornetQ)! 

Dependências para cliente externo standalone!  Inclua no classpath o arquivo jboss-client.jar (localizado em

$JBOSS_HOME/bin/client (não use em projetos Maven - leia README.txt)

Configuração do JNDI via java.util.Properties

Properties props = new Properties();

props.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory");

props.put(Context.PROVIDER_URL,"remote://localhost:4447");

props.put(Context.SECURITY_PRINCIPAL, ”usuario"); // cadastre com add-user.sh em ApplicationRealm

props.put(Context.SECURITY_CREDENTIALS, ”senha");props.put("jboss.naming.client.ejb.context", true);

Context ctx = new InitialContext(props);

Ou arquivos jndi.properties e jboss-ejb-client.properties no classpath

38

remote.connections=defaultremote.connection.default.host=localhost

remote.connection.default.port = 4447

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false

remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

 java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory

 java.naming.factory.url.pkgs=org.jboss.ejb.client.naming java.naming.provider.url=remote://localhost:4447

 java.naming.security.principal=usuario

 java.naming.security.credentials=senha

 jndi.properties

 jboss-ejb-client.properties

Context ctx = new InitialContext();

Para usar JMS rode JBoss usandobin/standalone.sh –c standalone-full.xml

Isto é um resumo! Configuraçãomuda de versão para versao

Consulte a documentação!

C fi ã Gl fi h 3 4

Page 39: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 39/262

Configuração Glassfish 3 & 4

!  Dependências para cliente externo standalone!  Inclua no classpath o arquivo gf-client.jar (localizado em

$GLASSFISH_HOME/glassfish/lib 

!  Configuração JNDI para clientes externos standalone no mesmo host!  Não é necessário definir nenhuma propriedade. Inicialize com

Context jndi = new InitialContext();

!

 

Clientes em outro host/porta: propriedades do ORB!  Use ferramenta para cliente remoto ou inclua todos os JARs do MQ e JNDI remoto

!  Defina as propriedades via jndi.properties ou via System.setProperty(prop, valor)

org.omg.CORBA.ORBInitialHost=localhost (ou outro endereço)

org.omg.CORBA.ORBInitialPort=3700 (ou outra)

Para clientes externos que possuem JNDI local (ex: Tomcat), adicione no  jndi.properties (ou via java.util.Properties)

!  java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory

!  java.naming.factory.url.pkgs=com.sun.enterprise.naming

!  java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl

39

Isto é um resumo! Configuração

muda de versão para versaoConsulte a documentação!

Page 40: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 40/262

Fábrica de conexões (via JNDI)

Objeto gerenciado pelo container!

 

Clientes internos podem usar injeção de recursos(@Resource) ou dependências (@Inject)ConnectionFactory factory = (ConnectionFactory) jndi.lookup(“nome-jndi”)

@Resource(lookup=“nome-jndi”)ConnectionFactory factory;

@Inject ConnectionFactory factory;

Nome do recurso não segue padrão: depende do servidor usado epode ter restrições de acesso para clientes externos

Exemplos (nomes default – usuário pode configurar outros)!  GlassFish 3 & 4 (crie via ferramenta asadmin)!  “jms/ConnectionFactory”

JBoss 7.1 (configurável via XML, ferramentas ou interface Web)! 

“ java:jboss/exported /jms/RemoteConnectionFactory” (externo)!  “java:/JmsXA (interno)

!  ActiveMQ 5 (configurável via jndi.properties, interface Web, XML)! 

“ConnectionFactory”

40

Page 41: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 41/262

Destinos (via JNDI) 

Filas (Queue)!

  Retêm mensagens até que sejam retiradas dafila ou expirem

!  Apenas um cliente pode retirar cada mensagem enviada

Tópicos (Topic)!

  Cada tópico pode ter vários clientes assinantes, cada qualrecebe uma cópia das mensagens enviadas

Clientes precisam já ser assinantes antes do envio.!

  Em tópicos "duráveis", assinantes não precisam estar ativos nomomento do envio: mensagens são preservadas

41

Topic topico = (Topic) ctx.lookup(”jms/nome-jndi");ou

@Resource(lookup=”jms/nome-jndi") Topic topico; 

Queue fila = (Queue) ctx.lookup(”jms/nome-jndi");ou

@Resource(lookup=”jms/nome-jndi") Queue fila; 

Page 42: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 42/262

JMS API!  Cada domínio tem uma Abstract Factory

!  Desde JMS 1.1 recomenda-se utilizar as classes genéricas (e não

as implementações de cada domínio) para construir aplicaçõesJMS (ex: use MessageProducer e não TopicPublisher)

42

!  Domínio pub/sub

Destination

Topic

Queue

Connection

TopicConnection

QueueConnection

ConnectionFactory

TopicConnectionFactory

QueueConnectionFactory

 MessageConsumer

TopicSubscriber

QueueReceiver

Session

TopicSession

QueueSession

 MessageProducer

QueueSender

TopicPublisher

!  Domínio ptp 

Objetos

 gerenciados

Page 43: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 43/262

Conexões e sessões!  Conexões suportam múltiplas sessões paralelas

!  Métodos start() e stop() iniciam e interrompem (temporariamente)o envio de mensagens; close() encerra a conexão.

/3$C02#42@A:

Para clientes que exigem autenticação

13$$&/2.3$ /3$ B ;#/234HC/4&#2&13$$&/2.3$@+0&4.'= 0&$I#A:

!  Cada sessão é um thread, obtida de uma conexão

Modos de Session

!  JKLMNJ1OPM5Q7RS7

!  1QT7PLNJ1OPM5Q7RS7

!  RKU?NMONJ1OPM5Q7RS7

43

13$$&/2.3$ /3$ B ;#/234HC/4&#2&13$$&/2.3$@A:

?&00.3$ 0&00.3$ B

/3$C/4&#2&?&00.3$@;#-0&= ?&00.3$CJKLMNJ1OPM5Q7RS7A:

Sem transaçõesConfirmação automáticaapós recebimento correto

Page 44: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 44/262

Mensagens

Têm duas partes!  Cabeçalho (contém cabeçalhos JMS e possíveis

propriedades definidas pelo usuário)

!  Corpo (opcional)

!  Seis tipos!

 

Message: contém apenas cabeçalho; suficiente paraenviar propriedades (strings, números, etc.)

!  TextMessage: pode conter corpo de texto (ex: XML)

!  MapMessage: contem Map como corpo

!  BytesMessage: corpo de stream de bytes (ex: imagens,

dados comprimidos)!  StreamMessage: corpo de tipos primitivos (interface

DataInput/DataOutput)

!  ObjectMessage: corpo contém objeto serializado

44

 Message

StreamMessage

BytesMessage

ObjectMessage

 MapMessage

TextMessage

Page 45: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 45/262

Criação de mensagens

Session possui métodos para criar cada tipo demensagemL&V2"&00#%& 2F B 0&00.3$C$()"&)*)+&,)--".)@A:

"&00#%& F B 0&00.3$C$()"&),)--".)@A:

Message possui métodos para guardar e recuperar tiposprimitivos e strings como propriedades no cabeçalhoFC-)&/&(01.2('3)(&4@W13'.%3X= W<>YXA:

FC-)&51&2('3)(&H@WZ+#$2.'#'&X= [\\A:

?24.$% /3'.%3 B FC.)&/&(01.2('3)(&4@W13'.%3XA:

Cada subclasse de message possui métodos próprios paraanexar e recuperar dados anexados no corpo2FC-)&*)+&@W]4&0+-2#'3^]/3'.%3^>\\]G/3'.%3^]G4&0+-2#'3^XA:

?24.$% #$&V3 B 2FC.)&*)+&@A:

45

Page 46: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 46/262

Cabeçalho e seletores

!  Propriedades no cabeçalho da mensagem queiniciam em “JMS” são geradas pelo sistema!  Ex: 8"?"&00#%&TR= 8"?R&02.$#2.3$= 8"?7V*.4#2.3$= 8"?U4.34.2H

!  Propriedades definidas pelo programador têm métodos get/setdeclarados na classe Message

F&00#%&C-)&/&(01.2('3)(&4@_`34F#23_= _TF#%&F 8U7S_A:

!  Seletores booleanos: durante o consumo de mensagens,propriedades podem ser usadas em filtro de seleção!  Seletor é string com expressão SQL “where”:

?24.$% -)#)&'( B _6'(7"&' QTO7 abTF#%&Fba JPR _ c_8,/9+30("&0'1 ^ <\ JPR _ c_/0:) T? PML PKQQ_:

!  Usado durante a criação de um consumidor

0&00.3$C/4&#2&13$0+F&4 @23*./3= -)#)&'(A:

46

Page 47: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 47/262

Produtores! 

MessageProducer

Criado através de uma sessão!  Passa a referência para um Destination (Queue ou Topic)

!  Uma vez criado, o produtor pode ser usado para enviar mensagens

!  Métodos -)1;@F0%= F3'3= *4.34.'#'&= 22-A aceita outrosparâmetros onde define qualidade do serviço! 

modo: R&-.9&4H"3'&CPMPNU7d?T?L7PL (default) ou U7d?T?L7PL

prioridade: 0 – 9 (default é 4 = "&00#%&CR7`JKQLNUdTMdTLe)!  tempo de vida (TTL) em ms – default é zero

QoS também pode ser configurado via métodos!

 

%&2G0&2R&-.9&4H"3'&@A= %&2G0&2U4.34.2H@A= %&2G0&2L.F&L3Q.9&@A

MessageProducer producer =

session.createProducer(fila);

*43'+/&4C-)1;@ F&00#%& A:

47

Page 48: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 48/262

Consumidores síncronos!  MessageConsumer

"&00#%&13$0+F&4 /3$0+F&4 B0&00.3$C/4&#2&13$0+F&4@;.-#A:

É preciso iniciar a conexão antes de começar a consumir:/3$C02#42@A: 

O consumo de forma síncrona é realizado através de receive(),receive(timeout) ou receiveNoWait()

!  Se um seletor for definido, apenas as mensagens que passarempelo seletor serão consumidas

"&00#%& F&00#%& B /3$0+F&4C4&/&.9&@A: GG ,-3/f.$%/3$0+F&4C4&/&.9&@>\\\\A: GG >\ 0&%+$'30/3$0+F&4C4&/&.9&P35#.2@A: GG $3 ,-3/f.$%

0&00.3$C/4&#2&13$0+F&4 @;.-#= <!';0.'=3(';%&' ? @ABCD<A:

48

Page 49: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 49/262

Consumidores assíncronos!

  Consumo assíncrono requer a criação de umevent handler

Implementação da interface MessageListener que possuimétodo onMessage(javax.jms.Message)

!  Método onMessage() não pode deixar escapar exceções (JMS 1.x)

Código acima deve estar em um bloco try-catch

Para que objeto seja notificado, é preciso registrá-lo em umMessageConsumer

*+,-./ /-#00 "HQ.02&$&4 .F*-&F&$20 "&00#%&Q.02&$&4 6*+,-./ 93.' 3$"&00#%&@"&00#%& F0%A 6

L&V2"&00#%& 2V2"0% B @L&V2"&00#%&A F0%:?H02&FC3+2C*4.$2-$@ _"&$0#%&F 4&/&,.'#g _ c

2V2"0%C%&2L&V2@A AD

D

consumer.setMessageListener( new MyListener() );

con.start(); // iniciar a conexão

49

Page 50: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 50/262

Exercício: JMS

1.  Configure o seu servidor de aplicações para JMS

!  Configure o acesso JNDI para as aplicações cliente

!  Descubra como obter uma fábrica de conexões e uma fila (queue)

2. 

Escreva um cliente JMS para produzir mensagens contendo a data e hora(guarde o valor em uma propriedade Long)

!  Escreva uma aplicação standalone, com main()

!  Se possível use conexões e filas já existentes no servidor

3. 

Escreva dois clientes JMS para consumir mensagens da fila

!  Um que use recebimento síncrono

!  Outro que use recebimento assíncrono

!  Execute um dos consumidores primeiro, em seguida execute um produtor, depoisinverta a ordem; rode o produtor várias vezes

!  Escreva um seletor para consumir apenas mensagens produzidas há mais de 1 minuto eaplique-o a um dos consumidores

4.  Mude o exercício acima para usar um tópico (topic)

50

Page 51: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 51/262

Message Driven Beans!

  Objeto gerenciado (Enterprise JavaBean)

Anotado com @MessageDriven!  Pode injetar @Resource MessageDrivenContext

!  Permite configuração declarativa de serviços Java EE

!  Implementa consumidor JMS assíncrono (listener)!  Implementa interface MessageListener (método onMessage)!

 

Permite a configuração declarativa de seletores JMS, filas, tópicos, etc.

51

@MessageDriven(activationConfig={

  @ActivationConfigProperty(propertyName= destinationType ,

  propertyValue= javax.jms.Queue ),

  @ActivationConfigProperty(propertyName= destination ,

propertyValue= queue/ProdutoQueue )

})

public class ProdutoMDB implements MessageListener {

  @Resource

  private MessageDrivenContext mdc;

  public void onMessage(Message message) { … }

}

P d t JMS MDB

Page 52: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 52/262

Produtores JMS para MDB!  MDB é apenas um listener para um destino

!  É um consumidor assíncrono de mensagens

!  Produtores podem ser quaisquer clientes que enviammensagens para o mesmo destino!  Produtores externos e clientes standalone (como os mostrados anteriormente)

!  Outros EJBs e componentes dentro do servidor de aplicações

!  Produtores dentro do mesmo container podem injetar filas e conexões

52

@Stateless

public class ClienteEJB {

  public void metodo() throws Exception {

  @Resource(mappedName= java:/JmsXA”) ConnectionFactory connectionFactory;

  Connection con = factory.createConnection();

  Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);

  @Resource(mappedName= topic/testTopic”) Topic topic;

  Producer publisher = session.createProducer(topic);

  TextMessage msg = session.createTextMessage();

  msg.setText( Teste );

  publisher.send(msg);

  }

}

Page 53: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 53/262

JMS 2.0 (Java EE 7)!  JMS 2.0 simplificou bastante a interface JMS combinando

a conexão e sessão JMS em um único objeto: JMSContext

Com um JMSContext é possível criar produtores, consumidores,mensagens, destinos temporários e queue browsers

!  Pode ser criado a partir de um ConnectionFactory ou injetado

8"?13$2&V2 /2V B /3$$&/2.3$`#/234HC/4&#2&13$2&V2@A:

!T$h&/2 !8"?13$$&/2.3$`#/234H@_hF0G"H13$$&/2.3$`#/234H_A*4.9#2& 8"?13$2&V2 /2V>:

!  Ideal é criar dentro de um bloco try-with-resources, que fecha o contextoautomaticamente ao final:

24H@8"?13$2&V2 /2V B /3$$&/2.3$`#/234HC/4&#2&13$2&V2@A:A 6 E D

!  Novos produtores e consumidores são JMSProducer e JMSConsumer

8"?U43'+/&4 *43'+/&4 B hF012VC/4&#2&U43'+/&4@A:

!  Outras novidades do JMS 2.0

!  Assinaturas compartilhadas: permite criar uma assinatura cujas mensagens serãodistribuídas a mais de um consumidor

!  Criação de destinos temporários (que duram o tempo da conexão)

!  Envio assíncrono de mensagens

53

Page 54: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 54/262

Envio de mensagens JMS 2.0! 

Antes (JMS 1.1)

JMS 2.0

54

*+,-./ 93.' 0&$'8"?>@13$$&/2.3$`#/234H $'16"$&'(4= Z+&+& E%)%)= ?24.$% 2&V2A 624H @8"?13$2&V2 $'1&)+& B $'16"$&'(4C/4&#2&13$2&V2@A:A6

$'1&)+&F$()"&)2(';%$)(GHF-)1;GE%)%)I &)+&HJ

D /#2/I @8"?d+$2.F&7V/&*2.3$ &VA 6 GG I#$'-& &V/&*2.3$ DD

*+,-./ 93.' 0&$'8"?<<@13$$&/2.3$`#/234H $'16"$&'(4= Z+&+& E%)%)= ?24.$% &)+&A 624H 613$$&/2.3$ $'1 B $'16"$&'(4C/4&#2&13$$&/2.3$@A:24H 6

?&00.3$ -)--0'1 B /3$C/4&#2&?&00.3$@;#-0&=?&00.3$CJKLMNJ1OPM5Q7RS7A:"&00#%&U43'+/&4 7)--".)2(';%$)( B 0&00.3$C$()"&)2(';%$)(GE%)%)H:L&V2"&00#%& &)+&,)--".) B -)--0'1C/4&#2&L&V2"&00#%&@&)+&A:7)--".)2(';%$)(C-)1;G2&V2"&00#%&H:

D ;.$#--H 6/3$$&/2.3$C/-30&@A:

DD /#2/I @8"?7V/&*2.3$ &VA 6 GG I#$'-& &V/&*2.3$ D D

Page 55: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 55/262

Recebimento síncrono JMS 2.0 55

Antes (JMS 1.1)

JMS 2.0

*+,-./ 93.' 0&$'8"?>@13$$&/2.3$`#/234H $'16"$&'(4= Z+&+& E%)%)= ?24.$% 2&V2A 624H @8"?13$2&V2 $'1&)+& B $'16"$&'(4C/4&#2&13$2&V2@A:A68"?13$0+F&4 $'1-%7)( B $'1&)+&C$()"&)!'1-%7)(@E%)%)A:&K0-F7)--".)!'1&)1&- B $'1-%7)(C()$)0L)M';4@/&(01.F$#"--A:

D /#2/I @8"?d+$2.F&7V/&*2.3$ &VA 6 GG I#$'-& &V/&*2.3$ DD

*+,-./ 93.' 0&$'8"?<<@13$$&/2.3$`#/234H $'16"$&'(4= Z+&+& E%)%)= ?24.$% &)+&A 624H 613$$&/2.3$ $'1 B $'16"$&'(4C/4&#2&13$$&/2.3$@A:24H 6

?&00.3$ -)--0'1 B /3$C/4&#2&?&00.3$@;#-0&=?&00.3$CJKLMNJ1OPM5Q7RS7A:"&00#%&13$0+F&4 7)--".)!'1-%7)( B -)--0'1C$()"&)!'1-%7)(GE%)%)H:$'1C02#42@A:L&V2"&00#%& &)+&,)--".) B @L&V2"&00#%&A7)--".)!'1-%7)(C()$)0L)GH:

&K0-F7)--".)!'1&)1&- B &)+&,)--".)C.)&*)+&GH:D ;.$#--H 6

/3$$&/2.3$C/-30&@A:D

D /#2/I @8"?7V/&*2.3$ &VA 6 GG I#$'-& &V/&*2.3$ D D

56

Page 56: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 56/262

Outras simplificações

Message.getBody( tipo.class) em vez de getText(),getBytes(), etc. de cada tipo de mensagem93.' 3$"&00#%&@"&00#%& F&00#%&A 6 GG (H2&0"&00#%& 8"? <C<

.$2 -&$ B @@(H2&0"&00#%&AF&00#%&AC%&2(3'HQ&$%2I@A:,H2&ij ,H2&0 B $&k ,H2&i-&$j:.$2 ,H2&0 B @@(H2&0"&00#%&AF&00#%&AC4&#'(H2&0@,H2&0A:

E

93.' 3$"&00#%&@"&00#%& F&00#%&A6 GG (H2&0"&00#%& 8"? >C\,H2&ij ,H2&0 B F&00#%&C.)&M';4@,H2&ijC/-#00A:

E

JMSConsumer.receiveBody( tipo.class)!  Usado em recebimento síncrono (não é preciso obter a mensagem

 – pode-se retirar o payload diretamente)

56

ã i 57

Page 57: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 57/262

Preparação do ambiente

1.  Implante a aplicação-exemplo no servidor de aplicaçõespara que as tabelas sejam geradas corretamentea.  Rode o teste TabelasTest

b.  Acesse a aplicação Web e use algumas de suas funções

2.  Configure as seguintes filas

a. 

 jms/biblioteca/solicitacoesb.   jms/biblioteca/autorizacoes

3.  Verifique na interface do seu servidor de aplicações se as filas foramcriadas. Anote

a.  Nome JNDI da fábrica de conexões

b. 

Nomes JNDI das filas criadas

4.  Se tudo estiver OK, rode o teste FilasTest

5.  Analise o código das classes fornecidas (completas e incompletas)

57

Infraestrutura para exercícios: leia o README.txt

í i 58U tá i i l íd

Page 58: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 58/262

Exercícios1.  Transforme as classes AutorizacaoEmprestimo,

SolicitacaoEmprestimo e ListarLivros em SSLBs

a.  AutorizacaoEmprestimo e SolicitacaoEmprestimosdevem ter interface Local

b.  ListarLivros deve ter interface Remote

c.  Teste a aplicação (rode o LivrosClient remota)

2. 

Crie um MDB SolicitarEmprestimo que receba uma propriedade String“Codigo-do-livro” que envie uma nova mensagem para o MDB AutorizarEmprestimo (que está pronto) contendo duas propriedades

a.  Codigo-do-livro – copiada do valor recebido

b.  Tempo-autorizado – valor inteiro

3.  Teste a aplicação através de sua interface Web

a.  Solicite o empréstimo de um livro

b.  Observe a lista de empréstimos autorizados e veja se a autorização aparece equantos dias foram autorizados

58Use os comentários incluídos nocódigo como roteiro

R f ê i 59

Page 59: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 59/262

Referências!  Especificações Java EE

!

 

EJB e MDB http://jcp.org/aboutJava/communityprocess/final/jsr345/ !  JMS https://java.net/projects/jms-spec/pages/Home 

!  Java EE https://java.net/projects/javaee-spec/pages/Home 

!  Tutorial Java EE!  Java EE 6 http://docs.oracle.com/javaee/6/tutorial/doc/ 

Java EE 7 http://docs.oracle.com/javaee/7/tutorial/doc/ 

!  JMS 2.0 (Java EE 7)

!  Nigel Deakin. “What's New in JMS 2.0”. Oracle. 2013.

!  Part I http://www.oracle.com/technetwork/articles/java/jms20-1947669.html 

!  Part II http://www.oracle.com/technetwork/articles/java/jms2messaging-1954190.html 

!  Configuração de JNDI externo! 

Glassfish https://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB 

!  JBoss http://stackoverflow.com/questions/14336478/jboss-7-jndi-lookup 

!  ActiveMQ http://activemq.apache.org/jndi-support.html 

59

2

Page 60: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 60/262

Tecnologias para

representação de dadosXML, XML Schema, XPath, JSON, DOM, SAX, JAXP e JAXB

2Infraestutura de sistemas

Java EE

C t úd 61

Page 61: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 61/262

Conteúdo

1. 

Formatos de dados usados em Web Services!  XML

!  JSON

2. 

XML!  Tecnologias XML: DTD, XML Schema, XPath

!  APIs de manipulação do XML - JAXP: DOM, SAX, StAX e TrAX

!  XML Java Binding: JAXB

3. 

JSON!  JSON

!  JSON Java APIs

!  JSON Java Binding

61

F t d d d 62

Page 62: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 62/262

Formatos de dados

!  Os dois formatos de dados (texto)mais usados em

Web Services são XML e JSON!  Ambos são independentes de linguagem e plataforma

!  Ambos representam dados como uma árvore e têm APIs parastreaming, modelo de objetos e binding de objetos

XML <dados><x>123</x><y>456</y></dados>

!  Especificação W3C

!  Media type: application/xml

!  APIs SAX (streaming), DOM (objetos), JAXB (Java binding)

JSON dados: {x :123, y : 456} !  Estruturas baseadas em JavaScript

!  Media type: application/json

!  APIs de streaming e objetos nativas Java EE 7, binding via JAXB

62

Representação de objetos 63

Page 63: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 63/262

Representação de objetos

Representação em JSON

{

"@numero": 145,

"nome": "Jeeves",[ "telefone": {

"ddd": 11, "numero": 34567890

} ]

}

!  É possível usar XML e JSON para obter diferentesrepresentações dos mesmos objetos Java

Representação em XML

<pessoa xmlns="http://pessoa" numero="145">

<nome>Jeeves</nome>

<telefone><ddd>11</ddd>

<numero>34567890</numero>

</telefone>

</pessoa>

Pessoa pessoa = new Pessoa();pessoa.numero = 145;

pessoa.nome = "Jeeves";pessoa.telefone[0] = new Telefone();

pessoa.telefone[0].ddd = 11;

pessoa.telefone[0].numero = 34567890;

class Pessoa {

int numero;

String nome;

Telefone[] telefones =

new Telefone[3];}

class Telefone {

int ddd;

int numero;

}

Classes

Objetosem Java

application/xml application/json

63

XML 1 0 (W3C 1996) 64

Page 64: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 64/262

XML 1.0 (W3C, 1996)!

 

XML é um padrão W3C que define sintaxe para documentosestruturados com dados marcados por tags e atributos

Não define vocabulário, apenas regras mínimas de formação –facilita a construção de parsers

Documentos XML devem ser bem formados para que informações sejamprocessadas

!  Características de documentos XML bem formados:

Têm um, e apenas um, elemento raiz (é uma árvore)!  Atributos não se repetem no mesmo elemento, Valores entre aspas ou apóstrofes

!  Todos os elementos têm etiqueta de fechamento e corretamente aninhados

!  Fragmentos XML podem não ser bem formados, mas ainda podem ser usados

!  Podem ser lidos/gravados mas só podem ser processados depois de inseridos nocontexto de documentos bem-formados

!  Tecnologias relacionadas a XML (relevantes neste curso)

!  Esquemas: DTD e XML Schema (especificação e validação de XML)

!  XML Namespaces

!  XPath (linguagem para localizar elementos em árvore XML)

!  APIs de programação em Java: JAXP, DOM, SAX, StAX, JAXB

64

XML álid 65

Page 65: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 65/262

XML válido e esquemas!

 

A validade de um XML é um conceito relativo! 

Um XML bem formado pode ser válido em relação adeterminada aplicação e não ser válido em outra

!  Validade pode ser formalizado através de um esquema

!  Um esquema especifica um vocabulário de elementos e atributos,regras de formação, etc.

Documento XML pode ser considerado válidoem relação a um esquema

!  Um esquema é essencial parausar XML em comunicação

Linguagens usadas paraespecificar esquemas em XML!  DTD (limitado, porém muito simples)

!  XML Schema

! Oesquemarepresentaumaclasse

! Os documentos são instâncias

Esquema (universo dedocumentos válidos)

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

Documentofora da especificação

65

DTD (Document Type Definition) 66

Page 66: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 66/262

DTD (Document Type Definition)!

  Linguagem de esquema que declara todos oselementos e atributos de um documento XML

Define quais elementos e atributos são válidos eem que contexto

!  Exemplo: DTD para um documento simples 

< ELEMENT pessoa (nome, web?, telefone+)>

< ELEMENT nome (prenome, inicial*, sobrenome)>

< ELEMENT prenome (#PCDATA)>

< ELEMENT inicial (#PCDATA)>

< ELEMENT sobrenome (#PCDATA)>

< ELEMENT web (email|website)>

< ELEMENT email (#PCDATA)>

< ELEMENT website (#PCDATA)>

< ELEMENT telefone (#PCDATA)>

Elementos que só podemconter texto

web pode conter ou um email ou um website

nome tem um prenome,seguido de zero ou mais 

inicial e um sobrenome

pessoa tem nome, seguido de zero ou um web e um ou mais telefone

66

XML Namespaces 67

Page 67: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 67/262

XML Namespaces!  Estabelecem um contexto para elementos e atributos

!  Formalmente declarados através de um identificador (string,

geralmente uma URI) em atributo reservado do XML: xmlns

!  A declaração pode associar o namespace a um prefixo para qualificar elementos e atributos

!  Quando o prefixo não é usado, estabelece-se um namespace default nocontexto formado pelo elemento onde é declarado e seus elementos-filho

]0.F+-#/#3^]2&F*3 +$.'#'&B_0&%+$'30_^<Y\]G2&F*3^]/-.F# VF-$0B_+4.gGG#**l/-.F#_^]2&F*3^/I+9303]G2&F*3^

]G/-.F#^]G0.F+-#/#3^ ]0.F+-#/#3 VF-$0gkB_+4.gGG#**l/-.F#_^

]2&F*3 +$.'#'&B_0&%+$'30_^<Y\]G2&F*3^

]kg/-.F#^]kg2&F*3^/I+9303]Gkg2&F*3^]2&F*3 +$.'#'&B_I34#0_^>Cm]G2&F*3^

]Gkg/-.F#^]G0.F+-#/#3^

Escopo do namespace valepara elemento <clima> eherdado por todos os seus

descendentes

Escopo do namespace valepara descendentes de

<simulacao> qualificados com

o prefixo 'w'

Nos dois casos, elementos <tempo> significam coisas diferentes, mas não há conflito porquepertencem a namespaces diferentes (um deles não tem namespace declarado)

67

XML Schema 68

Page 68: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 68/262

XML Schema!  Linguagem usada para especificar uma classe de documentos XML

!  Mesma finalidade que DTD, com mais recursos e sintaxe XML

Define coleção de tipos simples (números, strings)!  Permite derivar novos tipos simples por restrição (ISBNs, CNPJs, limites de valores, etc.)

!  Permite declarar tipos complexos (elementos com atributos e elementos) e derivarnovos tipos complexos por extensão

]V0g0/I&F# VF-$0gV0B_I22*gGGkkkCkYC34%G>\\<Gn"Q?/I&F#_ E ^ ]V0g&-&F&$2 $#F&B_3;&42#_^ 

]V0g/3F*-&VLH*&^ ]V0g0&o+&$/&^ 

]V0g&-&F&$2 4&;B_/3'.%3_G^ 

]V0g&-&F&$2 4&;B_*4&/3_G^ ]V0g&-&F&$2 4&;B_.2&$0_G^ 

]GV0g0&o+&$/&^]V0g#224.,+2& $#F&B_9#-.'#'&_ +0&B_4&o+.4&'_ 2H*&B_+-N;"&)_G^ 

]GV0g/3F*-&VLH*&^ ]GV0g&-&F&$2^ 

]V0g&-&F&$2 $#F&B_*4&/3_^ 

]V0g0.F*-&LH*&^ ]V0g4&024./2.3$ ,#0&B_+-N;)$07"#_^ O+-NP("$&0'1Q0.0&- L"#%)?<R< ST 

]GV0g4&024./2.3$^ ]GV0g0.F*-&LH*&^ 

]GV0g&-&F&$2^ ]V0g&-&F&$2 $#F&B_/3'.%3_^ E ]GV0g&-&F&$2^ ]V0g&-&F&$2 $#F&B_.2&$0X^ E ]GV0g&-&F&$2^ 

]GV0g0/I&F#^ 

68

Anatomia de XML Schema 69

Page 69: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 69/262

Anatomia de XML Schema

]V0g0/I&F# VF-$0gV0B_I22*gGGkkkCkYC34%G>\\<Gn"Q?/I&F#_^

]V0g&-&F&$2 $#F&B_#0243_  2H*&B_#0243LH*&_ G^]V0g&-&F&$2 $#F&B_.F#%&F_ 2H*&B_.F#%&FLH*&_G^ 

]V0g#224.,+2& $#F&B_I4&;_ 2H*&B_V0g#$HKdT_G^ ]V0g#224.,+2& $#F&B_.'_ 2H*&B_V0gTR_G^ ]V0g#224.,+2& $#F&B_$3F&_ 2H*&B_V0g024.$%_G^ ]V0g#224.,+2& $#F&B_'.#F&243fF_ 2H*&B_V0g'&/.F#-_G^

]V0g/3F*-&VLH*& $#F&B_.F#%&FLH*&_^ ]V0g#224.,+2& 4&;B_I4&;_ +0&B_4&o+.4&'_G^ 

]GV0g/3F*-&VLH*&^ 

]V0g/3F*-&VLH*& $#F&B_#0243LH*&_^ ]V0g0&o+&$/&^ 

]V0g&-&F&$2 4&;B_.F#%&F_ F.$M//+40B_\_G^ 

]GV0g0&o+&$/&^ ]V0g#224.,+2& 4&;B_.'_ +0&B_4&o+.4&'_G^ ]V0g#224.,+2& 4&;B_$3F&_ +0&B_4&o+.4&'_G^ ]V0g#224.,+2& 4&;B_'.#F&243fF_G^ 

]GV0g/3F*-&VLH*&^ ]GV0g0/I&F#^

Definição detipos complexos

Elementos

Atributos

Tipos simples

69

Compare com DTD 70

Page 70: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 70/262

Compare com DTD

Atributos

Elementos]p7Q7"7PL #0243  @.F#%&FqA ^

]p7Q7"7PL .F#%&F  7"ULe ^

]pJLLQT?L .F#%&F I4&;  1RJLJ rd7ZKTd7R ^

]pJLLQT?L #0243  .'  TR rd7ZKTd7R ^]pJLLQT?L #0243  $3F&  1RJLJ rd7ZKTd7R ^

]pJLLQT?L #0243  '.#F&243fF P"LMO7P rT"UQT7R ^

Tipos de dados simples(somente para atributos)

Modelo de conteúdo(tipo de dados complexo)

Atributo sempreassociado a elemento

]#0243 .'B_*m_ $3F&B_8+*.2&4_^

].F#%&F I4&;B_h+*Y<Ch*%_ G^].F#%&F I4&;B_h+*Y>Ch*%_ G^]G#0243^

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

XML Schema mostrado

70

Tipos simples nativos do XML Schema 71

Page 71: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 71/262

Tipos simples nativos do XML Schemaxs:anySimpleType

xs:duration xs:dateTime xs:time xs:date xs:gYearMonth xs:gYear xs:gMonth xs:gDay

xs:string

xs:normalizedString

xs:token

xs:language xs:Name xs:NMTOKEN

xs:NCName xs:NMTOKENS

xs:ID

xs:IDREF xs:ENTITY

xs:IDREFS xs:ENTITIES

xs:decimal

xs:integer

s:nonPositiveInteger

xs:nonNegativeInteger

xs:negativeInteger

xs:positiveInteger

s:long

xs:int

xs:short

xs:byte

xs:unsignedLong

xs:unsignedInt

xs:unsignedShort

xs:unsignedByte

xs:boolean

xs:base64binary

xs:hexbinary

xs:float

xs:double xs:anyURI xs:QNames:NOTATION

71

Deri ação de m tipo simples 72

Page 72: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 72/262

Derivação de um tipo simples

Tipo base: xs:NMTOKEN

!  Tipo derivado: isbn!  Faceta de comprimento <xs:length>:

exatamente 10 caracteres

!  Faceta de formato <xs:pattern>:

descrito por expressão regular

]V0g0.F*-&LH*& $#F&B_.0,$_^ ]V0g4&024./2.3$ ,#0&B_V0gP"LMO7P_^

]V0g-&$%2I 9#-+&B_<\_G^]V0g*#22&4$ 9#-+&B_i\l[j6[Di\l[nj_G^ 

]GV0g4&024./2.3$^ ]GV0g0.F*-&LH*&^

72

Declaração de tipo complexo 73

Page 73: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 73/262

Declaração de tipo complexo

<xs:complexType>!  Tipo que pode conter outros elementos ou atributos

!  Pode ser usado para descrever a estrutura de um objeto

]V0g/3F*-&VLH*& $#F&B_.F#%&FLH*&_^]V0g#224.,+2& $#F&B_I4&;_ 2H*&B_V0g#$HKdT_G^ 

]GV0g/3F*-&VLH*&^

]V0g/3F*-&VLH*& $#F&B_#0243LH*&_^]V0g0&o+&$/&^ 

]V0g&-&F&$2 $#F&B_.F#%&F_ 2H*&B_.F#%&FLH*&_ F.$M//+40B_\_G^ ]V0g&-&F&$2 $#F&B_0#2&-.2&_ 2H*&B_0#2&-.2&LH*&_ 

F.$M//+40B_\_ F#VM//+40B_+$,3+$'&'_G^ ]GV0g0&o+&$/&^ ]V0g#224.,+2& $#F&B_.'_ 2H*&B_#0243TR_ +0&B_4&o+.4&'_G^ ]V0g#224.,+2& $#F&B_$3F&_ 2H*&B_V0g23f&$_ G^ ]V0g#224.,+2& $#F&B_'.#F&243fF_ 2H*&B_V0g'&/.F#-_G^ 

]GV0g/3F*-&VLH*&^

73

Validação de instâncias XML 74

Page 74: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 74/262

Validação de instâncias XML

Uma instância pode ser formalmente vinculadaa um XML Schema através de atributos globaisdeclarados em um namespace padrão!  Namespace XML Schema Instance:

http://www.w3.org/2001/XMLSchema-instance

Este namespace deve ser atribuído a um prefixo nodocumento XML a ser vinculado, para que se possa usar um oumais dos seus 4 atributos:!  schemaLocation – para vincular um ou mais XML Schemas à

instância

noNamespaceSchemaLocation – para vincular documento a umXML Schema que não usa namespace

!  nil e type – usados em elementos e atributos

74

Exemplos com namespace 75

Page 75: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 75/262

Exemplos com namespace

]3;&42# VF-$0g+-0B_I22*gGGkkkCkYC34%G>\\<Gn"Q?/I&F#l.$02#$/&_ +-0g0/I&F#Q3/#2.3$B_I22*gGGkkkC&F*4&0#C/3FG*3$23'&9&$'# 

3;&42#7-&F&$20J--TF*342CV0'_ VF-$0B_I22*gGGkkkC&F*4&0#C/3FG*3$23'&9&$'#_ 9#-.'#'&B_>\<\l\sl>>_^

]/3'.%3 $+F&43B_tm[[_ 2.*3B_L_G^ ]*4&/3^<mC>]G*4&/3^ ].2&$0^<t]G.2&$0^ 

]G3;&42#^ 

]3;Lg3;&42# VF-$0g+-0B_I22*gGGkkkCkYC34%G>\\<Gn"Q?/I&F#l.$02#$/&_ +-0g0/I&F#Q3/#2.3$B_I22*gGGkkkC&F*4&0#C/3FG*3$23'&9&$'#

3;&42#7-&F&$20J--TF*342CV0'_ VF-$0g3;LB_I22*gGGkkkC&F*4&0#C/3FG*3$23'&9&$'#_ 

9#-.'#'&B_>\<\l\sl>>_^

]3;Lg/3'.%3 $+F&43B_tm[[_ 2.*3B_L_G^ ]3;Lg*4&/3^<mC>]G3;Lg*4&/3^ ]3;Lg.2&$0^<t]G3;Lg.2&$0^ 

]G3;Lg3;&42#^ 

75

Page 76: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 76/262

Exemplo com múltiplos namespaces 77

Page 77: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 77/262

Exemplo com múltiplos namespaces]I2F- VF-$0g+-0B_I22*gGGkkkCkYC34%G>\\<Gn"Q?/I&F#l.$02#$/&_ 

+-0g0/I&F#Q3/#2.3$B_K&&3NSSUUUFUVF'(.SWBBBS+K&7# +K&7#F+-; K&&3NSSUUUF)73()-"F$'7S3'1&';)L)1;" 'P)(&"F+-;_ 

VF-$0B_I22*gGGkkkCkYC34%G<[[[GVI2F-_ VF-$0g3;LB_I22*gGGkkkC&F*4&0#C/3FG*3$23'&9&$'#_̂  ]I&#'^CCC]GI&#'^ ],3'H^]'.9 /-#00B_3;&42#X^ 

]3;Lg3;&42# 9#-.'#'&B_>\<\l\sl>>_^ ]3;Lg/3'.%3 $+F&43B_tm[[_ 2.*3B_L_G^ ]3;Lg*4&/3^<mC>]G3;Lg*4&/3^ ]3;Lg.2&$0^<t]G3;Lg.2&$0^ 

]G3;Lg3;&42#^ ]G'.9^]G,3'H^ ]GI2F-^ 

]I2F- VF-$0g+-0B_I22*gGGkkkCkYC34%G>\\<Gn"Q?/I&F#l.$02#$/&_ +-0g0/I&F#Q3/#2.3$B_K&&3NSSUUUFUVF'(.SWBBBS+K&7# +K&7#F+-; 

K&&3NSSUUUF)73()-"F$'7S3'1&';)L)1;" 'P)(&"F+-;_ VF-$0B_I22*gGGkkkCkYC34%G<[[[GVI2F-_ ^ 

]I&#'^CCC]GI&#'^],3'H^]'.9 /-#00B_3;&42#X^ ]3;&42# 9#-.'#'&B_>\<\l\sl>>_ VF-$0B_I22*gGGkkkC&F*4&0#C/3FG*3$23'&9&$'#_̂  ]/3'.%3 $+F&43B_tm[[_ 2.*3B_L_G^ ]*4&/3^<mC>]G*4&/3^ ].2&$0^<t]G.2&$0^ 

]G3;&42#^ ]G'.9^]G,3'H^ 

]GI2F-^ 

77

XPath 78

Page 78: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 78/262

a!  Linguagem usada para localizar informações em XML

!  É usada para configurar mapeamento Java-XML em bindings (JAXB,REST, SOAP Web Services)

Expressão XPath é um caminho: passos de navegação na árvore XMLseparados por “/”; cada passo tem um eixo, teste e predicado 

!  )0+'gg&)-&)i3();0$";'j

!  Sintaxe permite variações e atalhos. Ex: *43'+23i!$3F&Ba-.943uj éequivalente a /I.-'gg*43'+23i#224.,+2&gg$3F&Ba-.943aj

!  Resultados da expressão podem ser: texto, número, booleano,

elemento, atributo, nó de texto ou node-set (sub-árvore XML)

!  XPath opera sobre o XML processado

!  O arquivo-fonte usado pelo XPath não contém entidades

!  Todas as entidades e seções CDATA são convertidas em XML etexto antes do processamento XPath (usa ‘>’ e não ‘&gt;’)

Exemplos (navegando na árvore ao lado)!  S)#)7)1&'SP0#K'S1)&' : resultado é node-set 'neto’, que contém dois

elementos

!  FFSFFS3(07'XVY: expressão relativa (a partir de 'neto’); resultado éelemento <primo> na posição 3 (do node-set de tamanho 4)

 /

elemento

 filho

 primo

neto

neto

 primo

 primo

 primo

78

Caminhos XPath equivalentes 79

Page 79: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 79/262

Caminhos XPath equivalentes(1)

*#4&$2ggqS;3--3k.$%l0.,-.$%gg*#4#%4#;3

CCS;3--3k.$%l0.,-.$%gg*#4#%4#;3

(2)! 

'&0/&$'#$2l34l0&-;gg/#*.2+-3i*30.2.3$@AB<jS /I.-'gg0&/#3i*30.2.3$@ABtjS 

/I.-'gg*#4#%4#;3i*30.2.3$@AB<j

SS/#*.2+-3i<jS0&/#3itjS*#4#%4#;3i<j

(3)

0&-;gg&-&F&$23 v '&0/&$'#$2gg&-&F&$23

GG&-&F&$23

'&0/&$'#$2l34l0&-;gg&-&F&$23

(4)!

 

S/I.-'gg/+4030S/I.-'gg/+403S/I.-'gg23*./30S/I.-'gg.2&Fi*30.2.3$@ABmj

S/+4030S/+403S23*./30S.2&Fimj

Veja referências no finaldesta apresentação para

links com maioresinformações sobre XPath

JAXP 80

Page 80: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 80/262

JAXP

!  Java API for XML Processing!

 

Para leitura, criação, manipulação, transformação de XML!  Parte integrante do JAVA SE

!  Pacotes!   javax.xml.parsers

!

 

 javax.xml.transform (TrAX)!   javax.xml.stream (StAX)!  org.w3c.dom (DOM)

!  org.xml.sax (SAX)

!  Componentes!

 

Parsers estilo pull e push!  APIs para streaming XML! 

API W3C DOM

!  Transformação XSLT

DOM

SAX

DOM

StAX TrAX

Manipulação do XML 81

Page 81: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 81/262

!  SAX (Simple API for XML) – org.xml.sax

!  API baseada em eventos que lê o documento sequencialmente

!

 

Eficiente para pesquisar documentos longos e quando não énecessário montar toda a árvore

!  Requer a criação de listeners que irão capturar eventos do SAX(localização de documento, elementos, texto)

!  DOM (Document Object Model) – org.w3c.dom

API baseada em modelo de objetos!  Realiza a montagem de toda a árvore na memória

!  Necessário para usar tecnologias como XPath, Xquery e XSLT

!  Interface Java SE é padrão (W3C) – há alternativas: JDOM, DOM4J

!  StAX – Streaming API - javax.xml.streaming 

API de Java I/O streaming (mais fácil de usar que SAX)

!  TrAX – Transformador XSLT – javax.xml.transform

!  Permite transformar árvores DOM em outros default (texto, XML formatado)

!  Aceita documentos XSLT para customizar transformação

Processamento SAX 82

Page 82: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 82/262

Processamento SAX!  Se um processador SAX receber o documento ...

]/#42#^ ]F&$0#%&F .'B_<_^(3F '.#p]GF&$0#%&F^ 

]G/#42#^

!  ... ele irá disparar os seguintes eventos:➠

  -&"(&Q'$%7)1&GH

➠ 

-&"(&9#)7)1&G<$"(&"<I XYH

➠ -&"(&9#)7)1&G<7)1-".)7<I XZ&&(0[%&)G<0;<I<W<HYH

➠ $K"("$&)(-G<M'7 ;0"\<H

➠ )1;9#)7)1&G<7)1-".)7<H

➠ 

)1;9#)7)1&G<$"(&"<H➠  )1;Q'$%7)1&GH

!  Programador deve implementar um listener para capturar oseventos e extrair as informações desejadas

Como usar SAX 83

Page 83: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 83/262

Como usar SAX

Crie listener estendendo org.w3c.sax.DefaultHandler

*+,-./ /-#00 "H?#Vw#$'-&4 &V2&$'0 R&;#+-2w#$'-&4 6CCCD

!  Implemente os métodos de evento desejados nessa classe!  characters()

!  startElement()

!  endElement(), etc.

!  Crie outra classe para inicializar o parser e processar o documento XML!  Importe as classes SAXParserFactory, SAXParser e XMLReader de org.w3c.sax

?JnU#40&4`#/234H 0*; B ?JnU#40&4`#/234HC$&kT$02#$/&@A:

?JnU#40&4 0* B 0*;C$&k?JnU#40&4@A:

n"Qd&#'&4 4&#'&4 B 0*C%&2n"Qd&#'&4@A:

4&#'&4C0&213$2&$2w#$'-&4@1)U ,4/"+]"1;#)(GHA:

4&#'&4C*#40&@W'3/+F&$23CVF-XA:

Implementação de SAX Handler 84

Page 84: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 84/262

Implementação de SAX Handler*+,-./ /-#00 "H?#Vw#$'-&4 &V2&$'0 R&;#+-2w#$'-&4 6

*+,-./ 93.' $K"("$&)(-@/I#4ij /I= .$2 02#42= .$2 -&$%2IA 6;34 @.$2 . B 02#42: . ] -&$%2I: .ccA 6?H02&FC3+2C*4.$2-$@/Ii.jA:

DD

*+,-./ 93.' -&"(&9#)7)1&@?24.$% +4.= ?24.$% -3/#-P#F&=

?24.$% oP#F&= J224.,+2&0 #22A 6?H02&FC3+2C*4.$2@_]_ c oP#F&A:;34 @.$2 . B \: . ] #22C%&2Q&$%2I@A: .ccA 6?H02&FC3+2C*4.$2@_ _ c #22C%&2ZP#F&@.A c _Ba_

c #22C%&2x#-+&@.A c _a_A:D?H02&FC3+2C*4.$2-$@_^_A:

D

*+,-./ 93.' )1;9#)7)1&@?24.$% +4.= ?24.$% -3/#-P#F&=?24.$% oP#F&A 6

?H02&FC3+2C*4.$2-$@_]G_ c oP#F& c _^_A:D

D

W3C DOM: Hierarquia 85

Page 85: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 85/262

W3C DOM: Hierarquia

R3/+F&$2`4#%F&$2

Q'$%7)1&

!K"("$&)(Q"&"

*)+&

13FF&$2

1RJLJ?&/2.3$

Z&&(

9#)7)1&

R3/+F&$2LH*&

P32#2.3$

7$2.2H

7$2.2Hd&;&4&$/&

U43/&00.$%T$024+/2.3$

^';)^';)A0-&

^"7);^';),"3

Document Object Model API 86

Page 86: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 86/262

j^';)

P3'& "33)1;!K0#;@P3'&A

!  P3'& $#'1)^';)@,33-&#$A

!

 

P#F&'P3'&"#* .)&Z&&(0[%&)-@A!  P3'&Q.02 .)&!K0#;^';)-@A 

,33-&#$ K"-Z&&(0[%&)-@A

,33-&#$ K"-!K0#;^';)-@A

!  P3'& 01-)(&M)P'()@P3'&= P3'&A

!  P3'& ()7'L)!K0#;@P3'&A

!  P3'& ()3#"$)!K0#;@P3'&= P3'&A

P3'& .)&60(-&!K0#;@A 

P3'& .)&A"-&!K0#;@A

P3'& .)&^)+&/0[#01.@A !  P3'& .)&2()L0'%-/0[#01.@A 

!  ?24.$% .)&^';)^"7)@A 

0I342 .)&^';)*43)@A

?24.$% .)&^';)_"#%)@A 

!  R3/+F&$2 .)&`U1)(Q'$%7)1&@A 

!  P3'& .)&2"()1&^';)@A

*)+& ) !K"("$&)(Q"&"

93.' "33)1;Q"&"@?24.$%A

?24.$% .)&Q"&"@A

.$2 .)&A)1.&K@A

!  93.' 01-)(&Q"&"@.$2= ?24.$%A

!  93.' -)&Q"&"@?24.$%A

93.' ()3#"$)Q"&"@.$2= .$2= ?24.$%A

9#)7)1&

?24.$% .)&Z&&(0[%&)@?24.$%A

?24.$% .)&Z&&(0[%&)^/@?24.$%= ?24.$%A

J224 .)&Z&&(0[%&)^';)@?24.$%A

!  J224 .)&Z&&(0[%&)^';)^/@?24.$%= ?24.$%A

!  ?24.$% .)&*".^"7)@A

,33-&#$ K"-Z&&(0[%&)@?24.$%A

,33-&#$ K"-Z&&(0[%&)^/@?24.$%= ?24.$%A

93.' ()7'L)Z&&(0[%&)@?24.$%A!  93.' ()7'L)Z&&(0[%&)^/@?24.$%= ?24.$%A

!  93.' -)&Z&&(0[%&)@?24.$%= ?24.$%A

93.' -)&Z&&(0[%&)^/@?24.$%= ?24.$%= ?24.$%A

P3'&Q.02 .)&9#)7)1&-M4*".^"7)@?24.$%A

P3'&Q.02 .)&9#)7)1&-M4*".^"7)^/@?24.$%= ?24.$%A 

Q'$%7)1&! 

J224 $()"&)Z&&(0[%&)@?24.$%A

!  J224 $()"&)Z&&(0[%&)^/@?24.$%= ?24.$%A

7-&F&$2 $()"&)9#)7)1&@?24.$%A! 

7-&F&$2 $()"&)9#)7)1&^/@?24.$%= ?24.$%A

L&V2 $()"&)*)+&^';)@?24.$%A

R3/+F&$2LH*& .)&Q'$*43)@A

!  7-&F&$2 .)&Q'$%7)1&9#)7)1&@A

!  7-&F&$2 .)&Q'$%7)1&M45;@?24.$%A

P3'&Q.02 .)&9#)7)1&-M4*".^"7)@?24.$%A

P3'&Q.02 .)&9#)7)1&-M4*".^"7)^/@?24.$%= ?24.$%A ^"7);^';),"3!  P3'& 0&)7@.$2A

P3'& .)&^"7);5&)7@?24.$%A!  P3'& 1)+&^';)@A

!  93.' ()-)&@A

!  .$2 .)&A)1.&K@A

^';)A0-&! 

P3'& 0&)7@.$2A

!  P3'& 1)+&^';)@A

93.' ()-)&@A

.$2 .)&A)1.&K@A

Z&&(

?24.$% .)&^"7)@A

!  7-&F&$2 .)&`U1)(9#)7)1&@A 

!  ?24.$% .)&_"#%)@A

!  93.' -)&_"#%)@?24.$%A

Criação de árvore DOM 87

Page 87: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 87/262

Criação de árvore DOM

Criação de elementos e nó de texto

Criação de atributos

/ R3/+F&$2

<carta> 7-&F&$2

<mensagem> 7-&F&$2

Bom dia! ?24.$%

2&V23 gB '3/+F&$2C/4&#2&L&V2P3'&@_(3F '.#p_A

F&$0 gB '3/+F&$2C/4&#2&7-&F&$2@_F&$0#%&F_A

/#42# gB '3/+F&$2C/4&#2&7-&F&$2@_/#42#_A 

Objeto document é obtido através da

inicialização do parser  

<carta id="1"> /#42#C0&2J224.,+2&@_.'_= _<_A 

Criação de árvore DOM (2) 88

Page 88: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 88/262

Criação de árvore DOM (2)

Interligando elementos para construir a árvore!  1. Sub-árvore <mensagem>

!  2. Sub-árvore <carta>

!  3. Árvore completa

/<mensagem>

Bom dia!

F&$0C#**&$'1I.-'@2&V23A

/#42#C#**&$'1I.-'@F&$0A 

'3/+F&$2C#**&$'1I.-'@/#42#A 

Bom dia!

<carta id="1">

<mensagem>Bom dia!

<carta id="1">

<mensagem>

Obtenção do Document 89

Page 89: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 89/262

Obtenção do Document!  É preciso obter o Document para trabalhar com DOM

Use os pacotes javax.xml.parsers.* e org.w3c.dom.*!  Crie um javax.xml.parsers.DocumentBuilder

R3/+F&$2(+.-'&4`#/234H ;#/234H BR3/+F&$2(+.-'&4`#/234HC$&kT$02#$/&@A:

R3/+F&$2(+.-'&4 [%0#;)( B ;#/234HC$&kR3/+F&$2(+.-'&4@A:

Chame builder.newDocument() para obter o elemento raiz de umdocumento vazio (org.w3c.dom.Document)

R3/+F&$2 ;'$%7)1& B ,+.-'&4C$&kR3/+F&$2@A:

!  Ou chame builder.parse("documento.xml")para obter o elemento raizde um documento XML existente

R3/+F&$2 ;'$%7)1& B ,+.-'&4C*#40&@_'3/+F&$23CVF-_A:

!  Exemplo de uso de DOM com Java7-&F&$2 &-&F&$23 B ;'$%7)1&C%&27-&F&$2(HT'@_0&/#3_A:

&-&F&$23C#**&$'1I.-'@;'$%7)1&C/4&#2&7-&F&$2@_*_AA:

Serialização " XML 90

Page 90: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 90/262

Serialização " XML

Uma vez criada a árvore DOM, ela pode ser

serializada para XML (arquivo de texto)

!  Solução padrão é usar XSLT ( javax.transform)! 

h#9#VCVF-C24#$0;34FCq

h#9#VCVF-C24#$0;34FC'3FCRM"?3+4/&:

h#9#VCVF-C24#$0;34FC024&#FC?24&#Fd&0+-2:

O trecho abaixo imprime o documento XML contido emdocument na saída padrão (System.out)

TransformerFactory tFactory = TransformerFactory.newInstance();Transformer transformer = tFactory.newTransformer();

DOMSource source = new DOMSource(document);

StreamResult result = new StreamResult(System.out);

transformer.transform(source, result);

Transformação XSLT (TrAX) 91

Page 91: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 91/262

Transformação XSLT (TrAX)!  Inicialize o ambiente (DocumentBuilder, pacotes, etc.)

!  Carregue o arquivo-fonte em uma árvore DOM

!  Inicialize a árvore DOM do arquivo resultado

!  Crie os objetos (e crie um InputStream com a folha XSLT)

!  Inicialize o transformador XSL

!  Faça a transformação

!  A árvore DOM resultante está em 4&0R3/+F&$2

?3+4/& VF-?3+4/& B $&k RM"?3+4/&@'3/+F&$2A:d&0+-2 4&0+-2 B $&k RM"d&0+-2@4&0R3/+F&$2A:?3+4/& V0-?2H-& B $&k ?24&#F?3+4/&@&02.-3A:

L4#$0;34F&4`#/234H 2; B L4#$0;34F&4`#/234HC$&kT$02#$/&@A:

L4#$0;34F&4 2 B 2;C$&kL4#$0;34F&4@V0-?2H-&A:

2C24#$0;34F@VF-?3+4/&= 4&0+-2A:

R3/+F&$2 '3/+F&$2  B ,+.-'&4C*#40&@_;3$2&CVF-_A:

R3/+F&$2 4&0R3/+F&$2 B ,+.-'&4C$&kR3/+F&$2@A:

StAX streaming API 92

Page 92: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 92/262

StAX streaming API! 

StAX possui duas APIs: Cursor API e Iterator API

Cursor API – navega por um componente XML de cada vez!  Interface XMLStreamReader (similar a SQL ResultSet)

!  Metodos de iterator next()/hasNext()

!  Métodos de acesso ao XML getText(), getLocalName(), etc.

!  Interface XMLStreamWriter (similar a usar SAX para gravação)

writeStartElement(), writeEndElement(), writeCharacters(), …

Iterator API – XML como um stream de eventos

!  XMLEvent – encapsula os eventos SAX - subtipos

!  StartDocument, StartElement, Characters, etc.

!  XMLEventReader extends Iterator

!

 

XMLEvent nextEvent(), boolean hasNext(), XMLEvent peek()!  XMLEventWriter

!  Add(XMLEvent), add(Attribute), flush(), close()

!  XMLInputFactory, XMLOutputFactory, XMLEventFactory

!  Configuram e inicializam o parser para as duas APIs

Como usar StAX cursor API 93

Page 93: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 93/262

C S

!  Leitura

n"QT$*+2`#/234H 0P B n"QT$*+2`#/234HC$&kT$02#$/&@A:n"Q?24&#Fd&#'&4 04 B

0PC/4&#2&n"Q?24&#Fd&#'&4@*#2I= $&k `.-&T$*+2?24&#F@*#2IAA:

kI.-&@04CI#0P&V2@AA 604C$&V2@A:E

?H02&FC3+2C*4.$2-$@04C%&2L&V2@AA:D

!  Gravaçãon"QM+2*+2`#/234H 'P B n"QM+2*+2`#/234HC$&kT$02#$/&@A:

n"Q?24&#F54.2&4 k B'PC/4&#2&n"Q?24&#F54.2&4@$&k `.-&54.2&4@*#2IAA:

kCk4.2&?2#42R3/+F&$2@_+2;ly_=_<C\_A:kCk4.2&?2#427-&F&$2@_I22*gGG$#F&0*#/&_= XF&$0#%&F_A:kCk4.2&1I#4#/2&40@Ww&--3p_A:kCk4.2&7$'7-&F&$2@A:kCk4.2&7$'R3/+F&$2@A:kC/-30&@A: 

JAXB 94

Page 94: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 94/262

JAXB!

 

Java API for XML Binding

!

 

Mapeia classes Java a XML Schema!  Classes mapeadas a XML Schema (ferramentas xjc e schemagen)

!  Objetos mapeados a documentos XML (através da API javax.xml.bind eoperações de serialização em XML (marshalling e unmarshalling)

XMLSchema

ClassesJavaBinding

xjc

schemagen

Documentos(instâncias

XML)

Objetos(instâncias

Java)Marshalling

unmarshal()

marshal()

Geração de classes 95

Page 95: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 95/262

Geração de classes

!  Classes geradas a partir de um XML Schema são

criadas em um pacote, que inclui!  Uma classe Java derivada de um elemento XML

!  Uma classe ObjectFactory usada para produzir instâncias

!  Comportamento default XML Schema " Java

!  Tipos complexos geram classes

!  Tipos simples geram elementos ou atributos (configurável) mapeados a tiposprimitivos ou nativos do Java

!  Casos em que a informação é insuficiente para inferir o tipo geram JAXBElement (que possui métodos para obter nome e valor do objeto)

!  Pode ser configurado através de anotações no XML Schema<xs:annotation><xs:appinfo> ou XML de configuração <bindings> lido pelo xjc

!  Comportamento default para Java " XML Schema mapeia tipos deforma diferente

!  Pode ser configurado através de anotações

Page 96: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 96/262

Mapeamento Java " XML: tipos 97

Page 97: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 97/262

Mapeamento Java " XML: tipos

!  java.jang.Object" xs:anyType

 java.lang.String, java.util.UUID, java.net.URI" xs:string

!  java.math.BigInteger" xs:integer

!  java.math.BigDecimal" xs:decimal

!  int" xs:int, long" xs:long, float" xs:float, double" xs:double, etc.

 java.awt.Image, javax.activation.DataHandler, javax.xml.transform.Source" xs:base64Binary

!  java.util.Calendar, java.util.Date" xs:dateTime

!  javax.xml.datatype.Duration" xs:duration

 javax.xml.datatype.XMLGregorianCalendar"

 xs:anySimpleType

!  javax.xml.namespace.QName" xs:QName

Ferramentas 98

Page 98: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 98/262

!  xjc: gera classes Java a partir de XML Schema

!  Sintaxe: xjc opcoes <xml-schema …> [–b <config.xjb> …]

Exemplos:+a$ z' %&$&4#2&' z* /3FC#/F&CVF-C%&$ ?#2&-.2&0CV0'

+a$ z' C z* /3FC#4%3$#9.0C;.-F&0 `.-F&`#/#'&CV0'

+a$ 0/I&F#<CV0' 0/I&F#>CV0' z, ,.$'.$%0<CVh, z, ,.$'.$%0>CVh,

!  Exemplos e detalhes de customização via <xs:appinfo> ou arquivo de bindings

!  http://docs.oracle.com/javase/tutorial/jaxb/intro/custom.html 

!  schemagen: gera XML Schema a partir de código Java

!  Sintaxe: schemagen –cp classpath –d destino Arquivos.java …

!  Exemplo:-$K)7".)1 z/* /-#00&0 z' %&$&4#2&' 04/G*#/GJCh#9# 04/G(Ch#9#

!

 

Por default, cada pacote é um namespace e XML Schema!  Maior parte da configuração do XML Schema gerado pode ser feito usando

anotações nas classes

!  XML Schema é gerado a partir de arquivos Java no JAX-RS (RESTful WS)

Algumas anotações JAXB 99

Page 99: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 99/262

Usadas para configurar geração de XML Schema

Anotações de pacote e classe

@XmlSchema: configura mapeamento de pacote-namespace e seelementos e atributos serão qualificados por default

!  @XmlAccessorType: configura mapeamento de propriedades (get/set) e atributos

Anotações de classe/enum

!  @XmlRootElement: associa elemento global ao tipo XML Schema mapeado à classe

Anotações de propriedades (derivados de get/set) e atributos

!  @XmlElement: mapeia propriedade ou atributo Java a elemento XML

!  @XmlAttribute: mapeia proriedade ou atributo Java a atributo XML

!  @XmlElementWrapper: gera um elemento de agrupamento (tipicamente usado emcoleções). Ex: <objetos><objeto/><objeto/></objetos>

@XmlTransient: impede o mapeamento (tipicamente usado em atributos para evitar oduplo mapeamento causado ao mapear propriedades)

!  Referência oficial (JAXB Tutorial) com exemplos de uso

!  http://docs.oracle.com/javase/tutorial/jaxb/intro/customize.html 

!  http://docs.oracle.com/javase/tutorial/jaxb/intro/examples.html 

Exemplo de classe anotada 100

Page 100: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 100/262

pbc7#/$K)7"G1"7)-3"$) ? <K&&3NSSP0#7)-F"(.'1"L0-F$'7S<H*#/f#%& /3FC#4%3$#9.0C;.-F&0C%&$&4#2&':

bc7#d''&9#)7)1&

bc7#Z$$)--'(*43)Gc7#Z$$)--*43)F2eMA5!f,9,M9dH

bc7#*43)G1"7) ? <-"#"<I 3('3`(;)( ? g<1'7)<I

<#'&"$"'<I

<"--)1&'-<I

hH

*+,-./ /-#00 ?#-# .F*-&F&$20 ?&4.#-.{#,-& 6bc7#*("1-0)1&

*4.9#2& Q.02]J00&$23^ #00&$230:

*4.9#2& ?24.$% $3F&:*4.9#2& .$2 -32#/#3:

bc7#9#)7)1&i("33)(bc7#9#)7)1&G1"7)?<"--)1&'<H

*+,-./ Q.02]J00&$23^ %&2J00&$230@A 64&2+4$ #00&$230:

DED

Sem estas anotações default seria

]0#-#^]#00&$230^E]G#00&$230^]#00&$230^E]G#00&$230^

]G0#-#^

Com anotações o resultado será

]0#-#^O"--)1&'-T

O"--)1&'TjOS"--)1&'TO"--)1&'TjOS"--)1&'T

OS"--)1&'-T]G0#-#^

Não irá persistir o atributo <assentos> (não precisa,

pois já está mapeando <assentos> a getAssentos())

PUBLIC_MEMBER é defaut. Mapeia propriedades e

atributos. Melhor seria usar XmlAccessType.FIELD ou

PROPERTY e não precisar do @XmlTransient

Namespace do Schema

mapeado a pacote

JAXBContext 101

Page 101: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 101/262

!  Antes de iniciar a serialização XML (marshalling e unmarshaling)

é necessário configurar o JAXBContext

A forma mais simples é passando o(s) pacote(s) das classes geradas comoargumento ou uma lista de classes

8Jn(13$2&V2 h/< B 8Jn(13$2&V2C$&kT$02#$/&@_/3FC#/F&C%&$_A:

8Jn(13$2&V2 h/> B8Jn(13$2&V2C$&kT$02#$/&@X*#/32&C+FC%&$N*#/32&C'3.0C%&$N3+243C*#/32&C%&$_A:

8Jn(13$2&V2 h/Y B8Jn(13$2&V2C$&kT$02#$/&@$&k 1-#00ij6`.-F&C/-#00= 79&$23C/-#00DA:

!  É possível passar propriedades de configuração e ter acesso a recursosproprietários do provedor JAXB usado

!  Exemplo: propriedade media-type do EclipseLink Metro configura o JAXB a produzir e

consumir JSON em vez de XML"#* 3('3)(&0)- B $&k w#0I"#*@A:3('3)(&0)-C*+2@_&/-.*0&-.$fCF&'.#l2H*&_= _#**-./#2.3$Gh03$_A:8Jn(13$2&V2 h/Y B

8Jn(13$2&V2C$&kT$02#$/&@$&k 1-#00ij6`.-F&C/-#00D= 3('3)(&0)-A:

JAXB Marshal / Unmarshal 102

Page 102: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 102/262

!  Unmarshalling converte XML em uma arvore de

objetos Java8Jn(13$2&V2 h/ B

8Jn(13$2&V2C$&kT$02#$/&@ _/3FC#4%3$#9.0C;.-F&0C%&$_ A:e17"(-K"##)( % ? a$F$()"&)e17"(-K"##)(GHJ

`.-F& ;.-F& B @`.-F&A%F%17"(-K"#@ $&k `.-&@ _22<[YsY[\CVF-_ A A:

Pode-se também criar novas instâncias usando os métodos doObjectFactory gerado`.-F& ;.-F& B `[a)$&6"$&'(4F$()"&)60#7)GHJ

!  Marshalling converte uma árvore de objetos Java em XML

8Jn(13$2&V2 h/ B8Jn(13$2&V2C$&kT$02#$/&@ _/3FC#4%3$#9.0C;-F&0C%&$_ A:

`.-F& ;.-F& B M,h&/2`#/234HC/4&#2&`.-F&@A:;.-F&C0&2J$3@>\<tA: GG #-2&4#$'3 3,h&23,"(-K"##)( 7 ? a$F$()"&),"(-K"##)(GHJ

7F7"(-K"#@ ;.-F&= ?H02&FC3+2 A:

JSON (JavaScript Object Notation) 103

Page 103: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 103/262

( p j )! 

Formato de dados baseado em JavaScript!  RFC 4627 http://tools.ietf.org/search/rfc4627 

Tipo MIME: application/json

Possui sete tipos de valores:!  Duas estruturas: objeto e array

!  Dois tipos escalares: string (entre aspas) e número

Dois literais booleanos: os valores true e false!  O valor null

Estruturas! 

Objeto: coleção de pares nome:valor representados entre {} e

separados por vírgula. Exemplo:6.'g<>Y= /.'#'&g_U#4.0_= 9330gi_"YttX=_8[<[_j= *30g6?g[Csm= 5gt\CYYDD

Array: lista ordenada de valores representados entre [] e separadospor vírgula. Exemplo:

i<= _2&V23_= 6Vg>YY= Hg[[<D= i\=\=<jj

APIs JSON em Java 104

Page 104: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 104/262

!  JSON pode ser codificado diretamente em String

(se for muito simples) e processado com métodosde String como split(), substring(), indexOf() e outros?24.$% h03$ B _6_c $3F&<c_g_c9#-34<c_=_c$3F&>c_g_c9#-34>c_D_:

?24.$%ij 3,h&230 B h03$C0*-.2@_||=_A:

?24.$% $3F& B 3,h&230i\jC0*-.2@_||g_Ai\j:

?24.$% 9#-34 B 3,h&230i\jC0*-.2@_||g_Ai<j:

!  Java EE 7 disponibiliza uma API para construir objetos JSON e paraconverter strings JSON em mapas!  É um par de APIs de baixo nível (não é mapeamento objeto-JSON)

Existem várias implementações que que fazem mapeamento(binding) objeto-JSON automático (não são parte do Java EE)!  MOXy, Jettison, Jersey, Jackson, etc.

JSON API 105

Page 105: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 105/262

JSON Streaming API ( javax.json.stream)!

 

Análogo a SAX: leitura sequencial (baixo nível)

!  JsonParser – permite ler um stream JSON e capturar eventos (ex:Event.KEY_NAME, Event.START_OBJECT, Event.START_ARRAY, etc.)

JsonGenerator – métodos para criar uma estrutura JSON

JSON Object Model API ( javax.json)!  Análogo a DOM: estrutura em árvore; I/O streaming via decorators

JsonObject – representa um objeto JSON – contém um Map; criadocom JsonObjectBuilder

JsonArray – representa um array JSON – contém um List; criado com

JsonArrayBuilder!  Leitura e gravação usando JsonReader (um java.io.Reader) e

JsonWriter (um java.io.Writer)

!  Tipos JsonValue: JsonObject, JsonArray, JsonString, JsonNumber

JSON Streaming 106

Page 106: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 106/262

g[ {"nome" : "James Clerk Maxwell",

"email" : "[email protected]"},

{"nome" : "Nicola Tesla",

"email" : "[email protected]"} ]

URL url = new URL("http://somewhere.org/scientists/emails");

JsonParser parser = Json.createParser(url.openStream());

while (parser.hasNext()) {

JsonParser.Event event = parser.next();

if (event == Event.KEY_NAME)

System.out.print(parser.getString() + "\n ");

if (event == Event.VALUE_STRING)System.out.println(parser.getString());

}

nomeJames Clerk Maxwell

email

[email protected]

nome

Nicola Teslaemail

[email protected]

JSON Object Model 107

Page 107: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 107/262

Lendo uma estrutura JSON

Criando uma estrutura JSON e enviando para a console

URL url = new URL("http://somewhere.org/scientists/emails");JsonReader reader = Json.createReader(new InputStreamReader(url.openStream()));

JsonArray emails = reader.readArray();for(int I = 0; I < emails.length(); i++) {

System.out.println(“nome: ” + object.getJsonObject(i).getString(“nome”));System.out.println(“email: ” + object.getJsonObject(i).getString(“email”));

}

JsonArray emails = Json.createArrayBuilder().add(Json.createObjectBuilder()

.add("nome", "James Clerk Maxwell").add("email", "[email protected]")).add(Json.createObjectBuilder()

.add("nome", "Nicola Tesla").add("email", "[email protected]")).build();

JsonWriter out = Json.createWriter(System.out);

out.writeArray(emails);

JSON-Java binding 108

Page 108: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 108/262

!  Binding possibilita a realização de transformaçãoobjeto-JSON-objeto de forma transparente (comoacontece em JAXB ou JPA)

Ainda não há uma solução padrão, mas maior parte dasimplementações aproveitam a API do JAXB!  Usam jaxbMarshaller.marshal() para gerar JSON, e

 jaxbUnmarshaller.unmarshal() para ler JSON!  Configuração varia entre implementações

Implementações que suportam JSON binding!  EcliseLink MOXy (implementação JAXB nativa no Glassfish 4)

Jersey (implementação de REST, JAXB e JSON) http://jersey.java.net !  Jettison (implementação JAXB) http://jettison.codehaus.org/

!  Jackson (biblioteca JSON) http://jackson.codehaus.org - não usaJAXB no processo

EclipseLink MOXy 109

Page 109: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 109/262

!  Para substituir o provedor JAXB default por MOXy:!  Inclua JARs do MOXy como dependências do projeto! 

Inclua arquivo jaxb.properties no classpath, contendo javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Configuração de JAXBContext

Map properties = new HashMap();

props.put("eclipselink.media-type", "application/json");JAXBContext ctx = JAXBContext.newInstance(new Class[] { Produto.class }, props);

!  JSON " JavaUnMarshaller u = ctx.createUnMarshaller();

Produto produto= u.unmarshal(new StreamSource(“produto123.json”));

Java " JSONMarshaller m = ctx.createMarshaller();

m.marshal(produto, System.out);

Exercícios: XML e JAXP 110

Page 110: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 110/262

1.  Use JAXP (DOM, SAX, StAX – qual o melhor neste caso?)

para ler os documentos XML da pasta filmes, extrair seustítulos e códigos do IMDB

2.  Crie um documento XML novo contendo todos os titulosdos filmes e código IMDB lidos no exercício anterior daforma

];.-F&0^

]2.2+-3 .F',BWHHH<X^VVV<]G2.2+-3^

]2.2+-3 .F',BWHHH>X^VVV>]G2.2+-3^

E

]G;.-F&0^

3. 

Qual a expressão XPath para localizar no XML resultantea.  O título do terceiro filme?

b.  Todos os códigos IMDB

Exercícios: JAXB e JSON 111

Page 111: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 111/262

4.  A pasta /filmes contém 10 arquivos XML que foram

produzidos por outra aplicação. Eles são especificadospelo esquema filmes.xsd.

a. 

Crie uma aplicação (standalone ou Web) que permita a conversãodesses arquivos em objetos Java

b.  Liste os objetos disponíveis e seus atributos

c. 

Permita a criação de novos objetos. Eles devem ser gravados comoXML e aparecerem na lista de filmes disponíveis

d. 

Crie um método que retorne a lista de filmes como um XML único

5.  Uma aplicação JavaScript precisa receber dados dos objetos Filme

fornecidos por um método de um Managed Bean. Os objetos sãoretornados como uma List<Filme>.

a. 

Crie um método que devolva essa lista como um string JSON (adapte ométodo criado no exercício anterior)

!  Especificações!  XML: http://www.w3.org/TR/REC-xml/ 

! XML Namespaces http://www w3 org/TR/xml names/

112

Page 112: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 112/262

   R  e   f  e  r   ê  n  c   i  a  s

!  XML Namespaces http://www.w3.org/TR/xml-names/ 

!  XML Schema http://www.w3.org/XML/Schema 

!  XPath http://www.w3.org/TR/xpath/ 

!  DOM http://www.w3.org/TR/REC-DOM-Level-1/ 

!  SAX http://www.saxproject.org/ 

!  OASIS WSS https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss 

!  JSON: descrição resumida: http://json.org/ 

!  JSON: especificação RFC 4627 http://tools.ietf.org/search/rfc4627 

!  JSON Java API: http://jcp.org/en/jsr/detail?id=353 

Artigos, documentação e tutoriais!  Helder da Rocha. Tutorial XML http://argonavis.com.br/cursos/xml/x100/ 

!  Helder da Rocha. Tutorial XPath http://argonavis.com.br/cursos/xml/x100/x100_8_XPath.pdf  

!  Helder da Rocha. Tuturial XML Schema http://argonavis.com.br/cursos/xml/x170/ 

!  Oracle. Java Tutorial. JAXP (SAX, DOM, TrAX) http://docs.oracle.com/javase/tutorial/jaxp 

!  Oracle. Java Tutorial. StAX http://docs.oracle.com/javase/tutorial/jaxp/stax 

Oracle. Java Tutorial. JAXB http://docs.oracle.com/javase/tutorial/jaxb !  Kotamraju, J. Java API for JSON Processing. Oracle, 2013.

http://www.oracle.com/technetwork/articles/java/json-1973242.html 

!  JSON & XML Java Binding (EclipseLink MOXy): http://www.eclipse.org/eclipselink/moxy.php 

!  EclipseLink MOXy. “10 Using JSON Documents”, in “Developing JAXB Applications UsingEclipseLink MOXy”, Release 2.4. 2013. http://www.eclipse.org/eclipselink/documentation/2.4/moxy/json.htm 

!  Jersey. “Chapter 5. JSON Support”. https://jersey.java.net/documentation/1.17/json.html 

3

Page 113: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 113/262

SOAP Web ServicesAplicações Java usando JAX-WS e Java EE 7

3Infraestrutura de sistemas

Java EE

Conteúdo 114

Page 114: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 114/262

1.  Introdução a SOAP Web Services!  Fundamentos da tecnologia!  Protocolos e mensagens: SOAP, WSDL

2.  Como criar um serviço SOAP com EJB e JAX-WS! 

Como componente Web!  Como session bean

3. 

Como criar um cliente SOAP usando JAX-WS!  Tipos de clientes!  Cliente estático! 

Clientes dinâmicos

4.  Tópicos avançados!

 

Handlers e MessageContext!  WS-Addressing!  WS-Security!  SOAP sobre JMS

SOAP Web Services 115

Page 115: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 115/262

Arquitetura de objetos distribuídos (método RPC – RemoteProcedure Call ou Messaging/Notificação)

!  Objeto remoto implementa interface comum via proxy

Interface comum é expressa em uma IDL: WSDL

!  Cliente acessa objeto remoto transparentemente através do proxy em container(runtime) que se comunica com URI do serviço em um servidor Web (endpoint), usandoum protocolo em XML (SOAP)

!  Dados e objetos são serializados (marshaled) em formato XML na transferência

!  Baseado em padrões: especificações OASIS, W3C, WS-I

!  SOAP – Simple Object Access Protocol

!  Linguagem XML para requisições e respostas (procotolo)

!  WSDL – Web Service Description Language

!  Linguagem XML usada para descrever interfaces (métodos remotos)

!  XML Schema

!  Linguagem XML usado para representar tipos de dados usados na comunicação

!  XML Schema é usado dentro da WSDL

Livro getLivro()

{ ... }  

BibliotecaImpl  

…ref.getLivro();  

Cliente  

Comunicação RPC  

Livro getLivro();  

WSDL 

Biblioteca  

Servidor Web

 

Runtime W S 

ProxyHTTP  

SOAP

Endpoint

Origens de SOAP WS 116

Page 116: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 116/262

!  Aproveitar requisição HTTP POST*

Geralmente as portas do HTTP estão abertas nos Firewalls

Clientes HTTP usam método POST para enviar dados!

 

Tipicamente usado por browsers para enviar dados deformulários HTML e fazer upload de arquivos

!  Exemplo: formulário HTML

Requisição POST gerada pelo browser com dados do formulário

POST /cgi-bin/catalogo.pl HTTP/1.0Content-type: text/x-www-form-urlencodedContent-length: 15

isbn=2877142566

 <FORM ACTION="/cgi-bin/catalogo.pl"

 METHOD="POST"> <H3>Consulta preço de livro</H3> <P>ISBN: <INPUT TYPE="text" NAME="isbn"> <INPUT TYPE="Submit" VALUE="Enviar"> </FORM>  

Cabeçalho HTTP

 Mensagem (corpoda requisição)

Linha em branco

* Web Services SOAP suportam outros protocolos de transporte mas HTTP tem maior interoperabilidade

Como criar um Web Service? 117

Page 117: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 117/262

!  Exemplo de um servico RPC simples que troca mensagensXML via HTTP POST! 

Clientes e servidores compartilham esquema (DTD) simples quedescreve as mensagens de chamada e resposta

!  Cliente envia requisições POST para servidor Web

!  Aplicação Web recebe requisições (JSF, JSP, ASP, PHP, servlet)

POST /ISBNService.jsp HTTP/1.0

Content-type: text/xmlContent-length: 90

 <chamada> <funcao> <nome> getPrice </nome> <param> 2877142566 </param>

 </funcao> </chamada>

HTTP/1.1 200 OKContent-type: text/xmlContent-length: 77

 <resposta> <funcao> <param> 19.50 </param>

 </funcao> </resposta>

ISBNService.jsp

ISBNClient

ISBNQuery

getPrice()

2877142566

19.50

D

1

23

4

 gera

requisição

 gera

resposta

XML-RPC 118

Page 118: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 118/262

Primeira especificação (1998) para RPC em XML viaHTTP POST (criado no grupo de discussões xml-dev)!  Projetada para ser a solução mais simples possível

!  Implementações em várias linguagens

Exemplo anterior com XML-RPC (cabeçalhos HTTP omitidos)

 <methodCall> <methodName> getPrice </methodName> <params> <param> <value><string> 2877142566 </string></value>

 </param> </param>

 </methodCall>

 <methodResponse>

 <params> <param> <value><double> 19.5 </double></value>

 </param> </param>

 </methodResponse>

Resposta

Requisição

Page 119: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 119/262

Page 120: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 120/262

SOAP 121

Page 121: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 121/262

!  Contém todas as informações necessárias à comunicaçãosíncrona ou assíncrona

SOAP não é um protocolo RPC

!  Um par de mensagens SOAP pode ser usado para RPC: operação tipo request-response; pode também ser one-way (há dois outros tipos)

!  Transporte pode ser HTTP, SMTP, ou outro

!  Mensagens podem conter qualquer coisa (texto, bytes): payload

É extensível

!  Pode ser manipulado via APIs em Java: JAXP, SAAJ

Envelope

 Attachment

 Attachment

 XML

 XML

 Mensagem SOAP

Header

Body

Envelope

Conteúdobaseado emesquema do

usuário

...

Estrutura do SOAP 122

Page 122: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 122/262

!  HTTP Content-type!  application/soap+xml

!  Namespace do Envelope:!  "http://www.w3.org/2001/12/soap-envelope"

!  <Envelope>

!  Contém <Header> (opcional, metadados) e <Body> (obrigatório, dados)

!  Componentes de Body!  Dados da mensagem: payload (declarados com namespace próprio)

!  <Fault> – mensagem de erro; contém <faultcode>, <faultstring>, <faultactor>,<detail>; faultcode “Client” indica erro no cliente, “Server” erro no servidor

Formas de incluir anexos (SOAP Attachments) para dados binários!  Incluídos dentro da mensagem SOAP como dados serializados usando XOP (XML-

binary Optimized Packaging – formato base64): ineficiente, overhead > 30%

!  MTOM (Message Transmission Optimization Mechanism): anexos incluídos fora damensagem SOAP(anexo no protocolo de transporte em container MIME) usandoum placeholder XOP como anexo SOAP

WSDL 123

Page 123: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 123/262

Usado para descrever (e localizar) um Web Service SOAP

!  <types>

!

 

Inclui XML Schema com definição de tipos usados no serviço!  <message>

!  Descrevem as mensagensque são usadas nacomunicação

!  <portType>

Descreve as operaçõessuportadas por cadaendpoint (4 tipos)

!  <operation> descreve asmensagens que compõemuma operação

!  <binding>

Declara formato de dadose protocolo de transporte

!  <service>

!  Informa a localização doserviço

Compare com amensagem SOAPmostrada

anteriormente

Informa onde está o serviço (endpoint)

 <?xml version="1.0" encoding="UTF-8"?>   <definitions name="BookstoreService"

targetNamespace="http://mybooks.org/wsdl" xmlns:tns="http://mybooks.org/wsdl" xmlns="http://schemas.xmlsoap.org/wsdl/" 

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  

xmlns:xsd ="http://www.w3.org/2001/XMLSchema">   <types>...</types>   <message name="BookstoreIF _getPrice">  

 <part name="String_1" type="xsd:string"/>   </message>   <message name="BookstoreIF _getPriceResponse">  

 <part name="result" type="xsd:decimal"/>   </message>   <portType name="BookstoreIF">  

 <operation name="getPrice" parameterOrder="String_1">  

 <input message="tns:BookstoreIF_getPrice"/>   <output message="tns:BookstoreIF_getPriceResponse"/>  

 </operation>   </portType>   <binding ... >  ... </binding>   <service ... >  ... </service>  

 </definitions>  

Suporte Java 124

Page 124: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 124/262

!  APIs padrão Java!  JAX-WS – API de alto nível para aplicações RPC com

WSDL usando Web Services SOAP (é transparente eesconde todos os detalhes do XML)

!  JAXP – Java API for XML Processing – API para manipulação de XML em baixonível (DOM, SAX, XML Schema, XSLT, XPath, etc.)

!  SAAJ – SOAP with Attachments for Java – API para construir e ler mensagens SOAP(usado em aplicações assíncronas)

JAXB – Java API for XML Binding – mapeamento Objeto-XML

!  Implementações populares (aderem à especificação padrão WS-I BasicProfile e oferecem recursos adicionais)

!  Projeto Metro (Kenai): implementação de referência JAX-WS do Glassfish

!  Apache CXF (principal implementação usada em JBossWS)

!  APIs e implementações antigas!  JAX-RPC – API anterior a JAX-WS (parte do WS Dev Kit)

!  Apache Axis1/Axis2: implementações antigas (suportam JAX-RPC)

Algumas ferramentas úteis 125

Page 125: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 125/262

!  Para testar e depurar Web Services SOAP sobre HTTP e REST!  Browsers

Firebug https://getfirebug.com !  Firefox RESTClient https://addons.mozilla.org/en-US/firefox/addon/restclient 

!  Chrome Dev Tools https://developers.google.com 

!  Aplicações gráficas

!  Java: REST Client https://code.google.com/p/rest-client/ 

Windows: Fiddler http://fiddler2.com/ !  Linux (e OS X): MITMPROXY http://mitmproxy.org/ 

!  OS X: Cocoa REST Client https://code.google.com/p/cocoa-rest-client/ 

!  Para enviar requisições por linha de comando

!  cURL http://curl.haxx.se/ 

!  Web proxies

Wireshark, Squid, JMeter, Charles Proxy, WebScarab, …

!  Para programar clientes HTTP em Java!  Apache HttpComponents (HttpClient) http://hc.apache.org/ 

Como criar um serviço SOAP?! Sem usar nenhuma API de Web Services pode-se criar o

126

Page 126: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 126/262

!  Sem usar nenhuma API de Web Services, pode se criar oserviço com um servlet mapeado a uma URL (endpoint)!  Servlet implementa doPost() e extrai corpo da mensagem (XML)

usando ferramentas XML como DOM ou SAX (JAXP)!  A resposta requer a devolução de um documento XML SOAP, que pode ser

gerado com JAXP ou simplesmente incluindo o string na response se for simples

!  Criar um serviço SOAP desta forma serve como aplicação didática

!  Seria a melhor solução em 1998, mas hoje temos várias APIs para SOAP quefacilitam o desenvolvimento e escondem totalmente o XML

Cliente HTTP

Cria mensagemSOAP (SAAJ,

JAXP)

Extrai dados demensagem SOAP

(SAAJ, JAXP)

MensagemSOAP Req

Conecta via POST

Tomcat

webservice.war

ServletdoPost()

Servlet-mapping/loteria/*

LoteriaServiceapostar(numeros)

XML<numeros>

2,21,35,40,42,49</numeros>

JAXP

JAXP

XML<resultado>

1438294</resultado>Mensagem

SOAP Res

SAAJ

Como criar um serviço SOAP? 127

Page 127: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 127/262

Em Java, usando JAX-WS há duas alternativas

(1) Através da criação de um componente Web!  (2) Através de um EJB

(1) Componente Web

!  Criar serviço (SEI) e interface (opcional) configurado com anotações

!  Rodar ferramentas para gerar código

Empacotar classes compiladas em um WAR e fazer deploy em servidor Web

!  (2) EJB

!  Criar Stateless Session Bean (SEI) configurado com anotações

!  Empacotar e fazer deploy do EJB-JAR ou EAR no servidor de aplicações

!  Ferramentas de linha de comando disponíveis no Java SE

!  wsimport: recebe um WSDL e gera código Java usado para criar serviços e clientes

!  No JBossWS use wsconsume (em JBOSS_HOME/bin – também tarefa Ant e Maven)

!  wsgen: recebe POJOs Java e gera artefatos JAX-WS, mapeamentos (JAXB) e WSDL

!  No JBossWS use wsprovide (em JBOSS_HOME/bin – também tarefa Ant e Maven)

Componente Web! O serviço é implementado em uma classe Java

128

Page 128: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 128/262

!  O serviço é implementado em uma classe Java!

 

Use anotação @WebService (javax.jws) para classe

!  Classe representa um Service Endpoint Interface (SEI)

!  Todos os métodos públicos de um SEI são automaticamenteincluídos na interface do serviço 

Empacote em um WAR e faça deploy

bi)[/)(L0$)*+,-./ /-#00 `.-F&`#/#'& 6

!U&40.02&$/&13$2&V2@+$.2P#F& B _`.-F&0?&49./&?3#*_A

7$2.2H"#$#%&4 &F:

*+,-./ Q.02]`.-F&^ %&2`.-F&0@A 6?24.$% h*o- B _0&-&/2 ;.-F& ;43F `.-F& ;.-F&_:Z+&4H o+&4H B &FC/4&#2&Z+&4H@h*o-A:4&2+4$ @Q.02]`.-F&^Ao+&4HC%&2d&0+-2Q.02@A:

DD

!7$2.2H

*+,-./ /-#00 `.-F& .F*-&F&$20 ?&4.#-.{#,-& 6!T' *4.9#2& Q3$% .':*4.9#2& ?24.$% 2.2+-3:*4.9#2& ?24.$% '.4&234:*4.9#2& Q3$% #$3:*4.9#2& -3$% '+4#/#3:*4.9#2& ?24.$% .F',:

D

WEB-INF

  w

  e   b .  x  m   lclasses

FilmesServiceSoap.war

Deploy

Endpoint:http://servidor/FilmesServiceSoap/FilmeFacadeService

Geração de código 129

Page 129: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 129/262

!  O servidor gera o código que implementa o Web Service na

implantação do serviço, se ele tiver suporte nativo a JAX-WS

O serviço também pode ser implantado em qualquer servidorcom suporte a servlets. Nesse caso é preciso

!  Usar ferramentas que irão interpretar as anotações para gerar código Java e WSDL

!  Configurar no web.xml o servlet que irá receber as requisições SOAP (depende da

implementação WS usada)!  Empacotar todas as classes no WAR

!  Exemplo

!  U-.)1 =$3 $#"--3"&K $'7F"(.'1"L0-FP0#7)-F-'"3F60#7)6"$";) kU-;# k; .)1[01

!  Para a implementação JBossWS (Apache CXF) useU-3('L0;) =$ $#"--3"&K ==U-;# $'7F"(.'1"L0-FP0#7)-F-'"3F60#7)6"$";) k' .)1[01

*#/32&Gh#Vk0GS&2`.-F&0C/-#00*#/32&Gh#Vk0GS&2`.-F&0d&0*3$0&C/-#00`.-F&`#/#'&?&49./&Ck0'-`.-F&`#/#'&?&49./&N0/I&F#<CV0'

Classes geradas

WSDL gerado 130

Page 130: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 130/262

!  Veja em http://servidor/nome-do-war/NomeDaClasseService?wsdl

<definitions targetNamespace="http://soap.filmes.argonavis.com/" name="FilmeFacadeService">

<types> … </types>

<message name="getFilmes">

<part name="parameters" element="tns:getFilmes"/>

</message>

<message name="getFilmesResponse">

<part name="parameters" element="tns:getFilmesResponse"/></message>

<portType name="FilmeFacade">

<operation name="getFilmes">…</operation>

</portType>

<binding name="FilmeFacadePortBinding" type="tns:FilmeFacade">… </binding>

<service name="FilmeFacadeService"><port name="FilmeFacadePort" binding="tns:FilmeFacadePortBinding">

<soap:address location="http://localhost:8080/FilmesServiceSoap/FilmeFacadeService"/>

</port>

</service>

</definitions>

Tipos de dados <types>! Inclui um XML Schema declarando tipos de dados

131

Page 131: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 131/262

 

Inclui um XML Schema declarando tipos de dados

!  Operações (parâmetros na requisição, tipo de retorno na resposta)

!  Descrição de tipos enviados como parâmetros ou retorno

]V0g0/I&F# 9&40.3$B_<C\_ 2#4%&2P#F&0*#/&B_I22*gGG03#*C;.-F&0C#4%3$#9.0C/3FG_^

]V0g&-&F&$2 $#F&B_.)&60#7)-_ 2H*&B_2$0g%&2`.-F&0_G^]V0g&-&F&$2 $#F&B_.)&60#7)-d)-3'1-)_ 2H*&B_2$0g%&2`.-F&0d&0*3$0&_G^

]V0g/3F*-&VLH*& $#F&B_P0#7)_^]V0g0&o+&$/&^

]V0g&-&F&$2 $#F&B_#$3_ 2H*&B_V0g-3$%_ F.$M//+40B_\_G^

]V0g&-&F&$2 $#F&B_'.4&234_ 2H*&B_V0g024.$%_ F.$M//+40B_\_G^]V0g&-&F&$2 $#F&B_'+4#/#3_ 2H*&B_V0g-3$%_G^]V0g&-&F&$2 $#F&B_.'_ 2H*&B_V0g-3$%_ F.$M//+40B_\_G^]V0g&-&F&$2 $#F&B_.F',_ 2H*&B_V0g024.$%_ F.$M//+40B_\_G^]V0g&-&F&$2 $#F&B_2.2+-3_ 2H*&B_V0g024.$%_ F.$M//+40B_\_G^

]GV0g0&o+&$/&^]GV0g/3F*-&VLH*&^

]V0g/3F*-&VLH*& $#F&B_.)&60#7)-X^ ]V0g0&o+&$/&G^ ]GV0g/3F*-&VLH*&^

]V0g/3F*-&VLH*& $#F&B_.)&60#7)-d)-3'1-)_^]V0g0&o+&$/&^

]V0g&-&F&$2 $#F&B_4&2+4$_ 2H*&B_2$0gP0#7)_ F.$M//+40B_\_ F#VM//+40B_+$,3+$'&'_G^]GV0g0&o+&$/&^

]GV0g/3F*-&VLH*&^]GV0g0/I&F#^

Page 132: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 132/262

@OneWay 133

Page 133: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 133/262

Métodos anotados com @OneWay têm apenas

mensagem de requisição!  Pode ser usada em métodos que retornam void

Exemplos!5&,"&2I3'

b`1)i"4*+,-./ 93.' &$9.#4J9.03R&0-.%#F&$23@A 6

ED

!5&,"&2I3'

b`1)i"4*+,-./ 93.' *.$%@A 6

ED

@WebParam e @WebResult 134

Page 134: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 134/262

!  Essas anotações permitem configurar o WSDL que serágerado e o mapeamento entre o SEI e o SOAP

!  @WebResult serve para configurar o elemento XML de retorno

!  No exemplo abaixo, a resposta estará dentro de um elemento <filme>;o default é <return>.

!5&,"&2I3'

bi)[d)-%#&G1"7)?<P0#7)<H

*+,-./ `.-F& %&2`.-F&@?24.$% .F',13'&A 64&2+4$ %&2`.-F&M,h&/[email protected]',13'&A:

D

!  @WebParam permite configurar nomes dos parâmetros!  No exemplo abaixo, o parâmetro da operação getFilme no SOAP e WSDL é imdb.

Seria imdbCode se o @WebParam não estivesse presente!5&,"&2I3'

*+,-./ `.-F& %&2`.-F&@bi)[2"("7G1"7)?l07;[<H ?24.$% .F',13'&A 6

4&2+4$ %&2`.-F&M,h&/[email protected]',13'&A:

D

Page 135: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 135/262

@SOAPBinding! Permite configurar o estilo do mapeamento entre a

136

Page 136: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 136/262

!  Permite configurar o estilo do mapeamento entre amensagem SOAP e o Web Service. É opcional.!  Afeta o formato do WSDL gerado e mensagens SOAP

!  Atributos

!  style

!  SOAPBinding.Style.RPC ou

!  SOAPBinding.Style.DOCUMENT (default)

use!  SOAPBinding.Use.ENCODED ou

!  SOAPBinding.Use.LITERAL (default)

!  parameterStyle

!  SOAPBinding.ParameterStyle.BARE

!  SOAPBinding.ParameterStyle.WRAPPED (default)

!  Exemplo: use para anotar o SEI (todos os atributos são opcionais)!?MJU(.$'.$%@02H-&B?MJU(.$'.$%C?2H-&CRM1K"7PL=

+0&B?MJU(.$'.$%CK0&CQTL7dJQ=*#4#F&2&4?2H-&B?MJU(.$'.$%CU#4#F&2&4?2H-&C5dJUU7RA

O artigo “Which style of WSDL should I use?” descrevecomo esses atributos alteram o formato do SOAP e WSDL:

www.ibm.com/developerworks/webservices/library/ws-whichwsdl/ 

“RPC” aqui é um estilo do protocolo SOAP (não tem nada aver com o modelo de programação RPC: tanto DOCUMENTcomo RPC são usados em comunicação request-response)

APIs de serviços no JAX-WS! Java Service Endpoint Interface SEI (default)

137

Page 137: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 137/262

!  Java Service Endpoint Interface - SEI (default)!  Alto nível: usa WSDL para esconder detalhes da comunicação

(a programação do cliente e servidor podem ignorar o XML)

Endpoint Provider Interface!  Baixo nível: trabalha diretamente com as mensagens XML

!  Serviço pode trabalhar apenas com o payload das mensagens (dados contidosno envelope SOAP) em vez de usar a mensagem inteira

!  Modos de serviço @ServiceMode: MESSAGE e PAYLOAD (default)

!  Exemplo!5&,?&49./&U439.'&4!?&49./&"3'&@9#-+&B?&49./&C"3'&C2ZmA`ZQA*+,-./ /-#00 "H?&49./& .F*-&F&$20 U439.'&4]/'%($)^ 6

*+,-./ ?3+4/& 01L'n)@/'%($) 4&o+&02A 6

?3+4/& 4&o+&02U#H-3#' B 4&o+&02C%&2U#H-3#'@A:?24.$% 4&0*3$0& B _OP0#7)-TOP0#7)TO&0&%#'TFFFOSP0#7)-T_:?24&#F?3+4/& 4&0*3$0&U#H-3#' B $&k ?24&#F?3+4/&@$&k ?24.$%d&#'&4@4&0*3$0&AA:4&2+4$ 4&0*3$0&U#H-3#':

DD

Stateless remote (SOAP) bean! Forma mais simples de criar e implantar um serviço

138

Page 138: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 138/262

!  Forma mais simples de criar e implantar um serviço!  SEI é implementado por um stateless session bean

!

 

Resultado idêntico ao Web Service via componente Web!  Permite acesso remoto via porta HTTP!  Exporta WSDL

Para criar!  Declare uma classe com @Stateless!  Adicione a anotação @WebService

@Stateless @WebService(endpointInterface="LoteriaWeb")public class LoteriaWebBean implements LoteriaWeb {  @Override  public int[] numerosDaSorte() {  int[] numeros = new int[6];  for(int i = 0; i < numeros.length; i++) {  int numero = (int)Math.ceil(Math.random() * 60);  numeros[i] = numero;  }  return numeros;  }}

@WebServiceinterface LoteriaWeb {  int[] numerosDaSorte();}

Declaração explícita de umService Endpoint Interface quedeclara os métodos que serão

expostos é opcional 

Clientes SOAP!  Podem ser criados de várias formas, em Java ou em outras

139

Page 139: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 139/262

linguagens

!  Formas mais simples consiste em gerar código estaticamente 

compilando o WSDL ou usar um container do fabricante!  Outras estratégias permitem gerar stubs, proxies e classes dinamicamente, ou ainda

usar reflection para chamar a interface dinamicamente

!  Exemplo de cliente (estático) Java

public class WSClient {

  public static void main(String[] args) throws Exception { 

LoteriaWebService service = new LoteriaWebService();  LoteriaWeb port = service.getLoteriaWebPort();  List<String> numeros = port.numerosDaSorte(); 

System.out.println("Numeros a jogar na SENA:");  for(String numero : numeros) {  System.out.println(numero);  }

  }}

Classesgeradas

LoteriaWebService

= stub

LoteriaWeb

= proxy

Compilação do WSDL 140

Page 140: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 140/262

!  A ferramenta wsimport (Java) ou wsconsume (CXF) geraartefatos Java necessários aos clientes compilando o WSDL

!  Classes (DTO) representando tipos usados (parâmetros e valores de retorno)

!  Implementação do stub, representando o serviço

!  Implementação do port, representando o endpoint

!  Geração de código com wsimport

!  k0.F*342 lf&&* l0 %&$04/ l' %&$,.$ l* /3FC#4%3$#9.0C;.-F&0C/-.&$2C03#*C%&$&4#2&'

I22*gGG-3/#-I302gy\y\G`.-F&0?&49./&?3#*G`.-F&`#/#'&?&49./&}k0'-

!  Geração de código com wsconsume

!  k0/3$0+F&C0I lf l0 %&$04/ l3 %&$,.$ l* /3FC#4%3$#9.0C;.-F&0C/-.&$2C03#*C%&$&4#2&'I22*gGG-3/#-I302gy\y\G`.-F&0?&49./&?3#*G`.-F&`#/#'&?&49./&}k0'-

!  Classes geradas (inclua no classpath do cliente)

`.-F&C/-#00`.-F&`#/#'&C/-#00

`.-F&`#/#'&?&49./&C/-#00

S&2`.-F&0C/-#00S&2`.-F&0d&0*3$0&C/-#00M,h&/2`#/234HC/-#00*#/f#%&l.$;3C/-#00

Estas classes são as que o cliente precisaráusar para utilizar o serviço remoto

Exemplo de cliente SOAP 141

Page 141: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 141/262

!  Classes em destaque sãoclasses geradas pelaferramenta wsimport (ou

wsconsume)

*+,-./ /-#00 `.-F&1-.&$2 6*+,-./ 02#2./ 93.' F#.$@?24.$%ij #4%0A 6

60#7)6"$";)/)(L0$) 0&49./& B $&k `.-F&`#/#'&?&49./&@A:

60#7)6"$";) *43VH B 0&49./&C%&2`.-F&`#/#'&U342@A:-.02#4`.-F&0@*43VHC%&2`.-F&0@AA:D

*+,-./ 02#2./ 93.' -.02#4`.-F&[email protected]]`.-F&^ ;.-F&0A 6;34@60#7) ; g ;.-F&0A 6

?H02&FC3+2C*4.$2-$@;C%&2TF',@Ac_g _ c ;C%&2L.2+-3@A c _@_ c ;C%&2J$3@A c _A_A:?H02&FC3+2C*4.$2-$@_ _ c ;C%&2R.4&234@AA:?H02&FC3+2C*4.$2-$@_ _ c ;C%&2R+4#/#3@A c _ F.$+230|$_A:

DD

D~ a"L" ka"( 60#7)!#0)1&Fa"(22\\y<m\mg LI& ?I.$.$%@<[y\A

?2#$-&H O+,4./f<tt F.$+230

22<[YsY[\g PHF*I3F#$.#/@>\<YAQ#40 93$ L4.&4

YY\ F.$+230

22\\•[>[Yg ?3-H#4.0@<[s>AJ$'4&. L#4f390fH

<•s F.$+230

22<ttmm>\g w&#4#2 ?I+-#H.F@>\<<A830&*I 1&'#4

Page 142: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 142/262

Exemplo de cliente dinâmico 143

Page 143: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 143/262

Proxy dinâmico!

 

Compare com o cliente estático mostrado anteriormente

*+,-./ /-#00 `.-F&RH$#F./1-.&$2 6

*+,-./ 02#2./ 93.' F#.$@?24.$%ij #4%0A 2I43k0 "#-;34F&'KdQ7V/&*2.3$ 6KdQ U-;#A'$"&0'1 B

$&k KdQ@_K&&3NSS#'$"#K'-&NoDoDS60#7)-/)(L0$)/'"3S60#7)6"$";)/)(L0$)pU-;# _A:ZP#F& -)(L0$)^"7) B

$&k ZP#F&@_I22*gGG03#*C;.-F&0C#4%3$#9.0C/3FG_= _`.-F&`#/#'&?&49./&_A:?&49./& 0&49./& B ?&49./&C/4&#2&@U-;#A'$"&0'1= -)(L0$)^"7)A:

60#7)6"$";) *43VH B 0&49./&C%&2U342@`.-F&`#/#'&C/-#00A:-.02#4`.-F&0@*43VHC%&2`.-F&0@AA:

D

*+,-./ 02#2./ 93.' -.02#4`.-F&[email protected]]`.-F&^ ;.-F&0A 6;34@60#7) ; g ;.-F&0A 6

?H02&FC3+2C*4.$2-$@;C%&2TF',@Ac_g _ c ;C%&2L.2+-3@A c _@_ c ;C%&2J$3@A c _A_A:?H02&FC3+2C*4.$2-$@_ _ c ;C%&2R.4&234@AA:?H02&FC3+2C*4.$2-$@_ _ c ;C%&2R+4#/#3@A c _ F.$+230|$_A:

DD

DVeja outro tipo de cliente dinâmico em

FilmeDispatchClient.java

Cliente em container!  Clientes localizados em container Java EE (ex: servlet ou

144

Page 144: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 144/262

managed bean) podem injetar o serviço através da

anotação @WebServiceRef

!"#$#%&'(&#$@$#F& B _;.-F&0(&#$_A*+,-./ /-#00 `.-F&0"#$#%&'(&#$ 6

bi)[/)(L0$)d)PGU-;#A'$"&0'1?

<K&&3NSS#'$"#K'-&NoDoDS60#7)-/)(L0$)/'"3S60#7)6"$";)/)(L0$)pU-;#<H*4.9#2& `.-F&`#/#'&?&49./& -)(L0$):*4.9#2& Q.02]`.-F&^ ;.-F&0:

!U30213$024+/2*+,-./ 93.' .$.2@A 6

`.-F&`#/#'& 3('+4 B-)(L0$)F.)&60#7)6"$";)2'(&@A:

2I.0C;.-F&0 B 3('+4C%&2`.-F&0@A:DE

D

]I<^Q.02# '& `.-F&0]GI<^]Ig'#2#L#,-& 9#-+&B_qgP0#7)-M)"1FP0#7)-h_ 9#4B_P0#7)X^

]Ig/3-+F$^];g;#/&2 $#F&B_I&#'&4_^T"R(]G;g;#/&2^]# I4&;B_K&&3NSSUUUF07;[F$'7S&0&#)SqgP0#7)F07;[h_^qgP0#7)F07;[h]G#^

]GIg/3-+F$^]Ig/3-+F$^];g;#/&2 $#F&B_I&#'&4_^L€2+-3]G;g;#/&2^qgP0#7)F&0&%#'h

]GIg/3-+F$^

CCC]GIg'#2#L#,-&^

JSF Managed Bean

Facelets

MessageContext! Objeto que permite acesso a metadados de uma

145

Page 145: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 145/262

Objeto que permite acesso a metadados de umamensagem! 

Cabeçalhos SOAP, se mensagem é inbound ou outbound,dados do WSDL, servidor, etc.

!  Pode ser obtida do WebServceContext

!d&03+4/&5&,?&49./&13$2&V2 k0/2V:

!5&,"&2I3'*+,-./ 93.' F&23'3@A 6

"&00#%&13$2&V2 /2V B k013$2&V2C%&2"&00#%&13$2&V2@A:"#* I&#'&40 B @"#*A/2VC%&2@"&00#%&13$2&V2CwLLUNd7ZK7?LNw7JR7d?A:

ED

!  Algumas propriedades!  MESSAGE_OUTBOUND_PROPERTY (boolean)

!  INBOUND_MESSAGE_ATTACHMENTS (Map)

!  HTTP_REQUEST_METHOD (String)

!  WSDL_OPERATION (Qname)

JAX-WS Handlers!  Interceptadores (filtros) de mensagens

146

Page 146: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 146/262

RuntimeJAX-WS

RuntimeJAX-WS

p ( ) g!  Dois tipos: protocol (MESSAGE) e logical (PAYLOAD)

!  Podem ser usados para fazer alterações na mensagemantes de ser processada no servidor ou cliente

!  Geralmente são configurados em corrente

!  Para criar!  Implementar SOAPHandler ou LogicalHandler 

!  Um XML para configurar a corrente

!  Para usar

!  Anotar com @HandlerChain(file=“handlers.xml”) o SEI (noservidor) ou stub do serviço (código gerado no cliente)

Cliente Endpoint    L   o   g    i   c   a    l

    H   a   n    d    l   e   r

    S    O    A    P

    H   a   n    d    l   e   r

    L   o   g    i   c   a    l

    H   a   n    d    l   e   r

    S    O    A    P

    H   a   n    d    l   e   r

./%&0$12+ 34

506#$'7$##/8$+6%!$9!)

:/%&0$;/<0!'+)= >660

:/%&0$7$##/8$'+)= >660

?@-A./%&0$12+4

8$!.$/&$1#')=?$!

B68C5/0./%&0$12+ 34

Page 147: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 147/262

Logical Handler! Implementa javax xml ws handler LogicalHandler

148

Page 148: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 148/262

!  Implementa javax.xml.ws.handler.LogicalHandler!  Acesso ao payload da mensagem

*+,-./ /-#00 "HQ3%./#-w#$'-&4 .F*-&F&$20 Q3%./#-w#$'-&4 6

*+,-./ ,33-&#$ K"1;#),)--".)@Q3%./#-"&00#%&13$2&V2 /2VA 6Q3%./#-"&00#%& F0% B /3$2&V2C%&2"&00#%&@A:?3+4/& 3"4#'"; B 7-.F.)&2"4#'";GH: GG n"Q ?3+4/&L4#$0;34F&4 24#$0;34F&4 B

L4#$0;34F&4`#/234HC$&kT$02#$/&@AC$&kL4#$0;34F&4@A:

d&0+-2 4&0+-2 B $&k ?24&#Fd&0+-2@?H02&FC3+2A:24#$0;34F&4C24#$0;34F@3"4#'";= 4&0+-2A: GG TF*4.F& n"Q $# 0#.'#

D

*+,-./ ,33-&#$ K"1;#)6"%#&@Q3%./#-"&00#%&13$2&V2 /2VA 6?24.$% 3*&4#/#3 B @?24.$%A

/2VC%&2 @"&00#%&13$2&V2C5?RQNMU7dJLTMPA:GG -3%#4 $3F& '# 3*&4#/#3 o+& /#+03+ &4434&2+4$ 24+&:

D

*+,-./ 93.' $#'-)@"&00#%&13$2&V2 /3$2&V2A 6DD

Usando handlers! Arquivo de configuração (handlers chains xml)

149

Page 149: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 149/262

!  Arquivo de configuração (handlers-chains.xml)]h#9#&&gI#$'-&4l/I#.$0 VF-$0gh#9#&&B_I22*gGGh#9#C0+$C/3FGVF-G$0Gh#9#&&_

VF-$0gV0'B_I22*gGGkkkCkYC34%G>\\<Gn"Q?/I&F#_^]h#9#&&gI#$'-&4l/I#.$^

]h#9#&&gI#$'-&4^

]h#9#&&gI#$'-&4l/-#00^$'7F"$7)F,42('&'$'#]"1;#)(]Gh#9#&&gI#$'-&4l/-#00^

]Gh#9#&&gI#$'-&4^

]h#9#&&gI#$'-&4^

]h#9#&&gI#$'-&4l/-#00^$'7F"$7)F,4A'.0$"#]"1;#)(]Gh#9#&&gI#$'-&4l/-#00^

]Gh#9#&&gI#$'-&4^

]Gh#9#&&gI#$'-&4l/I#.$^]Gh#9#&&gI#$'-&4l/I#.$0^

!  Uso no servidor (no SEI)!5&,?&49./&

b]"1;#)(!K"01GP0#)?<K"1;#)(=$K"01-F+7#<H

*+,-./ /-#00 `.-F&0`#/#'& 6 E D

!  Uso no cliente (edite classe gerada que implementa o Service)b]"1;#)(!K"01GP0#)?<K"1;#)(=$K"01-F+7#<H

*+,-./ /-#00 `.-F&0`#/#'&?&49./& &V2&$'0 ?&49./& 6 E D

Outros padrões 150

Page 150: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 150/262

Alguns padrões relacionados SOAP Web Services!

 

WS-I Basic Profile – conjunto de especificações quepromovem a interoperabilidade

!  Especificações de messaging: WS-Notification, WS-Addressing, WS-ReliableMessaging, WS-ReliableMessagingPolicy

!  Especificações de metadados: WS-Policy, WS-Transfer, WS-MetadataExchange, UDDI

!  Especificações de segurança: WS-Security, WS-SecureConversation,WS-Trust, WS-SecurityPolicy

!  Especificações de transações: WS-Coordination, WS-AtomicTransaction

Vários especificações estão implementadas nos provedores deWeb Services existentes no Glassfish e JBoss!  JAX-WS abrange apenas às especificações relacionadas

comunicação SOAP

WS-Addressing 151

Page 151: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 151/262

!  Padronização de propriedades usadas no roteamentode mensagens SOAP!

 

Propriedades: <To>, <From>, <ReplyTo>, <FaultTo>,<MessageID>, <Action>, <RelatesTo>

!  Exemplo de uso em envelope SOAP

]03#*g7$9&-3*&CCC^]03#*gw&#'&4^OU-"N*'T K&&3NSSK'-&Si0;.)&/)(L0$) OSU-"N*'T

OU-"Nd)3#4*'T

]k0#gJ''4&00^I22*gGG0/I&F#0CVF-03#*C34%Gk0G>\\YG\YG#''4&00.$%G43-&G#$3$HF3+0

]Gk0#gJ''4&00^OSU-"Nd)3#4*'T

OU-"N6"%#&*'T

]k0#gJ''4&00^

I22*gGG/-.&$2GFHd&/&.9&4]Gk0#gJ''4&00^

OSU-"N6"%#&*'T

CCC]G03#*gw&#'&4^]03#*g(3'H^ E ]G03#*g(3'H^

]G03#*g7$9&-3*&^

Fonte: http://www.ibm.com/developerworks/webservices/library/ws-address/index.html 

Page 152: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 152/262

SOAP-JMS 153

Page 153: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 153/262

!  Enviar SOAP em mensagens JMS poderia resultar em maior

escalabilidade e confiabilidade que sobre HTTP!  Ainda não é padrão Java EE (mas há especificação no W3C)

!  Provedores de serviços JAX-WS (Apache CXF e Oracle WebLogic) já implementamo serviço (de forma proprietária) em seus servidores

!  Desvantagens:

!

 

Perde-se interoperabilidade – JMS não é um padrão de protocolo de transportecomo HTTP – é uma API Java – SOAP/JMS é uma solução Java

!  Complexidade maior na implementação de serviços requisição-resposta já que omecanismo JMS é assíncrono – melhor para serviços @OneWay

!  Soluções!  Apache CXF (mais fácil de usar e menos preso à implementação)

!  http://cxf.apache.org/docs/jms-transport.html

!  http://cxf.apache.org/docs/soap-over-jms-10-support.html 

!  Oracle WebLogic

!  http://www.oracle.com/technetwork/articles/murphy-soa-jms-092653.html 

Page 154: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 154/262

Referências!  Especificações

!  WSDL http://www.w3.org/TR/wsdl 

155

Page 155: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 155/262

!  SOAP http://www.w3.org/TR/soap/ 

!  MTOM http://www.w3.org/TR/soap12-mtom/ 

XOP http://www.w3.org/TR/xop10/ 

!  WS-Addressing http://www.w3.org/TR/ws-addr-core/ 

!  WS-Securityhttp://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf 

!  WS-I Basic Profile http://ws-i.org/Profiles/BasicProfile-1.2-2010-11-09.html 

!  JAX-WS https://jax-ws.java.net/ 

SOAP sobre JMS http://www.w3.org/TR/soapjms/ 

!  Artigos e tutoriais

!  Russell Butek. “Which style of WSDL should I use?” IBM Developerworks, 2005.http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/ 

!  Jaromir Hamala. “SOAP over JMS between WebLogic 12 and Apache CXF” C2B2, 2013.http://blog.c2b2.co.uk/2013/09/soap-over-jms-between-weblogic-12-and.html 

Como implementar a interface Provider (Apache CXF documentation).http://cxf.apache.org/docs/provider-services.html 

!  Rama Pulavarthi. “Introduction to handlers in JAX-WS”. Java.net articles.https://jax-ws.java.net/articles/handlers_introduction.html 

!  JAX-WS WS-Addressing https://jax-ws.java.net/nonav/jax-ws-21-ea2/docs/wsaddressing.html 

Page 156: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 156/262

Conteúdo 157

Page 157: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 157/262

1. 

Introdução a REST

Arquitetura REST!  Fundamentos de WebServices usando REST

2.  Como criar um serviço RESTful usando JAX-RS!  MediaTypes, resources, parâmetros!  Anotações @Path, @PathParam, etc.!  Metadados, ResponseBuilder e URIBuilders!  Estratégias de segurança e contextos

3. 

Como criar um cliente RESTful!  Usando comunicação HTTP simples

Usando APIs RESTEasy e Jersey!  Clientes RESTful em aplicativos Web e mobile!  WADL e JAX-RS 2.0

REST (Fielding, W3C TAG, 2000) 158

Page 158: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 158/262

!  Representational State Transfer

Estilo arquitetônico baseado na World Wide Web!  Recursos (páginas) em arquitetura que facilita a transferência de

estado no cliente (navegação via links, hierarquias, métodos HTTP)usando representação uniforme (URI, tipos MIME, representações)

!  A World Wide Web é uma implementação de arquitetura REST

As especificações HTTP 1.1 e URI (Uniform Resource Identifier)foram escritas em acordo com a arquitetura REST

!  Web Services baseados em REST (RESTful WS)!  Adotam a arquitetura REST, representação de URIs, tipos MIME,

HTTP e restrições (estado, cache, etc) para fornecer intraestruturaque permite um ambiente de computação distribuída eficiente,simples e com overhead mínimo

HTTP (RFC 2616) 159

Page 159: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 159/262

Protocolo de requisição-resposta sem estado

!  Mensagem de requisição consiste de!  linha inicial composta de método, URI e versão

!  linhas de cabeçalho propriedade:valor + linha em branco

!  corpo opcional (depende do método)

Métodos: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT

!  Mensagem de resposta consiste de!  linha inicial composta de versão, código de status e mensagem

!  linhas de cabeçalho propriedade:valor + linha em branco

corpo opcional (depende do método)!  Códigos: 1xx (informação), 2xx (sucesso), 3xx (redirecionamento),

4xx (erro no cliente) e 5xx (erro no servidor)

RESTful Web Services!  Aproveitam a infraestrutura de um website

160

Page 160: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 160/262

p!  recursos (páginas), árvore de navegação (links, hierarquia)

representações de dados e tipos (URIs, MIME)!  vocabulário de operações do protocolo HTTP (GET, POST, …)

!  URIs representam objetos (com estado e relacionamentos aninhados)!  Um objeto contendo relacionamentos

3"0-F)-&";'F$0;";) 

de uma aplicação pode ser representado em REST pela URII22*gGG0&49.'34G#*-./#/#3S3"0-S)-&";'S$0;";)S

!  Dados anexados a respostas podem ter diversas representações e tipos!  XML, JSON, CSV, etc.

Métodos HTTP permitem operações CRUD!

 

Create: POST /pais/estado (contendo <estado>SP</estado>, no corpo)!  Retrieve: GET /pais/estado/SP  (Retrieve All com GET /pais/estado)

!  Update: PUT /pais/estado/PB 

!  Delete: DELETE /pais/estado/PB

JAX-RS!  JAX-RS é uma API Java para facilitar o desenvolvimento

de aplicações que utilizam a arquitetura REST

161

Page 161: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 161/262

de aplicações que utilizam a arquitetura REST

Componentes de uma aplicação JAX-WS!  Subclasse de Application: usado para configurar a aplicação, mapear o nome do

contexto e listar outras classes que fazem parte da aplicação (opcional)

!  Root resource class: classes que definem a raiz de um recurso mapeado a umcaminho de URI

Resource method: os métodos de um Root resource class, que são associados a

designadores de métodos HTTP (@GET, @POST, etc.)!  Providers: operações que produzem ou consomem representações de entidades

em outros formatos (ex: XML, JSON)

!  JAX-RS usa anotações para configurar os componentes

!  @ApplicationPath na subclasse de Application

!  @Path nos Root resource classes

!  @GET, @POST, etc e @Path nos Resource methods

!  @Produces, @Consumes nos Providers

@Context para injetar diversos tipos de contexto disponíveis no ambiente Web

HelloWorld com JAX-RS

! Para construir um serviço RESTful com JAX RS

162

Page 162: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 162/262

!  Para construir um serviço RESTful com JAX-RS

1. 

Criar uma subclasse de Application vazia e anote com@ApplicationPath informando o nome do contextobZ33#0$"&0'12"&KGlU)["30lH

*+,-./ /-#00 w&--3J**-./#2.3$ &V2&$'0 J**-./#2.3$ 6 D

2.  Criar um root resource anotado com @Path

b2"&KGr-"4K)##'lH*+,-./ /-#00 w&--3d&03+4/& 6 E D

3.  Criar método no resource anotado com designador de método HTTPbs9*

*+,-./ ?24.$% %&2d&0*302#@A 6 4&2+4$ Ww&--3= k34-'pX: D

4. 

Empacotar WAR (ex: K)##'"33FU"() + deploy (ex: #'$"#K'-&NoDoD)

5.  Envie GET para a URL abaixo (pode ser via browser) e veja a resposta

I22*gGG#'$"#K'-&NoDoDGK)##'"33GU)["30G-"4K)##'

Page 163: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 163/262

Page 164: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 164/262

Path templates e @PathParam 165

Page 165: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 165/262

@Path pode receber parâmetros (Path templates)

!  b2"&KG<SP0#7)-Sg07;[h<H

!  Aceita por exemplo: I22*gGG#,/C/3FGk#4G#**G;.-F&0G22\\••[><

Parâmetro pode ser lido em método usando @PathParam

b2"&KG<SP0#7)-Sg07;[h<H*+,-./ /-#00 `.-F&0T"R(d&03+4/& 6

bs9* b2(';%$)-G<&)+&S+7#<H

*+,-./ `.-F& %&2`.-F&@b2"&K2"("7G<07;[<H ?24.$% /3'.%3T"R(A 6

4&2+4$ &$2.2HC%&2`.-F&(HT"R(13'&@/3'.%3T"R(A:

DD

Path template e restrições!  Se URL não combinar com a resolução do path

template o servidor produzirá um erro 404

166

Page 166: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 166/262

template, o servidor produzirá um erro 404

!

 

Variável deve combinar com a expressão regular <XtSYup<

!  Pode-se substituir a expressão regular default por outra!U#2I@_;.-F&G6.F',g 22i\l[j6t=sDD_A

!  Template pode ter mais de uma variável

!U#2I@_6/''<gi\l[jDG6/''>gi\l[jD_A*+,-./ /-#00 J00+$23d&03+4/& 6!S7L !U#2I@_6/''Ygi\l[jD_A*+,./ 93.' .)&Z--%1&'@!U#2IU#4#F@_/''<_A .$2 '<=

!U#2IU#4#F@_/''>_A .$2 '>=!U#2IU#4#F@_/''Y_A .$2 'YA 6 CCC D

CCC

D

!  Espaços e caracteres especiais devem ser substituídos porURL encodings

G/.'#'&G?3 U#+-3 " G/.'#'&G?v9V3vRDU#+-3

Combina comS7L G/2VG#**SwSWSD

Page 167: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 167/262

Idempotência em REST 168

Page 168: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 168/262

No contexto de uma aplicação REST, um método é

idempotente se, quando chamado múltiplas vezesproduz os mesmos resultados

!  Os métodos idempotentes do HTTP são!  GET, HEAD, PUT e DELETE!  POST não é idempotente (chamadas sucessivas do mesmo método

poderão produzir resultados diferentes)

!  Ao mapear métodos HTTP a métodos do resource, deve-seobservar se o método do resource também é idempotente,para manter a consistência de comportamento!  Usar POST para criar novos dados (C)!

 

Usar GET apenas para retornar dados (R)!  Usar PUT apenas para alterar dados (U)!  Usar DELETE apenas para remover dados (D)

@GET e @DELETE!

  @GET pode ser usado para retornar representações

169

Page 169: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 169/262

do resource

Representação default retornada é text/plain!  Outras representações MIME podem ser configuradas usando um

entity provider através da anotação @Produces

!  bs9*

!U43'+/&0@_2&V2GI2F-_A*+,-./ ?24.$% .)&]&7#@A 6

4&2+4$ _]I2F-^],3'H^]I<^w&--3pp]GI<^]G,3'H^]GI2F-^_:D

!  @DELETE deve mapeado a métodos responsáveis pela remoçãode instâncias do resource 

!  bQ9A9*9

!U#2I@6.'DA*+,-./ 93.' ;)#)&)Z--)1&'@!U#2IU#4#F@_.'_A .$2 .'A 6

;#/#'&C4&F39&J00&$23@.'A:D

@PUT e @POST!

 

POST e PUT podem ser usados para create e update

! Decisão é questão de estilo e discussões acadêmicas

170

Page 170: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 170/262

Decisão é questão de estilo e discussões acadêmicas

Como PUT é idempotente, é geralmente usado para fazeratualizações do resource (mas updates usando PUT não

podem ser parciais: é preciso enviar o objeto inteiro)

Nos exemplos deste curso, usaremos @POST para criar resources

b2`/* !13$0+F&0@6_#**-./#2.3$GVF-_= _#**-./#2.3$Gh03$_DA

*+,-./ 93.' /4&#2&@?#-# &$2.2HA 6;#/#'&C/4&#2&@&$2.2HA:

D

!  E @PUT para realizar updates

b2e* !U#2I@_6.'D_A!13$0+F&0@6_#**-./#2.3$GVF-_= _#**-./#2.3$Gh03$_DA

*+,-./ 93.' &'.2@!U#2IU#4#F@_.'_A Q3$% .'= ?#-# &$2.2HA 6

;#/#'&C+*'#2&@&$2.2HA:

D

Provedores de entidades!

  Os provedores de entidades fornecem mapeamento entre diferentes representações e tipos Java

171

Page 171: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 171/262

entre diferentes representações e tipos Java

JAX-RS disponibiliza provedores para diversos tipos Java evárias representações populares (texto, XML, JSON, etc.)

!  Provedores são selecionados nos métodos com anotações @Produces e

@Consumes, indicando um tipo MIME que está mapeado ao provedor

!  É possível criar provedores para representações não suportadas

através da implementação de MessageBodyWriter (paraprodução) e MessageBodyReader (para consumo)

!  O provedor implementa a interface, é anotado com @Provider e

mapeia o tipo que representa através de @Produces ou @Consumes

b2('L0;)( b2(';%$)-G<"33#0$"&0'1S7-U'(;<H*+,-./ /-#00 534'R3/54.2&4 .F*-&F&$20 ,)--".)M';4i(0&)(]?24&#F.$%M+2*+2^ 6 E D

!S7L !U#2I@_#4o+.93C'3/_A b2(';%$)-Gg<"33#0$"&0'1S7-U'(;<hH*+,-./ ?24&#F.$%M+2*+2 %&2534'R3/+F&$2@A 6 E D

Page 172: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 172/262

Provedores nativos!

  Não é preciso criar @Provider para representaçõesde vários tipos Java, mapeados automaticamente

173

Page 173: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 173/262

Suportam todos os tipos MIME (*/*)

!  ,H2&ij= ?24.$%

!  T$*+2?24&#F= d&#'&4

!  `.-&

!  h#9#VC#/2.9#2.3$CR#2#?3+4/&

Suportam application/xml, application/json e text/xml

!  h#9#VCVF-C24#$0;34FC?3+4/&

!  h#9#VCVF-C,.$'C8Jn(7-&F&$2 (classes geradas via JAXB)

!  Suporta dados de formulário (application/x-www-form-urlencoded)

"+-2.9#-+&'"#*]?24.$%= ?24.$%^

Streaming de todos os tipos MIME na resposta (MessageBodyWriter)!  ?24&#F.$%M+2*+2 (streaming de imagens, videos, PDF, RTF, etc.)

@Produces e @Consumes!

 

@Produces é usado para mapear tipos MIME det õ d t d li t

174

Page 174: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 174/262

representações de resource retornado ao cliente

!S7L !U43'+/&0@6_#**-./#2.3$GVF-_DA*+,-./ Q.02]`.-F&^ ;.$'J--@A 6ED

!  Cliente HTTP pode selecionar método com base nos tipos MIME que elesuporta através de um cabeçalho de requisição“Accept:”

S7L G/2VG#**G;.-F&0J//&*2g #**-./#2.3$GVF-= #**-./#2.3$Gh03$

@Consumes é usado para mapear tipos MIME de representaçõesde resource enviado ao serviço!UM?L !13$0+F&0@6_#**-./#2.3$GVF-_= _#**-./#2.3$Gh03$_DA*+,-./ 93.' /4&#2&@`.-F& &$2.2HA 6 E D

!

 

Cliente HTTP pode enviar um tipo MIME compatível com o métododesejado usando um cabeçalho de requisição “Content-type:”

UM?L G/2VG#**G;.-F&013$2&$2l2H*&g #**-./#2.3$GVF-

Page 175: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 175/262

Response e ResponseBuilder

B ild t HTTP

176

Page 176: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 176/262

Builder para respostas HTTP!

 

Permite controlar a resposta HTTP enviada ao cliente! 

Response cria um código de status que retorna ResponseBuilder

!  ResponseBuilder possui diversos métodos para construr cabeçalhos,códigos de resposta, criar cookies, anexar dados, etc.

!  Métodos devolvem ResponseBuilder permitindo uso em cascata!  Método build() retorna o Response finalizado

Exemplos!  d&0*3$0&(+.-'&4 ,+.-'&4 B d&0*3$0&C02#2+0@t\<A:d&0*3$0& 4< B ,+.-'&4C,+.-'@A:

!  d&0*3$0& 4> B d&0*3$0&C3f@AC&$2.2H@;.-F&AC,+.-'@A:

d&0*3$0& 4Y B d&0*3$0&C02#2+0@>\\AC2H*&@_2&V2GI2F-_AC/33f.&@$&k P&k133f.&@_+_=_<_AAC,+.-'@A:

 java.net.URI e URIBuilders

URI ã i t f i i t t

177

Page 177: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 177/262

URIs são a interface mais importante em

aplicações REST! 

Um java.net.URI pode ser construído usando um UriBuilder

!  Permite trabalhar com os componentes individuais, segmentos efragmentos da URI, concatenar e construir novas URIs

Exemplos

GG /4.# # KdT 4&0r#$/I34:#BV}3*&$BH&0KdT 4&o+&02K4. B K4.(+.-'&4C;43FU#2I@_6#4%<D_A

C;4#%F&$2@_6#4%>D_ACF#24.VU#4#F@_#_= _V_A

Co+&4HU#4#F@_3*&$_=_6#4%YD_AC,+.-'@_4&0_= _#$/I34_= _H&0_A:

Parâmetros do request

Além de @PathParam há outras cinco anotações

178

Page 178: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 178/262

çque permitem extrair informação de um request

!  @QueryParam e @DefaultValue

!  Extraem dados de um query string (?nome=valor&nome=valor)

!  @FormParam

!

 

Extrai dados de formulário (application/x-www-form-urlencoded)

@CookieParam

!  Extrai dados de cookies (pares nome=valor)

!  @HeaderParam

Extrai dados de cabeçalhos HTTP

@MatrixParam

!  Extrai dados de segmentos de URL

QueryParam

! Extrai dados passados no query string de uma URI

179

Page 179: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 179/262

Extrai dados passados no query-string de uma URI

Parâmetros de query são anotados com! 

@QueryParam(“parametro”) – informando o nome do parametroHTTP correspondente ao parâmetro Java do método

!  @DefaultValue(“valor”) – informando o valor que será usado caso oparâmetro não tenha sido definido

Exemplo de requisiçãoS7L G/2VG#**G;.-F&}F#VJ$3B>\<\‚F.$J$3B<[y\

!  Exemplo de método que lê os parâmetros

!S7L !U#2I@_;.-F&_A*+,-./ Q.02]`.-F&^ %&2`.-F&0U34J$3@

!R&;#+-2x#-+&@_<[\\_A !Z+&4HU#4#F@_F.$J$3_A .$2 F.$

!R&;#+-2x#-+&@_>\<Y_A !Z+&4HU#4#F@_F#VJ$3_A .$2 F#VA 6CCCD

FormParam

! @F P e trai parâmetros de form lários HTML

180

Page 180: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 180/262

!  @FormParam extrai parâmetros de formulários HTML

Exemplo de formulário

Exemplo de método que consome dados do formulário

]`Md" #/2.3$B_I22*gGG-3/#-I302gy\y\G;&02.9#-Gk&,#*.G;.-F&_F&2I3'B_*302_^

L.2+-3g ]TPUKL 2H*&B_2&V2_ $#F&B_2.2+-3_ 2#,.$'&VB_<_^

R.4&234g ]TPUKL 2H*&B_2&V2_ $#F&B_;0()&'(_ 2#,.$'&VB_>_^

J$3g ]TPUKL 2H*&B_2&V2_ $#F&B_#$3_ 2#,.$'&VB_Y_^]G`Md"^ 

!UM?L!13$0+F&0@_#**-./#2.3$GVlkkk_;34Fl+4-&$/3'&'_A

*+,-./ 93.' *302@!`34FU#4#F@_;0()&'(_A ?24.$% '.4&234A 6CCC

D

HeaderParam!

  @HeaderParam permite obter dados que estãono cabeçalho da requisição (ex: Content-type,

181

Page 181: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 181/262

no cabeçalho da requisição (ex: Content type,User-Agent, etc.)

!  Requisição HTTP

S7L G/2VG#**G;.-F&G&/I3 wLLUG<C<133f.&0g 9&40.3$B>Cm= +0&4.'B[`Yt\>

!  Resource

!U#2I@_G;.-F&_A*+,-./ /-#00 `.-F& 6

!S7L!U#2I@_G&/I3_A*+,-./ d&0*3$0& &/I3@b])";)(2"("7@_133f.&_A ?24.$% /33f.&Q.02A 6

4&2+4$ d&0*3$0&C02#2+0@>\\AC&$2.2H@_e3+ 0&$2 F& /33f.&0g _ c /33f.&Q.02AC,+.-'@A:

DD

You sent me cookies: userid=9F3402, version=2.5

Page 182: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 182/262

Page 183: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 183/262

Page 184: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 184/262

Validação com Bean Validation

!  Os dados enviados para métodos em classes de

d lid d t é d API B

185

Page 185: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 185/262

resource podem ser validados através da API Bean

Validation, que é configurada via anotações!UM?L!U#2I@_G/4.#4_A!13$0+F&0@"&'.#LH*&CJUUQT1JLTMPN`Md"NKdQ7P1MR7RA*+,-./ 93.' /4.#4`.-F&@

!P32P+-- !`34FU#4#F@_2.2+-3_A ?24.$% 2.2+-3=

!P32P+-- !`34FU#4#F@_'.4&234_A ?24.$% '.4&234=!".$@<[\\A !`34FU#4#F@_#$3_A .$2 #$3A 6 E D

!U#22&4$@4&%&V*B_22i\l[j6mlsD_A *4.9#2& ?24.$% .F',13'&:

!  Violações na validação provocam ValidationException

Gera um erro 500 (Internal Server Error) se a exeção ocorreu ao validarum tipo de retorno

!  Gera um erro 400 (Bad Request) se a exeção ocorreu ao validar umparâmetro de entrada

Autenticação HTTP!

  A autenticação HTTP é realizada por cabeçalhos

186

Page 186: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 186/262

!  Exemplo (autenticação Basic)

Resposta do servidor a tentativa de acesso a dados protegidos

!  wLLUG<C< CDW e1"%&K'(0:); 

555lJ+2I&$2./#2&g (#0./ 4&#-FBX-3/#-I302gy\y\X

!  Requisição do cliente enviando credenciais

!  S7L G/2VG#**G;.-F&0 wLLUG<C<

J+2I34.{#2.3$g (#0./ Z5VIƒSd*,h*9/Sx+TwP-/>`2ƒZBB

!  Se a autenticação falhar, o servidor responde com 403 Forbidden

!  A configuração da autenticação deve ser realizada no servidor

!  Arquivo web.xml permite definir método de autenticação: BASIC,DIGEST, CLIENT-CERT (HTTPS)

!  Ferramentas do servidor definem perfis (roles) ou grupos mapeados ausuários autenticados

!  Roles são mapeados a URIs no web.xml

JAAS no web.xml

Autorização

187

Page 187: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 187/262

!  A declaração de perfis de usuários é feita no web.xml

usando <security-role>.!  A associação desses perfis com usuários reais é dependente de

servidor (ex: grupos no JBoss grupos = roles)

]0&/+4.2Hl43-&^]43-&l$#F&^#'F.$]G43-&l$#F&^

]G0&/+4.2Hl43-&^

]0&/+4.2Hl43-&^]43-&l$#F&^F&F,43]G43-&l$#F&^

]G0&/+4.2Hl43-&^

]0&/+4.2Hl43-&^]43-&l$#F&^9.0.2#$2&]G43-&l$#F&^]G0&/+4.2Hl43-&^

]-3%.$l/3$;.%^

]#+2IlF&2I3'^(J?T1]G#+2IlF&2I3'^

]G-3%.$l/3$;.%^

Autenticação

O método de autenticação éconfigurado usando o tag<login-config>

Page 188: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 188/262

Page 189: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 189/262

Usuários e roles: configuração!

  Dependente do servidor usado*!  diferente no Tomcat, JBoss, Glassfish

190

Page 190: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 190/262

Exemplo: JBoss AS 7!  Crie usuário no ApplicationRealm e associe a um grupo

~ #''l+0&4C0I5I#2 2H*& 3; +0&4 '3 H3+ k.0I 23 #''}#A "#$#%&F&$2 K0&4 @F%F2l+0&40C*43*&42.&0A[H Z33#0$"&0'1 e-)( G"33#0$"&0'1=%-)(-F3('3)(&0)-H@#Ag [

7$2&4 2I& '&2#.-0 3; 2I& $&k +0&4 23 #''Cd&#-F @J**-./#2.3$d&#-FA gK0&4$#F& g ";701WRVC U#00k34' gd&l&$2&4 U#00k34' g5I#2 43-&0 '3 H3+ k#$2 2I.0 +0&4 23 ,&-3$% 23} @U-&#0& &$2&4 # /3FF# 0&*#4#2&'-.02= 34 -&#9& ,-#$f ;34 $3$&Ai jg ";701= %-%"(0'

Configure o uso de JAAS com o realm default (RealmUsersRoles)em um arquivo WEB-INF/jboss-web.xml contendo

]h,300lk&,^]0&/+4.2Hl'3F#.$^a"L"NSa""-S'&K)(]G0&/+4.2Hl'3F#.$^

]Gh,300lk&,^* Isto é um resumo: consulte a documentação do servidor

@Context!

  @Context pode ser usado para injetar diversosobjetos contextuais disponíveis em uma requisição

191

Page 191: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 191/262

j p q çou resposta HTTP

!  Objetos da Servlet API:!  ?&49-&213$;.%=

!  ?&49-&213$2&V2=

!  w22*?&49-&2d&o+&02

w22*?&49-&2d&0*3$0&

Objetos da JAX-RS API:!  J**-./#2.3$

!  K4.T$;3

d&o+&02!  w22*w&#'&40

!  ?&/+4.2H13$2&V2

!  U439.'&40

!13$2&V2d&o+&02 4&o+&02:!13$2&V2K4.T$;3 +4.T$;3:

!UKL*+,-./ F&23'3@!13$2&V2 w22*w&#'&40 I&#'&40A 6?24.$% F B 4&o+&02C%&2"&2I3'@A:KdT #* B +4.T$;3C%&2J,03-+2&U#2I@A:"#*]?24.$%= 133f.&^ / B I&#'&40C%&2133f.&0@A:

D

!S7L !U#2I@_#+2I_A

*+,-./ -3%.$@!13$2&V2 ?&/+4.2H13$2&V2 -$A 6?24.$% +0&4.' B

-$C%&2K0&4U4.$/.*#-@AC%&2P#F&@A:@.; -$C.0K0&4T$d3-&@_#'F.$_AA 6 E D

D

Configuração do serviço!  Configuração da URI base pode ser no web.xml]0&49-&2lF#**.$%^

]0&49-&2l$#F&^h#9#VCk0C40C/34&CJ**-./#2.3$]G0&49-&2l$#F&^

192

Page 192: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 192/262

]+4-l*#22&4$^Gk&,#*.Gq]G+4-l*#22&4$^

]G0&49-&2lF#**.$%  ̂ou via anotação @ApplicationPath em subclasse de Application

!J**-./#2.3$U#2I@_Gk&,#*._A

*+,-./ /-#00 J**-./#2.3$13$;.% &V2&$'0 J**-./#2.3$ 6 CCC D

Application carrega todos os resources encontrados.!

 

Pode-se sobrepor getClasses() para selecionar quais disponibilizar

!h#9#VCk0C40CJ**-./#2.3$U#2I@_k&,#*._A*+,-./ /-#00 J**-./#2.3$13$;.% &V2&$'0 J**-./#2.3$ 6

!M9&44.'&*+,-./ ?&2]1-#00]}^^ %&21-#00&0@A 6

?&2]1-#00]}^^ 4&03+4/&0 B $&k h#9#C+2.-Cw#0I?&2]^@A:4&03+4/&0C#''@/3FC#4%3$#9.0C;&02.9#-C`.-F&d&03+4/&C/-#00A:4&03+4/&0C#''@/3FC#4%3$#9.0C;&02.9#-C?#-#d&03+4/&C/-#00A:4&2+4$ 4&03+4/&0:

D

Page 193: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 193/262

Cliente usando java.net!  Qualquer API capaz de montar requisições HTTP

pode ser usada para implementar clientes

194

Page 194: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 194/262

KdQ +4- B$&k KdQ@_I22*gGG-3/#-I302gy\y\G/2VG#**G.F',G22\\••[><_A:w22*KdQ13$$&/2.3$ /3$$ B

@w22*KdQ13$$&/2.3$A +4-C3*&$13$$&/2.3$@A:/3$$C0&2d&o+&02"&2I3'@_S7L_A:/3$$C0&2d&o+&02U43*&42H@_J//&*2_= _#**-./#2.3$GVF-_A:.; @/3$$C%&2d&0*3$0&13'&@A pB >\\A 6

2I43k $&k d+$2.F&7V/&*2.3$@_7443 g _ c /3$$C%&2d&0*3$0&13'&@AA:

D

(+;;&4&'d&#'&4 ,4 B$&k (+;;&4&'d&#'&4@$&k T$*+2?24&#Fd&#'&4@@/3$$C%&2T$*+2?24&#F@AAAA:

?24.$% -.$I# B ,4C4&#'Q.$&@A:?H02&FC3+2C*4.$2-$@_R#'30 4&/&,.'30g _ c -.$I#A:/3$$C'.0/3$$&/2@A:

8Jn(13$2&V2 h/ B 8Jn(13$2&V2C$&kT$02#$/&@`.-F&C/-#00A:K$F#40I#--&4 + B h/C/4&#2&K$F#40I#--&4@A:`.-F& P0#7) B @`.-F&A +C+$F#40I#-@$&k ?24.$%d&#'&4@-.$I#AA:

?H02&FC3+2C*4.$2-$@P0#7)C%&2T"R(@AA: E

Page 195: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 195/262

Cliente Jersey*!

  Uma API de cliente específica para Web ServicesREST como o Jersey facilita o trabalho convertendoautomaticamente representações em objetos

196

Page 196: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 196/262

automaticamente representações em objetos

1-.&$213$;.% /3$;.% B$&k R&;#+-21-.&$213$;.%@A:

1-.&$2 /-.&$2 B 1-.&$2C/4&#2&@/3$;.%A:KdT ,#0&KdT B

K4.(+.-'&4C;43FK4.@_I22*gGG-3/#-I302gy\y\G/2V_AC,+.-'@A:

5&,d&03+4/& 0&49./& B /-.&$2C4&03+4/&@,#0&KdTA:

`.-F& ;.-F& B 0&49./&C*#2I@_#**_AC*#2I@_;.-F&G.F',G22\\••[><_AC#//&*2@"&'.#LH*&CJUUQT1JLTMPNn"QAC%&2@`.-F&C/-#00A:

?H02&FC3+2C*4.$2-$@P0#7)C%&2T"R(@AA:?H02&FC3+2C*4.$2-$@P0#7)C%&2L.2+-3@AA:?H02&FC3+2C*4.$2-$@P0#7)C%&2R.4&234@AA:

* Outra alternativaé a API RESTEasy

Page 197: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 197/262

WADL!

  Para descrever serviços REST e permitir a geraçãoautomática de clientes, existe o padrão WADL

W b A li ti D i ti L

198

Page 198: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 198/262

!  Web Application Description Language

!  Tem função análoga ao WSDL (usada em SOAP Web Services)para descrição de Web Services RESTful

!  Obtido em I22*gGG0&49.'34G/3$2&V23G4#.{G"33#0$"&0'1FU";#

]}VF- 9&40.3$B_<C\_ &$/3'.$%B_KL`ly_ 02#$'#-3$&B_H&0_}^

]#**-./#2.3$ VF-$0B_I22*gGGk#'-C'&9Ch#9#C$&2G>\\[G\>_^]%4#FF#40G^]4&03+4/&0 ,#0&B_I22*gGG-3/#-I302gy\y\G;&02.9#-Gk&,#*._^

O()-'%($) 3"&K?<P0#7)Sg07;[h<T

O3"("7 &43)?<+-N-&(01.< -&4#)?<&)73#"&)< 1"7)?<07;[5Q<ST

O7)&K'; 1"7)?<s9*< 0;?<.)&60#7)<T

O()-3'1-)T

O()3()-)1&"&0'1 7);0"*43)?<"33#0$"&0'1S+7#<ST

O()3()-)1&"&0'1 7);0"*43)?<"33#0$"&0'1Sa-'1<ST

OS()-3'1-)T

OS7)&K';T

E

Cliente JAX-RS 2.0!

 

Java EE 7 tem uma API padrão para clientes RESTbaseada na API do Jersey

199

Page 199: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 199/262

Exemplo de envio de uma requisição GET simples1-.&$2 /-.&$2 B 1-.&$2(+.-'&4C$&k1-.&$2@A:?24.$% $3F&R3`&02.9#- B

/-.&$2C2#4%&2@_I22*gGG-3/#-I302gy\y\G;&02.9#-Gk&,#*.G$3F&_AC4&o+&02@"&'.#LH*&CL7nLNUQJTPAC%&2@?24.$%C/-#00A:

Pode-se configurar com WebTarget para reusar o path base1-.&$2 /-.&$2 B 1-.&$2(+.-'&4C$&k1-.&$2@A:5&,L#4%&2 ,#0&d&03+4/& B /-.&$2C2#4%&2@_I22*gGG0&49.'34G/2VG#**_A:5&,L#4%&2 ;.-F&d&03+4/& B ,#0&C*#2I@X;.-F&_A:

!

 

A partir do resource pode-se construir um request() e enviarum método HTTP`.-F& ;.-F& B ;.-F&d&03+4/&Co+&4HU#4#F@_.F',_= X22\\••[><_A

C4&o+&02@"&'.#LH*&CJUUQT1JLTMPNn"QAC%&2@`.-F&C/-#00A

Geração de clientes

!  JAX-RS 2.0 (Java EE 7) fornece uma ferramenta delinha de comando (e task Ant/Maven) que gera

200

Page 200: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 200/262

linha de comando (e task Ant/Maven) que gera

um cliente JAX-RS usando WADL!  U";#Ra"L" l3 '.4&234.3

l* *#/32&l0 h#V40>\I22*gGG-3/#-I302gy\y\G#**G/2VG#**-./#2.3$Ck#'-

Cria uma classe (JAXBElement) para cada resource raiz

!  Cria uma classe Servidor _ ContextoAplicacao.class (para umservico em http://servidor /contexto/aplicacao).!  Esta classe possui um método createClient() que cria um cliente

JAX-RS 2.0 já configurado para usar o serviço!  Também fornece métodos para retornar instâncias e representações

dos objetos mapeados como resource

Exercícios1.  Escreva um REST Web Service para acesso a uma

lista de Produtos. Planeje a interface e ofereçaoperações para

201

Page 201: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 201/262

operações para

Listar todos os produtos

!  Detalhar um produto

!  Criar um produto

!  Alterar o preço de um produto

!  Pesquisar produtos por faixa de preço

Remover um produto

2.  Escreva clientes REST que usem o serviçocriado no exercício anterior para

!  Preencher o banco com 10 produtos

Listar os produtos disponíveis!  Remover um produto

!  Alterar o preço de um produto

Listar produtos que custam mais de 1000

U43'+23

.'g -3$%'&0/4./#3g 024.$%*4&/3g '3+,-&

3.  Configure o acesso àaplicação de forma queapenas usuários dogrupo “admin” possam

remover produtos oualterar preços

Referências!  Especificações

!  HTTP: http://www.w3.org/Protocols/  

202

Page 202: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 202/262

!  RFC 2616 (HTTP) http://www.ietf.org/rfc/rfc2616.txt  

!  WADL https://wadl.java.net/ 

!  Arquiteturas de Web Services http://www.w3.org/TR/ws-arch/  

!  Artigos, documentação e tutoriais!  Saldhana. “Understanding Web Security using web.xml via Use Cases” Dzone. 2009.

http://java.dzone.com/articles/understanding-web-security 

!  Configuração de JAAS no Jboss 7 https://community.jboss.org/wiki/JBossAS7SecurityDomainModel 

!  Java EE Tutorial sobre RESTful WebServices http://docs.oracle.com/javaee/7/tutorial/doc/jaxrs.htm 

!  Documentação do Jersey (tutorial de JAX-RS): https://jersey.java.net/documentation/latest 

!  Roy Thomas Fielding. “Architectural Styles and the Design of Network-basedSoftware Architectures”. University of California, 2000.

http://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf  !  Alex Rodriguez. “RESTful Web Services: the basics”. IBM Developerworks, 2008.

http://www.ibm.com/developerworks/webservices/library/ws-restful/ 

!  Hadyel & Sandoz (editors). “JAX-RS: Java API for RESTful Web Services. Version 1.1.Oracle, 2009. https://jax-rs-spec.java.net/ 

Page 203: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 203/262

Conteúdo

1.  Introdução a interfaces Web estáticas

204

Page 204: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 204/262

!  HTML e CSS essencial!  Formulários do HTML

!  Document Object Model!  JavaScript essencial

2.  Interfaces Web dinâmicas

Manipulação da árvore DOM com JavaScript!  Alteração de classes CSS

!  Recursos essenciais do HTML5 e CSS3! 

Ajax e comunicação com Web Services

3.  JQuery essencial!

 

Seletores e acesso a dados em HTML, XML e JSON! 

Ajax usando JQuery

!  Formulários dinâmicos!  Boas práticas e técnicas essenciais para aplicações assíncronas

205 java.lang.OutOfMemoryError

null

Page 205: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 205/262

206 java.lang.OutOfMemoryError

null

Page 206: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 206/262

207 java.lang.OutOfMemoryError

null

Page 207: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 207/262

208 java.lang.OutOfMemoryError

null

Page 208: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 208/262

209 java.lang.OutOfMemoryError

null

Page 209: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 209/262

210 java.lang.OutOfMemoryError

null

Page 210: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 210/262

211 java.lang.OutOfMemoryError

null

Page 211: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 211/262

Page 212: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 212/262

213 java.lang.OutOfMemoryError

null

Page 213: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 213/262

214 java.lang.OutOfMemoryError

null

Page 214: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 214/262

215 java.lang.OutOfMemoryError

null

Page 215: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 215/262

216 java.lang.OutOfMemoryError

null

Page 216: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 216/262

217 java.lang.OutOfMemoryError

null

Page 217: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 217/262

218 java.lang.OutOfMemoryError

null

Page 218: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 218/262

219 java.lang.OutOfMemoryError

null

Page 219: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 219/262

220 java.lang.OutOfMemoryError

null

Page 220: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 220/262

Page 221: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 221/262

222 java.lang.OutOfMemoryError

null

Page 222: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 222/262

223 java.lang.OutOfMemoryError

null

Page 223: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 223/262

224 java.lang.OutOfMemoryError

null

Page 224: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 224/262

225 java.lang.OutOfMemoryError

null

Page 225: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 225/262

226 java.lang.OutOfMemoryError

null

Page 226: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 226/262

227 java.lang.OutOfMemoryError

null

Page 227: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 227/262

228 java.lang.OutOfMemoryError

null

Page 228: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 228/262

229 java.lang.OutOfMemoryError

null

Page 229: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 229/262

230 java.lang.OutOfMemoryError

null

Page 230: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 230/262

231 java.lang.OutOfMemoryError

null

Page 231: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 231/262

232 java.lang.OutOfMemoryError

null

Page 232: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 232/262

233 java.lang.OutOfMemoryError

null

Page 233: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 233/262

Page 234: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 234/262

235 java.lang.OutOfMemoryError

null

Page 235: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 235/262

236 java.lang.OutOfMemoryError

null

Page 236: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 236/262

237 java.lang.OutOfMemoryError

null

Page 237: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 237/262

238 java.lang.OutOfMemoryError

null

Page 238: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 238/262

239 java.lang.OutOfMemoryError

null

Page 239: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 239/262

240 java.lang.OutOfMemoryError

null

Page 240: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 240/262

241 java.lang.OutOfMemoryError

null

Page 241: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 241/262

242 java.lang.OutOfMemoryError

null

Page 242: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 242/262

243 java.lang.OutOfMemoryError

null

Page 243: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 243/262

Page 244: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 244/262

245 java.lang.OutOfMemoryError

null

Page 245: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 245/262

246 java.lang.OutOfMemoryError

null

Page 246: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 246/262

247 java.lang.OutOfMemoryError

null

Page 247: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 247/262

248 java.lang.OutOfMemoryError

null

Page 248: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 248/262

249 java.lang.OutOfMemoryError

null

Page 249: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 249/262

250 java.lang.OutOfMemoryError

null

Page 250: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 250/262

251 java.lang.OutOfMemoryError

null

Page 251: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 251/262

252 java.lang.OutOfMemoryError

null

Page 252: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 252/262

253 java.lang.OutOfMemoryError

null

Page 253: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 253/262

Page 254: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 254/262

255 java.lang.OutOfMemoryError

null

Page 255: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 255/262

Page 256: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 256/262

257 java.lang.OutOfMemoryError

null

Page 257: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 257/262

258 java.lang.OutOfMemoryError

null

Page 258: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 258/262

259 java.lang.OutOfMemoryError

null

Page 259: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 259/262

260 java.lang.OutOfMemoryError

null

Page 260: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 260/262

261 java.lang.OutOfMemoryError

null

Page 261: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 261/262

262 java.lang.OutOfMemoryError

null

Page 262: Infraestrutura para Sistemas Java EE

7/21/2019 Infraestrutura para Sistemas Java EE

http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 262/262