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

= Видео о развертывании веб-приложения на Oracle WebLogic Server
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Видео о развертывании веб-приложения на Oracle WebLogic Server - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Видео о развертывании веб-приложения на Oracle WebLogic Server

|===
|В этой экранной демонстрации описывается поддержка сервера Oracle WebLogic в IDE NetBeans. Эта экранная демонстрация покажет, как зарегистрировать экземпляр сервера в среде IDE, а затем развернуть веб-приложение Java EE 5. Среда IDE может автоматически создать и настроить файл дескриптора WebLogic и развернуть необходимые драйверы JDBC на сервере. Можно также включить библиотеки JavaServer Faces 2.0 на сервере, находясь в среде IDE.

Автор: Кен Гэнфилд (Ken Ganfield)
Продолжительность: 10:20

link:http://bits.netbeans.org/media/weblogic4.mp4[+Смотреть полностью+] (Чтобы загрузить видео, щелкните левой кнопкой мыши при нажатой клавише Ctrl; размер – 19 МБ)

Если при просмотре экранных демонстраций возникают проблемы, дождитесь полной загрузки видеоролика перед началом просмотра. Также можно перейти по ссылке, расположенной выше, для просмотра полной версии этой экранной демонстрации.


link:/about/contact_form.html?to=3&subject=Feedback:  Deploying a Java EE Application to the Oracle WebLogic Server[+Мы ждем ваших отзывов+]
 |         
|===



== Связанные ссылки

* link:../web/jsf-jpa-weblogic.html[+Выполнение веб-приложения JavaServer Faces 2.0 на Oracle WebLogic Server+]
