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

= Web Services Learning Trail
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Web Services Learning Trail - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Web Services Learning Trail

== *What Are Web Services?*

Web services are distributed application components that are externally available. You can use them to integrate computer applications that are written in different languages and run on different platforms. Web services are language and platform independent because vendors have agreed on common web service standards.

Web service applications are deployed to a Java EE application server, such as GlassFish / Sun Java System Application Server.

This page provides links to some of the NetBeans documents and resources that can help you learn how to develop web service applications with NetBeans IDE.

== Getting Started 

* link:../docs/websvc/intro-ws.html[+Introduction to Web Services +]

== Tutorials and Articles

=== SOAP Web Services

* link:../docs/websvc/jax-ws.html[+Getting Started with JAX-WS Web Services+]
* link:../docs/websvc/client.html[+Developing JAX-WS Web Service Clients+]
* Passing Binary Data in SOAP: A five-part tutorial
** link:../docs/websvc/flower_overview.html[+Part 1: Overview+]
** link:../docs/websvc/flower_ws.html[+Part 2: Creating the Web Service+]
** link:../docs/websvc/flower-code-ws.html[+Part 3: Coding and Testing the Web Service+]
** link:../docs/websvc/flower_wsdl_schema.html[+Part 4: Modifying the Schema and WSDL Files+]
** link:../docs/websvc/flower_swing.html[+Part 5: Creating the Swing Client+]

=== RESTful Web Services

* link:../docs/websvc/rest.html[+Getting Started with RESTful Web Services+]
* link:http://netbeans.dzone.com/nb-generate-simpler-rest[+DZone: NetBeans IDE to Generate Simpler RESTful Web Services+]
* link:http://netbeans.dzone.com/nb-smugmug-client[+DZone: SmugMug Client in Java with NetBeans IDE+]
* link:http://netbeans.dzone.com/articles/how-to-combine-rest-and-ejb-31[+DZone: How to Combine REST Services with EJB 3.1+]

=== Software as a Service (SaaS)

* link:../docs/websvc/zillow.html[+SaaS: Zillow+]

== Community-Contributed Docs

* link:http://netbeans.dzone.com/nb-hierarchical-web-services[+Hierarchical Web Service Development with NetBeans IDE+] by Jayasurya Venug
* link:http://buttso.blogspot.com/2011/02/using-jax-rs-with-weblogic-server-1034.html[+Steve Button's blog: Using JAX-RS [and NetBeans IDE] With WebLogic Server 10.3.4+]
* link:http://www.adam-bien.com/roller/abien/entry/simplest_possible_ejb_3_13[+Simplest Possible EJB 3.1/REST (JSR 311) Component+], by Adam Bien
* link:http://wiki.netbeans.org/TransformingSOAPMessagesWithXSLT[+Transforming SOAP Messages with XSLT+], by Siegfried Bolz
* link:http://wiki.netbeans.org/JavaClientForDeliciousUsingNetBeans[+Creating a Java Client for del.icio.us RESTful Web Services+], by Amit Kumar Saha
* link:http://wiki.netbeans.org/SOAPclientForOpenCalais[+A SOAP Client for Open Calais+], by Amit Kumar Saha

== Screencasts

* link:../docs/websvc/pet-catalog-screencast.html[+RESTful Web Services Pet Catalog - NetBeans IDE 6.5+]
* java.net: link:http://download.java.net/javaee5/screencasts/metro-nb6/[+Secure and Reliable Web Services using Metro/GlassFish+]
* YouTube: link:http://youtube.com/watch?v=K8OtFD6RLMM[+SOCRADES: Demonstration of Web Services on Sun SPOT Devices+]

== Other Resources

===_Developing Applications with NetBeans IDE_ User's Guide

* link:http://www.oracle.com/pls/topic/lookup?ctx=nb7400&id=NBDAG1842[+Developing and Securing Web Services+]
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb7400&id=NBDAG1035[+Developing Web Applications+]
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb7400&id=NBDAG1216[+Developing Enterprise Applications+]
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb7400&id=NBDAG1649[+Working with Web and Application Servers+]

=== FAQs

* link:http://wiki.netbeans.org/NetBeansUserFAQ#section-NetBeansUserFAQ-WebServicesDevelopment[+Web Service Development FAQs+]

=== Tutorials and Other Docs

* link:https://weblogs.java.net/blog/caroljmcdonald/archive/2013/09/16/example-backbonejs-jax-rs-jpa-application[+Example Backbone.js, JAX-RS, JPA Application+]
* link:http://coenraets.org/blog/2011/12/restful-services-with-jquery-and-java-using-jax-rs-and-jersey/[+RESTful Services with JQuery and Java Using JAX-RS and Jersey+]
* link:https://glassfish.java.net/[+Join the GlassFish Community +]
* link:http://www.mysql.com/why-mysql/java/[+MySQL and Java - Resources +]
* link:http://java.dzone.com/news/5-techniques-create-web-servic[+5 Techniques for Creating Java Web Services from WSDL+]
* link:http://netbeans.dzone.com/news/spring-framework-support-rest-[+Spring Framework Support in Jersey REST 0.7+]
* link:http://netbeans.dzone.com/news/advanced-web-service-interoper[+Advanced Web Service Interoperability Made Easy+]
* link:http://netbeans.dzone.com/news/getting-started-with-software-[+Getting Started with "Software as a Service"+]

=== Blogs

* link:http://javaevangelist.blogspot.com/[+John Yeary's Blog: Web Services on NetBeans IDE+]
* link:http://www.java.net/blogs/caroljmcdonald/[+Carol McDonald: Java EE+]
* link:http://blogs.oracle.com/japod/[+Jakub Podlasek's blog: Jersey RESTful Web Services+]
* link:http://blogs.oracle.com/geertjan/[+Geertjan Wielenga: NetBeans IDE Platform+]
