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

= Anexo SOAP Binário Ponto a Ponto 2: Criando o Web Service
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Anexo SOAP Binário Ponto a Ponto 2: Criando o Web Service - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Anexo SOAP Binário Ponto a Ponto 2: Criando o Web Service

O objetivo desta lição é criar uma aplicação Web que contenha um Web service. Você implementará o Web service como um bean de sessão sem estado.

É possível fazer download de uma amostra completa do Web service do link:https://netbeans.org/projects/samples/downloads/download/Samples%252FWeb%2520Services%252FWeb%2520Service%2520Passing%2520Binary%2520Data%2520--%2520EE6%252FFlowerAlbumService.zip[+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. link:./flower_overview.html[+Visão Geral+]
2. => 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+]


[start=1]
1. <<create-web-app,Criando a Aplicação Web>>
2. <<add-ws,Adicionando o Web Service>>


[[create-web-app]]
== Criando a Aplicação Web

Nesta seção, você criará uma aplicação Web Java EE. Para esta aplicação, você adicionará as imagens que o Web service passará como dados binários.

*Para criar a aplicação Web:*

1. Selecione Arquivo > Novo Projeto (Ctrl-Shift-N no Linux e no Windows, ⌘-Shift-N no MacOS). O Assistente de Novo Projeto será exibido. Selecione Aplicação Web na categoria Java Web e clique em Próximo. A página Nome e Localização será aberta.
2. Digite  ``FlowerAlbumService``  no campo Nome do Projeto. Selecione a localização que deseja para este projeto. Mantenha as definições default das outras opções e clique em Próximo. A página Servidor e Definições será aberta.
3. Selecione o servidor GlassFish Server e Java EE versão Java EE 6 Web ou Java EE 7 Web.
4. Clique em Finalizar. O projeto  ``FlowerAlbumService``  será criado e aparecerá na janela Projetos.
5. Clique com o botão direito do mouse no nó Pacotes de Código-Fonte e selecione Novo > Pacote Java.

Se preferir, selecione Novo > Outro e selecione Pacote Java na categoria Java do assistente de Novo Arquivo.


[start=6]
. Nomeie o pacote  ``org.flower.resources`` . Clique em Finalizar.
image::images/new-package.png[]

[start=7]
. Copie as imagens a seguir para  ``org.flower.resources`` :
* link:images/rose.jpg[+rose.jpg+]
* link:images/sunflower.jpg[+sunflower.jpg+]
* link:images/aster.jpg[+aster.jpg+]
* link:images/honeysuckle.jpg[+honeysuckle.jpg+]

O projeto agora tem o pacote  ``org.flower.resources``  no Pacote de Código-Fonte. Nenhum outro conteúdo foi adicionado.

image::images/project-w-resources.png[]


[[add-ws]]
== Adicionando o Web Service

Nesta seção, você criará um Web service na aplicação Web. Você criará o serviço como um bean de sessão sem estado. Você adicionará as operações da Web a seguir ao serviço:

* Uma operação que leva o nome de uma flor e tem sua  ``Imagem``  associada.
* Uma operação que obtém miniaturas de todas as imagens de flores e as retorna como uma `` Lista`` .

*Para adicionar o Web service:*

1. Na janela Projetos, clique com o botão direito do mouse no nó do projeto  ``FlowerAlbumService``  e selecione Novo > Web Service. Como alternativa, escolha Novo > Outro e selecione Web Service em Web Services no assistente Novo Arquivo. O assistente Novo Web Service será aberto.
2. No assistente Novo Web Service, digite  ``FlowerService``  em Nome do Web Service e  ``org.flower.service``  em Nome do Pacote. Selecione Criar Web Service do Início. Selecione Implementar Serviço como Bean de Sessão Sem Estado. Clique em Finalizar. 
image::images/new-service.png[]

O Web service aparecerá em nós do projeto na janela Projetos. O diretório Pacotes de Código-Fonte inclui o pacote do serviço e o pacote de recursos.

image::images/project-w-service-and-resources.png[]

[start=3]
. Abra  ``FlowerService.java``  no editor. Alterne para a view de Design. Um form aparecerá, no qual você pode adicionar operações e elementos de qualidade de serviço ao Web service.
image::images/flower-service-empty-design.png[]

[start=4]
. Clique em Adicionar Operação. O assistente Adicionar Operação será aberto.

[start=5]
. Nomeie a operação  ``getFlower`` . No campo Tipo de Retorno, digite ou navegue para  ``java.awt.Image`` .

[start=6]
. Na guia Parâmetros, clique em Adicionar. Nomeie o parâmetro  ``nome``  e aceite o tipo  ``java.lang.String``  default. 
image::images/add-getflower-param.png[]

[start=7]
. Abra a guia Exceções. Adicione uma  ``IOException`` .
image::images/io-exception.png[]

[start=8]
. Clique em OK e feche o assistente. Em seguida, clique novamente em Adicionar Operação e adicione uma operação com as seguintes propriedades:
* *Nome:* getThumbnails
* *Tipo de retorno:* java.util.List
* *Exceção: * IOException

A view de Design agora mostra as operações  ``getFlower``  e  ``getThumbnails`` . Alterne para View de Lista das duas operações e veja todos os parâmetros delas.

image::images/flower-service-full-design.png[]


==  


== Próxima etapa:

link:./flower-code-ws.html[+Codificando e Testando o Web Service+]

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


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+].

