// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Aplicação de Web Service Passando Dados Binários, parte 1: Visão Geral
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Aplicação de Web Service Passando Dados Binários, parte 1: Visão Geral - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Aplicação de Web Service Passando Dados Binários, parte 1: Visão Geral

Neste tutorial, você criará uma aplicação da Web EE que contém um Web service implementado como um bean de sessão sem estado. Você também adicionará um pacote com quatro arquivos JPEG à aplicação Web. O Web service tem duas operações acessíveis pelos clientes, para obter imagens individuais e para obter um conjunto de todas as quatro imagens como miniaturas. Adicione métodos privados que convertem os arquivos JPEG em arrays de bytes e que convertem esses arrays de bytes em objetos  ``Imagem`` . No Java EE5 você coloca esses métodos privados diretamente no Web service, pois o Web service também é um EJB.

Após criar o web service, implante-o em uma instância do GlassFish server 3.1 ou superior. Utilize o testador do Web service integrado do NetBeans IDE para exibir a solicitação SOAP de amostra e responder mensagens.

A infraestrutura do serviço JAX-WS default não pode informar aos clientes que os dados binários precisam ser interpretados como arquivos JPEG. Portanto, você gera uma cópia do Esquema XML e dos arquivos WSDL e edita o esquema XML para informar a qualquer cliente para esperar o tipo de conteúdo  ``image/jpeg``  para o elemento de retorno. Você também irá altera o código de serviço para utilizar o Esquema e o WSDL personalizados.

Por fim, você criará uma aplicação cliente Java que exibirá as imagens em um álbum criado com base em componentes Swing.

É possível fazer download de uma versão completa de aplicações clientes e serviços no link:https://netbeans.org/projects/samples/downloads/directory/Samples%252FWeb%2520Services%252FWeb%2520Service%2520Passing%2520Binary%2520Data%2520--%2520EE6[+Catálogo de Amostras do NetBeans+].

*Lições Deste Tutorial*

image::images/netbeans-stamp-80-74-73.png[title="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0"]

1. => Visão Geral
2. link:./flower_ws.html[+ Criando o Web Service+]
3. link:./flower-code-ws.html[+ Codificando e Testando o Web Service+]
4. link:./flower_wsdl_schema.html[+ Modificando o Esquema e os Arquivos WSDL para Passar Dados Binários+]
5. link:./flower_swing.html[+ Criando o Cliente Swing+]


=== Software Necessário para o Tutorial

*Para seguir este tutorial, são necessários os recursos e o software a seguir.*

|===
|Software ou Recurso |Versão Necessária 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |Pacote de download do Java EE 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+JDK (Java Development Kit)+] |versão 7 ou 8 

|Servidor de aplicações ou Web compatível com Java EE |link:http://glassfish.java.net/[+GlassFish Server Open Source Edition 3.1 ou superior+]
 

|Imagens usadas neste tutorial |link:images/rose.jpg[+rose.jpg+]
link:images/sunflower.jpg[+sunflower.jpg+]
link:images/aster.jpg[+aster.jpg+]
link:images/honeysuckle.jpg[+honeysuckle.jpg+] 
|===

*Observação: *o GlassFish Server pode ser instalado com o conjunto Java EE obtido por download do NetBeans IDE. Como alternativa, você pode visitar link:https://glassfish.java.net/download.html[+a página de downloads do GlassFish Server+].

*Dica:*como opção, para fins de solução de problemas, você pode link:https://netbeans.org/files/documents/4/2343/SoapWithAttachments.zip[+fazer o download da amostra completa+] e inspecionar os códigos-fonte.

No fim deste tutorial, você terá uma aplicação Java Swing em execução que consome imagens JPEG por meio de um Web service, com o resultado exibido a seguir:

image::images/running-client.png[title="JFrame mostrando todas as imagens de flores obtidas do Web Service"]


== Próxima etapa:

link:./flower_ws.html[+ Criando o Web Service+]

link:/about/contact_form.html?to=3&subject=Feedback:%20Flower%20Overview%20EE6[+Enviar Feedback neste Tutorial+]



== Consulte Também

Para obter informações detalhadas antes de usar este tutorial, consulte os seguintes recursos:

* link:./jax-ws.html[+Introdução aos Web Services JAX-WS+]
* link:../../docs/websvc/client.html[+Desenvolvendo Clientes de Web Services+]
* link:../javaee/javaee-gettingstarted.html[+Conceitos Básicos sobre Aplicações do Java EE+]
* link:./wsit.html[+Interoperabilidade Avançada de Web Service+]

Para enviar comentários e sugestões, obter suporte e se manter informado sobre os mais recentes desenvolvimentos das funcionalidades de desenvolvimento Java EE do NetBeans IDE, link:../../../community/lists/top.html[+inscreva-se na lista de notícias nbj2ee@netbeans.org+].

