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

= End-to-End Binary SOAP Attachment 2: Creating the Web Service
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: End-to-End Binary SOAP Attachment 2: Creating the Web Service - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, End-to-End Binary SOAP Attachment 2: Creating the Web Service

The goal of this lesson is to create a web application that contains a web service. You implement the web service as a stateless session bean.

You can download a complete sample of the web service from the link:https://netbeans.org/projects/samples/downloads/download/Samples%252FWeb%2520Services%252FWeb%2520Service%2520Passing%2520Binary%2520Data%2520--%2520EE6%252FFlowerAlbumService.zip[+NetBeans Samples Catalog+].

*Lessons In This Tutorial*

image::images/netbeans-stamp-80-74-73.png[title="Content on this page applies to the NetBeans IDE 7.2, 7.3, 7.4 and 8.0"]

1. link:./flower_overview.html[+Overview+]
2. => Creating the Web Service
3. link:flower-code-ws.html[+Coding and Testing the Web Service+]
4. link:./flower_wsdl_schema.html[+ Modifying the Schema and WSDL Files to Pass Binary Data+]
5. link:./flower_swing.html[+ Creating the Swing Client+]


1. <<create-web-app,Creating the Web Application>>
2. <<add-ws,Adding the Web Service>>


[[create-web-app]]
== Creating the Web Application

In this section, you create a Java EE web application. To this application, you add the images that the web service will pass as binary data.

*To create the web application:*

1. Choose File > New Project (Ctrl-Shift-N on Linux and Windows, ⌘-Shift-N on MacOS). The New Project wizard appears. Select Web Application from the Java Web category and click Next. The Name and Location page opens.
2. Type  ``FlowerAlbumService``  in the Project Name field. Select the location you want for this project. Keep the default settings for the other options and click Next. The Server and Settings page opens.
3. Select the GlassFish server and Java EE version Java EE 6 Web or Java EE 7 Web.
4. Click Finish. The  ``FlowerAlbumService``  project is created and appears in the Projects window.
5. Right-click the Source Packages node and select New > Java Package.

Alternatively, select New > Other and select Java Package in the Java category of the New File wizard.

6. Name the package  ``org.flower.resources`` . Click Finish.
image::images/new-package.png[]
7. Copy the following images into  ``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+]

The project now has the package  ``org.flower.resources``  in the Source Package. No other contents have been added.

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


[[add-ws]]
== Adding the Web Service

In this section you create a web service in the web application. You create the service as a stateless session bean. You add the following web operations to the service:

* An operation that takes the name of a flower and gets its associated  ``Image`` .
* An operation that gets thumbnails of all the flower images and return them as a `` List`` .

*To add the web service:*

1. In the Projects window, right-click the  ``FlowerAlbumService``  project node and choose New > Web Service. Alternatively, choose New > Other and then select Web Service under Web Services in the New File wizard. The New Web Service wizard opens.
2. In the New Web Service wizard, type  ``FlowerService``  in Web Service Name and  ``org.flower.service``  in Package Name. Select Create Web Service from Scratch. Select Implement Service as Stateless Session Bean. Click Finish. 
image::images/new-service.png[]

The web service appears in the project's nodes in the Projects window. The Source Packages directory includes the service package and the resources package.

image::images/project-w-service-and-resources.png[]
3. Open  ``FlowerService.java``  in the editor. Switch to the Design view. A form appears in which you can add operations and quality of service elements to the web service.
image::images/flower-service-empty-design.png[]
4. Click Add Operation. The Add Operation wizard opens.
5. Name the operation  ``getFlower`` . In the Return Type field, type or browse for  ``java.awt.Image`` .
6. In the Parameters tab, click Add. Name the parameter  ``name``  and accept the default  ``java.lang.String``  type. 
image::images/add-getflower-param.png[]
7. Open the Exceptions tab. Add an  ``IOException`` .
image::images/io-exception.png[]
8. Click OK and close the wizard. Then click Add Operation again, and add an operation with the following properties:
* *Name:* getThumbnails
* *Return type:* java.util.List
* *Exception: * IOException

The Design view now shows the  ``getFlower``  and  ``getThumbnails``  operations. Switch to the List View of both operations and you see all their parameters.

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


==  


== Next step:

link:./flower-code-ws.html[+Coding and Testing the Web Service+]

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


To send comments and suggestions, get support, and keep informed about the latest developments on the NetBeans IDE Java EE development features, link:../../../community/lists/top.html[+join the nbj2ee@netbeans.org mailing list+].

