// 
//     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 Technologies Tutorials
************************************************
- link:framework-adding-support_pt_BR.html[Adicionando Suporte Para um Framework da Web]
- link:js-toolkits-dojo_pt_BR.html[Conectando uma Árvore do Dojo a uma ArrayList utilizando o formato JSON]
- link:mysql-webapp_pt_BR.html[Criando uma aplicação Web Simples Usando um Banco de Dados MySQL]
- link:jsf-jpa-weblogic_pt_BR.html[Desenvolvendo uma Aplicação Corporativa para o Oracle WebLogic Server]
- link:oracle-cloud_pt_BR.html[Executando Aplicações Web no Oracle Cloud]
- link:jsf20-crud_pt_BR.html[Gerando uma Aplicação CRUD JavaServer Faces 2.x Usando um Banco de Dados]
- link:html5-cordova-screencast_pt_BR.html[HTML5 - Conceitos Básicos sobre o Desenvolvimento de Cordova]
- link:html5-gettingstarted-screencast_pt_BR.html[HTML5 - Parte 1: Vídeo de Conceitos Básicos sobre Aplicações HTML5]
- link:html5-css-screencast_pt_BR.html[HTML5 - Parte 2: Vídeo de Trabalhando com Folhas de Estilo CSS em Aplicações HTML5]
- link:html5-javascript-screencast_pt_BR.html[HTML5 - Parte 3: Vídeo de Testando e Depurando JavaScript em Aplicações HTML5]
- link:applets_pt_BR.html[Integrando um Applet em uma Aplicação Web]
- link:ajax-quickstart_pt_BR.html[Introdução ao Ajax para Aplicações Java Web]
- link:quickstart-webapps_pt_BR.html[Introdução ao Desenvolvimento de Aplicações Web]
- link:grails-quickstart_pt_BR.html[Introdução ao Framework do Grails na Web]
- link:jsf20-intro_pt_BR.html[Introdução ao JavaServer Faces 2.x]
- link:quickstart-webapps-spring_pt_BR.html[Introdução ao Spring Web MVC]
- link:quickstart-webapps-struts_pt_BR.html[Introdução ao Struts Web Framework]
- link:quickstart-webapps-wicket_pt_BR.html[Introdução ao Wicket Web Framework]
- link:security-webapps_pt_BR.html[Protegendo uma aplicação Web no NetBeans IDE]
- link:section_pt_BR.html[]
- link:jsf20-support_pt_BR.html[Suporte a JSF 2.x no NetBeans IDE]
- link:js-toolkits-jquery_pt_BR.html[Usando o jQuery para Aprimorar a Aparência e a Facilidade de Uso de uma Página Web]
- link:hibernate-webapp_pt_BR.html[Utilizando o Hibernate em uma Aplicação Web]
- link:index_pt_BR.html[Web Technologies Tutorials]
************************************************


