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

= Introdução ao Framework do Grails na Web
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Introdução ao Framework do Grails na Web - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Introdução ao Framework do Grails na Web

Este documento introduz o link:http://www.grails.org[+Grails+] no NetBeans IDE. No site do Grails: "O objetivo do Grails é trazer o paradigma 'codificação por convenção' para o Groovy. Trata-se de um framework de aplicações Web de código-fonte aberto que utiliza a linguagem Groovy e complementa o desenvolvimento Java Web. É possível utilizar o Grails como um ambiente de desenvolvimento standalone que oculta todos os detalhes da configuração ou integra sua lógica de negócios de Java. O Grails tem por objetivo tornar o desenvolvimento o mais simples possível e, portanto, deve recorrer para uma ampla gama de desenvolvedores, não apenas aqueles da comunidade Java."


image::images/netbeans-stamp-80-74-73.png[title="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0"]


*Para seguir este tutorial, são necessários os recursos e o software a seguir.*

|===
|Software ou Recurso |Versão Necessária 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |Java versão 7.2 ou acima 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+JDK (Java Development Kit)+] |versão 7 

|link:http://www.grails.org/Installation[+Grails+] |versão atual 
|===

*Observações.*

* Use o JDK 7 como Plataforma Java. O Grails atualmente não é executado no JDK 8.
* Ative o plug-in do Groovy para desenvolver aplicações Grails no IDE.
* Abra a janela Opções do IDE e defina o local do Grails na guia Groovy da categoria Diversos.

Se você quiser utilizar o Groovy, defina também a localização do Groovy aqui.

* Leia o link:http://grails.org/Quick%20Start[+Guia de início rápido do Grails+] oficial, que apresenta o cenário que reproduziremos nas seções a seguir.


== Criando a Aplicação

Nesta seção, executamos o comando "grails create-app" no IDE, utilizando o modelo de projeto "Aplicação do Grails" para criar uma nova aplicação do Grails.

1. Instale o Grails no sistema local e confirme se ele foi configurado corretamente.

Você pode confirmar se ele está funcionando corretamente executando o Grails na linha de comandos (isto é, digite "grails" no prompt de comandos).

2. Selecione Arquivo > Novo Projeto (Ctrl-Shift-N) e selecione "Aplicação do Grails" na categoria "Groovy". Clique em Próximo.
3. Em Nome do Projeto, digite "BookDemo"; em Localização do Projeto, selecione a pasta em que a aplicação será criada. Clique em Finalizar.

O IDE executa o comando "grails create-app", mostrando a saída na janela de Saída. A janela Projetos deverá mostrar o seguinte:

image::images/grails-65-4.png[]

Expanda as pastas e observe a estrutura do código-fonte criado pelo IDE usando os scripts do Grails. Além disso, observe os arquivos gerados e veja que muitos deles têm os valores default preenchidos.


== Criando a Classe de Domínio

Nesta seção, usamos o IDE para executar o script "grails create-domain-class".

1. Clique com o botão direito do mouse no nó Classes de Domínio e selecione Novo > Classe de Domínio do Grails.
2. Nomeie a classe de domínio como "Book" e clique em Finalizar. O domínio "Book.groovy" é criado no nó Classes de Domínio.
3. Abra a classe Book e preencha duas Strings, "title" e "author". O seguinte deverá ser exibido:
image::images/grails-65-8.png[]
4. Crie alguns valores iniciais na classe Bootstrap.groovy, que está no nó Configuração. O código adicionado à classe é mostrado em negrito a seguir:

[source,java]
----

class BootStrap {

     def init = { servletContext ->
         *new Book(author:"Stephen King",title:"The Shining").save()
         new Book(author:"James Patterson",title:"Along Came a Spider").save()*
     }
     
     def destroy = {
     }
     
}
----

*Observação.* Adicione uma importação de  ``bookdemo.Book``  se você vir uma advertência na margem esquerda do editor de código-fonte.


== Criando o Controlador

Nesta seção, usamos o script "grails create-controller" para criar um controlador para nossa classe de domínio:

1. Clique com o botão direito do mouse no nó Controladores e selecione Novo > Controlador do Grails.
2. Digite "Book" em Nome da Classe e observe que a classe gerada se chamará "BookController":
image::images/grails-65-11.png[]

Clique em Finalizar. O controlador é gerado.

3. Comente a linha gerada entre as chaves e adicione "def scaffold = Book". O seguinte deverá ser exibido: 
image::images/grails-65-13.png[]


== Executando a Aplicação

Nossa aplicação Grails simples está completa. Nesta seção, ela será implantada.

1. Clique com o botão direito do mouse na aplicação e escolha "Executar". A aplicação é implantada no Jetty, como você pode ver na janela Serviços: 
image::images/grails-65-19.png[]
2. O URL é mostrado na janela de Saída. Se o browser não abrir automaticamente, cole o URL em um browser e você verá sua aplicação. Clique no link "BookController" e você verá isto: 
image::images/grails-65-14.png[]
3. Clique em Novo Livro e crie uma nova entrada: 
image::images/grails-65-15.png[]
4. Quando você clicar em Criar, observe que poderá editar ou deletar a entrada: 
image::images/grails-65-17.png[]
5. ...e que a entrada é refletida na lista de entradas: 
image::images/grails-65-18.png[]
link:/about/contact_form.html?to=3&subject=Feedback: NetBeans IDE 6.5 Grails Quick Start Guide[+Enviar Feedback neste Tutorial+]



== Consulte Também

Isso conclui a introdução ao Grails no NetBeans IDE. Agora você sabe como criar um aplicação básica no framework do Grails utilizando o IDE.

Para obter mais informações sobre a tecnologia Grails e Groovy em link:https://netbeans.org/[+netbeans.org+], consulte link:../java/groovy-quickstart.html[+Introdução ao Groovy+].

