// 
//     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 Service Tutorials
************************************************
- link:pet-catalog-screencast_ru.html[Pet Catalog (веб-службы RESTful) - IDE NetBeans 6.5]
- link:section_ru.html[]
- link:index_ru.html[Web Service Tutorials]
- link:intro-ws_ru.html[Введение в веб-службы]
- link:jax-ws_ru.html[Начало работы с веб-службами JAX-WS]
- link:rest_ru.html[Начало работы с веб-службами RESTful]
- link:flower_overview_ru.html[Передача двоичных данных с помощью приложения веб-службы, часть 1: обзор]
- link:flower_wsdl_schema_ru.html[Передача двоичных данных с помощью приложения веб-службы, часть 4: изменение файлов схемы и WSDL]
- link:flower_swing_ru.html[Передача двоичных данных с помощью приложения веб-службы, часть 5: создание клиента Swing]
- link:zillow_ru.html[ПО как услуга: руководство для Zillow]
- link:client_ru.html[Разработка клиентов веб-служб JAX-WS]
- link:wsit_ru.html[Расширенные возможности взаимодействия веб-служб]
- link:flower-code-ws_ru.html[Сквозная передача двоичных данных – вложение SOAP, часть 3: создание кода для веб-службы и ее тестирование]
- link:flower_ws_ru.html[Сквозная передача двоичных данных – вложение SOAP 2: создание веб-службы]
************************************************


