Infraestrutura para Sistemas Java EE
-
Upload
helder-da-rocha -
Category
Documents
-
view
225 -
download
0
Transcript of 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
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 )
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
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
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
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
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
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
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
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
5
JavaScript JQuery HTML/CSS
Dia 5(opcional)
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
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)
11
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
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
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
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
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
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);
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
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
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
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
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
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);
}
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)
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);
}
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
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
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
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
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)
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
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
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
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
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
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
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
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
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!
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
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;
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
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&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&13$$&/2.3$@A:
?&00.3$ 0&00.3$ B
/3$C/4&?&00.3$@;#-0&= ?&00.3$CJKLMNJ1OPM5Q7RS7A:
Sem transaçõesConfirmação automáticaapós recebimento correto
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
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
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&13$0+F&4 @23*./3= -)#)&'(A:
46
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
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&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&13$0+F&4 @;.-#= <!';0.'=3(';%&' ? @ABCD<A:
48
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
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
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
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);
}
}
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&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&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&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
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&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&13$$&/2.3$@A:24H 6
?&00.3$ -)--0'1 B /3$C/4&?&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&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
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&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&13$$&/2.3$@A:24H 6
?&00.3$ -)--0'1 B /3$C/4&?&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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 ‘>’)
!
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
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
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
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
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
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
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
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
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
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&L&V2P3'&@_(3F '.#p_A
F&$0 gB '3/+F&$2C/4&7-&F&$2@_F&$0#%&F_A
/#42# gB '3/+F&$2C/4&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
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
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&7-&F&$2@_*_AA:
Serialização " XML 90
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
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
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
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&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&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
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
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
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
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
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
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
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
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
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&`.-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
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
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
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
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
nome
Nicola Teslaemail
JSON Object Model 107
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
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
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
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
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
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
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
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
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
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 119/262
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 120/262
SOAP 121
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
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
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
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
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
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
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
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&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
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
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
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#^
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 132/262
@OneWay 133
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
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
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
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
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
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
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
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
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#2 ?I+-#H.F@>\<<A830&*I 1&'#4
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
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&@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
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
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
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
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
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
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 152/262
SOAP-JMS 153
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 156/262
Conteúdo 157
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
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
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
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
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
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)##'
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 163/262
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
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
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
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
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
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
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.2HA 6;#/#'&C/4&@&$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
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
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
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
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&@`.-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-
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
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
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
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
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 182/262
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 183/262
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
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
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
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>
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 188/262
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
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-�& &$2&4 # /3FF# 0&*#4#2&'-.02= 34 -	& ,-#$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
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
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
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
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&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
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
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&@/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
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
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
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
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
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
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/
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
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
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
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
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
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 211/262
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
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
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
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
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
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 220/262
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
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
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
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
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
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
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
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
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
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 233/262
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
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
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
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
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
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
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 243/262
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
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
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
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
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
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
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 253/262
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 255/262
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
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
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
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
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
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
7/21/2019 Infraestrutura para Sistemas Java EE
http://slidepdf.com/reader/full/infraestrutura-para-sistemas-java-ee 262/262