Mostrando postagens com marcador Desenvolvimento Web. Mostrar todas as postagens
Mostrando postagens com marcador Desenvolvimento Web. Mostrar todas as postagens

domingo, 7 de fevereiro de 2010

Tagged under: , , , , , , , , , , , , , , ,

SlideCast Palestra Desenvolvimento Java - Ekaaty Day / Area1/FTE

Neste último sábado, 06/02/2010, estive na faculdade Área 1 apresentando a palestra Desenvolvimento Java no Ekaaty Day. Mostrei uma visão geral para iniciantes na tecnologia. Abaixo os SlideCast (slides + áudio), para quem não pôde estar presente e quiser conferir.


No filosifia do LinguÁgil, também foram apresentadas palestras sobre Agile, PHP e RubyOnRails, pelos amigos Alex Chastinet (AgileBahia), Márcio Albuquerque (PHPBahia) e Luciano Borges (RailsBahia). Quem ganha é o público, que tem num mesmo evento a oportunidade de saber mais sobre várias linguagens, enriquecendo seus conhecimentos e aguçando sua curiosidade sobre possibilidades antes nem imaginadas.

Aliás, se sua faculdade tiver interesse em alguma (ou até todas!) das palestras, entre em contato conosco. Estamos iniciando o projeto LinguÁgil na Universidade (já no aquecimento para o LinguÁgil 2010, no 2o semestre), disseminando as Metodologias Ágeis, as linguagens de programação e principalmente esta filosofia de cooperação entre comunidades de TIC que só ajuda a fortalecer o cenário da Tecnologia da Informação em nosso estado.

sábado, 3 de maio de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 6ª parte - final

Você, leitor, que acompanhou nossa “receita de bolo” para fazer uma aplicação web, deve ter percebido como é fácil e prático assim fazê-lo usando o JSF, o Hibernate e a IDE Netbeans 6. Neste post final, comentarei o que fizemos e deixamos de fazer aqui para que seu conhecimento não fique limitado apenas ao que mostrei no tutorial. É sempre importante aprendermos com exemplos e depois buscarmos o conhecimento do motivo de ter sido feito daquele jeito, e não de outro.

No primeiro post, vimos as linhas gerais da arquitetura da aplicação e o escopo de nosso exemplo. Nossa arquitetura divide-se em dois componentes principais: a camada de aplicação e a camada de interface web. Numa comparação com o tradicional modelo MVC (Model-View-Controller), nossa camada de aplicação abriga as camadas Model e Controller; a camada web abriga a camada View e a Controller.

Você pode se perguntar agora por que a camada Controller está nas duas camadas de nosso exemplo, e eu explico. No modelo MVC, Controller é a parte onde fica os objetos que desviam o fluxo de execução de uma tarefa para o local adequado. O managed bean Page que interage com o JSP faz isso, assim como o Facade do lado da camada Aplicação. Entendeu, agora? Para aprender mais sobre o modelo MVC, sugiro este artigo do site Macoratti.net e este da empresa Fragmental.

Com nossa arquitetura, será bastante fácil você, no futuro, criar uma interface desktop ou para dispositivos móveis, já que a camada de Aplicação não precisará ser refeita. Somente será necessário criar a camada Desktop, ou uma camada Celular.

No segundo post, nós criamos o banco de dados (relacional), configuramos as bibliotecas necessárias para nosso projeto, e extraímos as classes-entidade a partir do banco de dados, fazendo uma espécie de “engenharia reversa”. Também configuramos a unidade de persistência para que a aplicação possa estabelecer as conexões com o banco de dados e usar o Hibernate como provedor de persistência.

Do jeito que deixamos o arquivo persistence.xml, o Hibernate está conectando-se ao banco de dados da maneira mais “burra” que existe. Foi deixado assim propositadamente para não dificultar o aprendizado no tutorial. Isso só deve ser feito em tempo de desenvolvimento. Nossa unidade de persistência não está usando os recursos de cache e nem pool de conexões do provedor Hibernate. Para melhorarmos a performance, necessária para um ambiente de produção, é necessária uma intervenção manual no arquivo XML.

O Hibernate tem vários tipos de cache. O mais usado é o EHCache e, para configurá-lo, basta modificar a seguinte linha do arquivo persistence.xml:
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"></property>
para
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"></property>

O Hibernate também tem várias opções de pool de conexões. A maneira mais simples de usarmos um pool é fazermos a configuração padrão da especificação JPA, ou seja, usarmos o pool do próprio servidor web (no caso, o Tomcat). Primeiro, abra o arquivo context.xml, que fica dentro do projeto JavaBahiaWeb e mude-o para ficar assim:

<context path="/javabahia">
<resource name="jdbc/JavaBahiaDB" auth="Container" type="javax.sql.DataSource" maxactive="10" maxidle="1" maxwait="10000" username="root" password="" driverclassname="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/javabahia">
</resource></context>


Depois, volte no arquivo persistence.xml, e insira a seguinte linha, logo abaixo da tag provider:
<non-jta-data-source>java:comp:env/jdbc/JavaBahiaDB</non-jta-data-source>

Na parte onde configuramos as propriedades (properties), substitua as linhas que possuem o nome da propriedade iniciando com 'hibernate.connection' pela linha abaixo(é importante substituir, e não acrescentar, com riscos de dar erro depois):
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"></property>

Agora, sua conexão com o banco de dados já poderá ser feita da melhor forma.

No terceiro post, criamos as classes de persistência dos objetos-entidade – chamados DAO – e a classe de acesso à nossa camada de Aplicação – a classe façade.

O façade é um padrão de projeto (design pattern) utilizado para simplificar o uso de um conjunto maior de código, encapsulando-o e isolando-o. O nosso JavaBahiaFacade.java é o único ponto de chamada de operações para a camada de Aplicação. A camada de Web somente usa essa classe para realizar as tarefas que foram requisitadas pelos usuários.

O DAO (Data Access Object) é um padrão JEE para estabelecer um “tradutor” entre o mundo orientado a objeto e o mundo relacional (da maioria dos bancos de dados). Isolando essa transformação em uma classe responsável por isto, ganhamos a flexibilidade de podermos mudar, a qualquer momento, a forma como persistimos os nossos objetos. Alguns autores chamam esse padrão de Data Mapper.

No quarto post, começamos a construir a camada Web, responsável por fazer a interface com o usuário da aplicação. Fizemos uso da API Visual Web do Netbeans (conhecido como projeto WoodStock); essa API traz componentes JSF que facilitam a vida do desenvolvedor web. Nesse post, construímos a tela de acesso à aplicação e vimos como usar os managed beans para controlar o fluxo do sistema.

No quinto post, fizemos a tela de manutenção do cadastro de uma das entidades de nosso contexto, usando o conceito CRUD. O CRUD (Create-Retrieve-Update-Delete) é um conceito que traduz as quatro operações básicas de um armazenamento de informação. Na maioria das entidades de um sistema, temos as operações de criação (create), recuperação (retrieve), atualização (update), e exclusão (delete).

Vimos nesse post, também, o uso do objeto provedor de dados (data provider). Esse objeto é importante para mantermos a ilusão de que a tabela acessa diretamente o banco de dados, sem que a divisão das camadas de nosso sistema seja quebrada. O componente Data Table, do projeto WoodStock, já traz prontas as funcionalidades de paginação e ordenação e, para isso, precisa desse objeto provedor de dados.

Algumas coisas foram esquecidas nesse exemplo, como a validação, por exemplo, para que não fosse prejudicado o entendimento do que foi abordado. Fica minha promessa de abordar esse tópico futuramente.

Eu espero que você tenha gostado deste tutorial e possa aumentar os seus conhecimentos buscando novas fontes de referência para os conceitos aqui apresentados. Estou disponibilizando o código final completo dos projetos JavaBahiaApp e JavaBahiaWeb. Originalmente estava usando o serviço 4Shared mas mudei após os arquivos terem sidos apagados.

Tenha um bom estudo e, desde já, agradeço pela sua atenção.

sábado, 26 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 5ª parte

Prosseguindo com nossa seqüência de posts (parte 1, parte 2, parte3 e parte 4), vamos implementar a manutenção do cadastro de empresas (o popular CRUD) e depois executar o que já foi feito até o momento no Tomcat.

Clique com o botão direito do mouse no projeto JavaBahiaWeb, depois clique em Novo (New), Fragmento da Página JSF Visual da Web (Visual Web JSF Page Fragment). Digite 'Cabecalho' no campo Nome do Arquivo (File Name) e depois clique no botão Finalizar (Finish). Crie a tela conforme a imagem abaixo e siga configurando as propriedades dos componentes da tela de acordo com a tabela a seguir.


-------------------------------------------------------------------------------------
Tipo ! Id ! Propriedades ! Observações
--- ! Cabecalho ! {width:600px, height:80px} ! ---
StaticText ! stxTitulo ! {style:font-size: 18px; font-weight: bold;, text:JavaBahia Web} ! ---
GridPanel ! panelLinks ! {columns:1} ! ---
Hyperlink ! linkEmpresas ! {text:Empresas} ! Coloque dentro de panelLinks.
-------------------------------------------------------------------------------------


Abra a página PagePrincipal.jsp e insira uma Caixa de Fragmento de Página (Page Fragment Box), escolhendo o arquivo Cabecalho.jspf – veja a figura abaixo.



Clique com o botão direito do mouse no projeto JavaBahiaWeb, depois clique em Novo (New), Página JSF Visual da Web (Visual Web JSF Page). Digite 'PageEmpresas' no campo Nome do Arquivo (File Name) e depois clique no botão Finalizar (Finish). Antes de editarmos a tela, abra o arquivo de configuração faces-config.xml para podermos editar a navegação entre as telas já criadas. Clique em cima de Cabecalho:linkEmpresas, dentro de PagePrincipal.jsp, e arraste o mouse até PageEmpresas.jsp, soltando-o. Clique em cima da linha desenhada para selecioná-la, pressione as teclas Control+R, e renomeie case1 para manterEmpresas, conforme mostra a figura abaixo. Essa ação que fizemos configurou o linkEmpresas para abrir a tela PageEmpresas dentro do fragmento Cabecalho.



Volte à edição da página PageEmpresas e crie a tela conforme a imagem abaixo, configurando as propriedades dos componentes da tela de acordo com a tabela a seguir. Por enquanto, deixe o componente Tabela (Table) do mesmo jeito que o Netbeans puser na tela.


-------------------------------------------------------------------------------------
Tipo ! Id ! Propriedades ! Observações
FragmentPageBox ! --- ! {file: Cabecalho.jspf} ! ---
GridPanel ! panelRegistros ! {colums: 1} ! ---
Table ! tableEmpresas ! por enquanto, deixe assim ! Coloque dentro de panelRegistros.
MessageGroup ! grpMsg ! {} ! Coloque dentro de panelRegistros.
GridPanel ! panelBotoes ! {colums: 5} ! ---
Button ! btnLimpar ! {text: Limpar Campos} ! Coloque dentro de panelBotoes.
Button ! btnFiltrar ! {text: Filtrar pelos Campos} ! Coloque dentro de panelBotoes.
Button ! btnSalvarNovo ! {text: Salvar Novo} ! Coloque dentro de panelBotoes.
Button ! btnAtualizar ! {text: Atualizar} ! Coloque dentro de panelBotoes.
Button ! btnExcluir ! {text: Excluir} ! Coloque dentro de panelBotoes.
GridPanel ! panelCampos ! {colums: 1} ! ---
Label ! lblCnpj ! {text: CNPJ, for: txtCnpj} ! Coloque dentro de panelCampos.
TextField ! txtCnpj ! {columns: 15} ! Coloque dentro de panelCampos.
Label ! lblNome ! {text: Nome, for: txtNome} ! Coloque dentro de panelCampos.
TextField ! txtNome ! {columns: 50} ! Coloque dentro de panelCampos.
Label ! lblEmail ! {text: E-mail, for: txtEmail} ! Coloque dentro de panelCampos.
TextField ! txtEmail ! {columns: 50} ! Coloque dentro de panelCampos.
-------------------------------------------------------------------------------------


Antes de continuarmos a configuração da tabela que exibirá os registros de Empresas, teremos que criar um provedor de dados (data provider). Esse objeto irá povoar a tabela com os dados a serem exibidos.

Clique com o botão direito do mouse no projeto JavaBahiaWeb, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como EmpresaProvider e escreva no campo Pacote (Package), o valor 'javabahia.web.provider'; clique no botão Finalizar (Finish).

O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código como é mostrado a seguir:

***


public class EmpresaProvider extends ObjectListDataProvider {

private List<Empresa> empresas;

public EmpresaProvider() {
empresas = new ArrayList<Empresa>();
// a linha abaixo existe apenas para que possamos desenhar a tabela na IDE
empresas.add(new Empresa());
setList(empresas);
}
}


***

Essa classe estende a classe ObjectListDataProvider, fornecida pelo Netbeans, encapsulando uma lista de objetos para a tabela de nossa página web.

Procure no pacote 'javabahia.web' a classe SessionBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private EmpresaProvider empresaProvider;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.web.provider.EmpresaProvider. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Digite, dentro do método init(), bem abaixo da seção Inicialização de Componentes Gerenciados (Managed Component Initialization), a seguinte linha:

setEmpresaProvider(new EmpresaProvider());

Retornando à edição da página PageEmpresas, vamos continuar a configuração da tabela que exibirá os registros de empresas. Clique com o botão direito do mouse na tabela e escolha a opção Layout da Tabela (Table Layout). Na lista de seleção Pegar Dados De (Get Data From) escolha o objeto empresaProvider, proveniente do SessionBean1. Coloque na lista Selecionados (Selected) os atributos cnpj, email e nome. Edite os Textos de Cabeçalho (Header Text) de cada campo. Somente para o atributo cnpj, selecione Hyperlink como Tipo do Componente (Component Type).



Clique na aba Opções (Options) da caixa de diálogo. Digite o valor 'Empresas' no campo Título (Title), o valor 'Não há registros a serem exibidos' no campo Mensagem de Dados Vazios (Empty Data Message), e marque as opções Mostrar Botão de Limpar Ordenação (Show Clear Sort Button), Mostrar Botão de Alternância de Ordenação (Show Sort Panel Toggle Button), e Habilitar Paginação (Enable Pagination), digitando o valor 5 para o Tamanho da Página (Page Size).



Ao final de tudo, sua tela deverá parecer com esta imagem abaixo.



Procure no pacote 'javabahia.web' a classe RequestBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private Empresa empresa;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.entidade.Empresa. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Digite, dentro do método init(), bem abaixo da seção Inicialização de Componentes Gerenciados (Managed Component Initialization), a seguinte linha:

setEmpresa(new Empresa());

Volte à página PageEmpresas.jsp, com o editor visual aberto (design). Clique com o botão direito do mouse em cima do campo de texto txtCnpj, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade cnpj do objeto Empresa que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.



Clique com o botão direito do mouse em cima do campo de texto txtNome, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade nome do objeto Empresa que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação. Clique com o botão direito do mouse em cima do campo de texto txtEmail, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade email do objeto Empresa que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.

Agora só nos resta programar as ações que os botões da tela realizarão quando forem clicados. Em primeiro lugar, iremos programar o que acontecerá quando o link da coluna CNPJ da tabela for acionado. Dê um clique com o botão esquerdo do mouse em cima do link na tabela, e configure a propriedade id para o valor 'linkCnpjEmpresa'. Dê dois cliques em cima do mesmo link e o Netbeans abrirá o editor de código para você, colocando o método que será responsável pela ação do usuário sobre o link. Digite o seguinte código:

public String linkCnpjEmpresa_action() {
try {
String selecionado = (String) getValue("#{currentRow.value['cnpj']}");
JavaBahiaFacade facade = new JavaBahiaFacade();
Empresa registro = facade.obterEmpresaPorCnpj(selecionado);
getRequestBean1().setEmpresa(registro);
} catch (Exception e) {
error(e.getMessage());
}
return null;
}

Acrescente também o seguinte código:

private void limparCamposFormulario() {
getRequestBean1().setEmpresa(new Empresa());
}

Retorne a edição visual da página e dê dois cliques em cima do botão 'Limpar Campos'; digite o código:

public String btnLimpar_action() {
limparCamposFormulario();
return null;
}

Agora, vamos fazer os mesmos passos para os demais botões da tela, digitando os códigos abaixo listados. Chamo a atenção para o código do botão Filtrar, onde comento por quê não estamos fazendo filtro realmente.

public String btnFiltrar_action() {
try {
Empresa filtro = getRequestBean1().getEmpresa();
// para simplificar o tutorial, o filtro não será utilizado,
// ficando o resultado deste método sempre trazendo todos os registros
// a modificação necessária aqui fica por conta de você, ok?
JavaBahiaFacade facade = new JavaBahiaFacade();
List registros = facade.obterTodasEmpresas();
getSessionBean1().getEmpresaProvider().setList(registros);
} catch (Exception e) {
error(e.getMessage());
}
return null;
}

public String btnSalvarNovo_action() {
try {
Empresa registro = getRequestBean1().getEmpresa();
JavaBahiaFacade facade = new JavaBahiaFacade();
facade.inserirEmpresa(registro);
info("Registro inserido com sucesso! Atualize a tabela para perceber as modificações.");
limparCamposFormulario();
} catch (Exception e) {
error(e.getMessage());
}
return null;
}

public String btnAtualizar_action() {
try {
Empresa registro = getRequestBean1().getEmpresa();
JavaBahiaFacade facade = new JavaBahiaFacade();
facade.atualizarEmpresa(registro);
info("Registro atualizado com sucesso! Atualize a tabela para perceber as modificações.");
limparCamposFormulario();
} catch (Exception e) {
error(e.getMessage());
} return null;
}

public String btnExcluir_action() {
try {
Empresa registro = getRequestBean1().getEmpresa();
JavaBahiaFacade facade = new JavaBahiaFacade();
facade.excluirEmpresa(registro);
info("Registro excluído com sucesso! Atualize a tabela para perceber as modificações.");
limparCamposFormulario();
} catch (Exception e) {
error(e.getMessage());
}
return null;
}

Finalmente, vamos botar aplicação pra funcionar. Compile os dois projetos que criamos no Netbeans. No projeto JavaBahiaWeb, clique com o botão direito do mouse e depois clique em Executar (Run). A própria ferramenta se encarregará de iniciar o servidor Tomcat e implantar (deploy) a aplicação nele. O Netbeans ainda abrirá o seu navegador padrão já na tela principal de nossa aplicação, ou seja, PageLogin. Use o usuário teste que inserimos no banco de dados para acessar a aplicação.

Esse quinto post ficou enorme porque a criação da tela visual para Empresas é a parte mais trabalhosa desse nosso exemplo. Por isso, a criação da tela de Contratos não será mostrada aqui no blog. Vou deixar como exercício para você, leitor, fazer o restante da aplicação.

Comentarei no próximo e último post da série sobre algumas coisas que fizemos e deixamos de fazer aqui em nosso tutorial. Aproveitarei também para colocar um link para o código completo, permitindo a você comparar e corrigir o exercício. Fico grato pela sua atenção e tenha um ótimo dia!

quinta-feira, 17 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 4ª parte

Para você que está chegando agora a este blog, saiba que estamos construindo uma aplicação web em uma seqüência de postagens (parte 1, parte 2 e parte 3) e, neste momento, construiremos o componente Web (veja arquitetura definida na parte 1) que irá “apresentar” o nosso sistema ao usuário.

Vá no menu Arquivo (File), Novo Projeto (New Project). Escolha a categoria Web e o tipo de projeto Aplicação Web (Web Application); clique no botão Avançar (Next). Dê o nome JavaBahiaWeb para o projeto, escolha a localização dele no seu computador e clique no botão Avançar (Next). Você agora terá que escolher o Servidor (Server) em que funcionará o sistema. Como o nosso sistema é simples, ele deverá funcionar em um container web simples como o Tomcat. Se não houver nenhum servidor listado nesta tela, você terá que adicioná-lo clicando no botão Adicionar (Add). No campo Caminho do Contexto (Context Path) escreva '/javabahia' (não esqueça da barra) e clique no botão Avançar (Next). Finalmente, marque o framework Visual Web JavaServer Faces, escreva no campo Pacote Java Padrão (Default Java Package) o valor 'javabahia.web' (não esqueça o ponto), e clique no botão Finalizar (Finish). O Netbeans abrirá para você o código da primeira página criada: Page1.jsp.

Clique com o botão direito do mouse no projeto recém criado, e escolha Propriedades (Properties). Selecione a categoria (categories) Bibliotecas (Libraries); clique no botão Adicionar Biblioteca (Add Library). Escolha a biblioteca que criamos na parte 2 (Hibernate) e clique em OK. Clique no botão Adicionar Projeto (Add Project), escolha o projeto JavaBahiaApp e clique no botão Adicionar JAR do Projeto(Add Project JAR Files). Por fim, clique no botão OK da janela de propriedades do projeto.

Neste post, iremos criar a tela de autenticação do usuário para acessar o sistema. Para isso, vamos renomear a página que foi automaticamente criada – Page1.jsp – para PageLogin.jsp. Clique com o botão direito do mouse em cima do arquivo Page1.jsp, clique em Refatorar (Refactor), depois em Renomear (Rename). Digite o novo nome no campo Novo Nome (New Name) e depois clique em Refatorar (Refactor).

Agora, crie a tela conforme a imagem abaixo, e configurando as propriedades dos componentes da tela de acordo com a tabela a seguir.


-------------------------------------------------------------------------------------
Tipo ! Id ! Propriedades ! Observações
GridPanel ! panelCampos ! {columns:2} ! ---
TextField ! txtLogin ! --- ! Coloque dentro de panelCampos.
Label ! lblLogin ! {for:txtLogin, text:Login} ! Coloque dentro de panelCampos.
PasswordField ! txtSenha ! --- ! Coloque dentro de panelCampos.
Label ! lblSenha ! {for:txtSenha, text:Senha} ! Coloque dentro de panelCampos.
GridPanel ! panelBotoes ! {columns:2} ! ---
Button ! btnAcessar ! {text:Acessar} ! Coloque dentro de panelBotoes.
Button ! btnLimpar ! {text:Limpar} ! Coloque dentro de panelBotoes.
MessageGroup ! grpMsg ! --- ! ---
-------------------------------------------------------------------------------------

Procure no pacote 'javabahia.web' a classe SessionBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private Usuario usuarioLogado;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.entidade.Usuario. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Agora, procure no pacote 'javabahia.web' a classe RequestBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private Usuario usuario;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.entidade.Usuario. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Digite, dentro do método init(), bem abaixo da seção Inicialização de Componentes Gerenciados (Managed Component Initialization), a seguinte linha:

setUsuario(new Usuario());

Volte à página PageLogin.jsp, com o editor visual aberto (design). Clique com o botão direito do mouse em cima do campo de texto txtLogin, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade login do objeto Usuario que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.

Clique com o botão direito do mouse em cima do campo de texto txtSenha, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade senha do objeto Usuario que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.

Clique com o botão direito do mouse em cima do projeto JavaBahiaWeb, e selecione Novo (New), Página JSF da Web Visual (Visual Web JSF Page). Digite PagePrincipal no campo Nome do Arquivo (File Name) e clique em Finalizar (Finish). Abra o arquivo faces-config.xml na seção Arquivos de Configuração (Configuration Files) e o Netbeans lhe exibirá as páginas até o momento criadas. Clique em cima de btnAcessar, dentro de PageLogin.jsp, e arraste o mouse até PagePrincipal.jsp, soltando-o. Clique em cima da linha desenhada para selecioná-la, pressione as teclas Control+R, e renomeie case1 para acessoLiberado, conforme mostra a figura abaixo.

Falta ainda criar o evento que será disparado quando o usuário clicar no botão para entrar no sistema. Clique com o botão direito do mouse em cima do botão btnAcessar e clique em Manipulador do Evento da Ação (Edit Action Event Handler). O Netbeans abrirá automaticamente o editor de código, posicionando o cursor dentro de um método recém-criado. Esse método executará o que deverá ser feito para processar a ação do usuário. Digite o seguinte código:

public String btnAcessar_action() {
JavaBahiaFacade facade = new JavaBahiaFacade();
Usuario uReq = getRequestBean1().getUsuario();
Usuario usuario = facade.obterUsuarioPorLoginSenha(uReq.getLogin(), uReq.getSenha()); if (usuario != null) {
getSessionBean1().setUsuarioLogado(usuario);
} else {
error("Não foi possível encontrar o usuário a partir do login/senha informado(s).");
}
return "acessoLiberado";
}

Volte ao editor visual da página PageLogin.jsp (clique no botão Design no topo da janela de código), clique com o botão direito do mouse em cima do botão btnLimpar e clique em Manipulador do Evento da Ação (Edit Action Event Handler). Digite o seguinte código:

public String btnLimpar_action() {
getRequestBean1().setUsuario(new Usuario());
return null;
}

Antes de acessarmos a nossa aplicação, teremos que inserir um registro na tabela Usuario do banco de dados.

INSERT INTO usuario VALUES('teste','teste','Usuário de Teste','teste@javabahia.dev.java.net');

Para os usuários mais avançados, já podem executar esse código, usando o Tomcat, e testar a autenticação. Aos usuários iniciantes, tenham um pouco de calma pois está chegando o grande final. No próximo post, mostrarei como executar esse código e terminaremos de construir nossa aplicação, criando as telas de interface para as entidades Empresa e Contrato. Até lá!

quarta-feira, 9 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 3ª parte

Continuando os posts anteriores (parte 1 e parte 2), iremos, nesta terceira parte, inicialmente, criar as classes de persistência, popularmente conhecidas como classes DAO (Data Access Objects).

Clique com o botão direito no nosso projeto, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como UsuarioDao e escreva no campo Pacote (Package), o valor 'javabahia.dao'; clique no botão Finalizar (Finish).

O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código mostrado a seguir:

***


public class UsuarioDao {

private EntityManager em;

public UsuarioDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
usuario = em.merge(usuario); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(usuario); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
usuario = em.merge(usuario); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(usuario); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Usuario ref = em.find(Usuario.class, usuario.getLogin());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select u from Usuario u");
return qry.getResultList();
}

public Usuario obterPorChave(String login) {
Query qry = em.createQuery("select u from Usuario u where u.login = :param1");
qry.setParameter("param1", login);
return (Usuario) qry.getSingleResult();
}

public Usuario obterPorLoginSenha(String login, String senha) {
Query qry = em.createQuery("select u from Usuario u where u.login = :param1 and u.senha = :param2");
qry.setParameter("param1", login);
qry.setParameter("param2", senha);
return (Usuario) qry.getSingleResult();
}
}


***

Vamos às explicações sobre alguns trechos de código.

private EntityManager em;
// (...)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();

Essa é a forma como obtemos uma instância da classe EntityManager, responsável pelas operações de persistência dos objetos. As entidades persistentes são associadas a um contexto de persistência (a classe Persistence) e precisam de um provedor de persistência para mostrar como as “coisas” funcionam. As configurações utilizadas pelo provedor de persistência são descritas no arquivo persistence.xml, dentro da pasta META-INF, e nomeadas por uma unidade de persistência (persistence unit).

em.getTransaction().begin();
// (...)
em.getTransaction().commit();
// (...)
em.getTransaction().rollback();

Estas linhas de código servem para, respectivamente, abrir uma transação, finalizar uma transação, e desfazer uma transação.

usuario = em.merge(usuario);

O método merge() coloca o objeto no estado gerenciado pelo contexto de persistência e o insere, ou atualiza-o, no banco de dados. Ele sempre devolve o objeto atualizado pelo banco de dados.

Usuario ref = em.find(Usuario.class, usuario.getLogin());
em.remove(ref);

O método remove() retira o objeto da gerência do contexto de persistência, o que levará o Hibernate a excluí-lo do banco de dados. Antes de remover o objeto, precisamos atualizar a referência do objeto; senão, uma exceção será lançada pelo EntityManager.

Agora, crie também os arquivos EmpresaDao, ContratoDao, e ContratadaDao, lembrando de colocá-los no mesmo pacote 'javabahia.dao'.

***


public class EmpresaDao {

private EntityManager em;

public EmpresaDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
empresa = em.merge(empresa); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(empresa); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
empresa = em.merge(empresa); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(empresa); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Empresa ref = em.find(Empresa.class, empresa.getCnpj());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select e from Empresa e");
return qry.getResultList();
}

public Empresa obterPorChave(String cnpj) {
Query qry = em.createQuery("select e from Empresa e where e.cnpj = :param1");
qry.setParameter("param1", cnpj);
return (Empresa) qry.getSingleResult();
}
}


***


public class ContratoDao {

private EntityManager em;

public ContratoDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
contrato = em.merge(contrato); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contrato); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
contrato = em.merge(contrato); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contrato); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Contrato ref = em.find(Contrato.class, contrato.getNumero());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select c from Contrato c");
return qry.getResultList();
}

public Contrato obterPorChave(Integer numero) {
Query qry = em.createQuery("select c from Contrato c where c.numero = :param1");
qry.setParameter("param1", numero);
return (Contrato) qry.getSingleResult();
}
}


***


public class ContratadaDao {

private EntityManager em;

public ContratadaDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
contratada = em.merge(contratada); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contratada); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
contratada = em.merge(contratada); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contratada); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Contratada ref = em.find(Contratada.class, contratada.getContratadaPK());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select c from Contratada c");
return qry.getResultList();
}

public Contratada obterPorChave(ContratadaPK pk) {
Query qry = em.createQuery("select c from Contratada c where c.contratadaPK.cnpjempresa = :param1 and c.contratadaPK.numerocontrato = :param2");
qry.setParameter("param1", pk.getCnpjempresa());
qry.setParameter("param2", pk.getNumerocontrato());
return (Contratada) qry.getSingleResult();
}

public List obterPorNumeroContrato(Integer numeroContrato) {
Query qry = em.createQuery("select c from Contratada c where c.contratadaPK.numerocontrato = :param1");
qry.setParameter("param1", numeroContrato);
return qry.getResultList();
}

public List obterPorCnpjEmpresa(String cnpjEmpresa) {
Query qry = em.createQuery("select c from Contratada c where c.cnpjempresa = :param1");
qry.setParameter("param1", cnpjEmpresa);
return qry.getResultList();
}
}


***

Criadas as classes de persistência, vamos agora criar a classe que irá encapsular todo esse subsistema: o Façade. Clique com o botão direito no nosso projeto, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como JavaBahiaFacade e escreva no campo Pacote (Package), o valor 'javabahia'; clique no botão Finalizar (Finish). O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código como é mostrado a seguir:

***


public class JavaBahiaFacade {

   
public JavaBahiaFacade() {
   
}

   
public Usuario obterUsuarioPorLoginSenha(String login, String senha) {
       
UsuarioDao dao = new UsuarioDao();
       
Usuario obj = dao.obterPorLoginSenha(login, senha);
       
dao.close();
       
return obj;
   
}

   
public Usuario obterUsuarioPorLogin(String login) {
       
UsuarioDao dao = new UsuarioDao();
       
Usuario obj = dao.obterPorChave(login);
       
dao.close();
       
return obj;
   
}

   
public List obterTodosUsuarios() {
       
UsuarioDao dao = new UsuarioDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.inserir(usuario);
       
dao.close();
   
}

   
public void atualizarUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.atualizar(usuario);
       
dao.close();
   
}

   
public void excluirUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.excluir(usuario);
       
dao.close();
   
}

   
public Empresa obterEmpresaPorCnpj(String cnpj) {
       
EmpresaDao dao = new EmpresaDao();
       
Empresa obj = dao.obterPorChave(cnpj);
       
dao.close();
       
return obj;
   
}

   
public List obterTodasEmpresas() {
       
EmpresaDao dao = new EmpresaDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.inserir(empresa);
       
dao.close();
   
}

   
public void atualizarEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.atualizar(empresa);
       
dao.close();
   
}

   
public void excluirEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.excluir(empresa);
       
dao.close();
   
}

   
public Contrato obterContratoPorNumero(Integer numero) {
       
ContratoDao dao = new ContratoDao();
       
Contrato obj = dao.obterPorChave(numero);
       
dao.close();
       
return obj;
   
}

   
public List obterTodosContratos() {
       
ContratoDao dao = new ContratoDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.inserir(contrato);
       
dao.close();
   
}

   
public void atualizarContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.atualizar(contrato);
       
dao.close();
   
}

   
public void excluirContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.excluir(contrato);
       
dao.close();
   
}

   
public Contratada obterContratadaPorContratoEmpresa(Integer numeroContrato, String cnpjEmpresa) {
       
ContratadaDao dao = new ContratadaDao();
       
ContratadaPK chave = new ContratadaPK();
       
chave.setNumerocontrato(numeroContrato);
       
chave.setCnpjempresa(cnpjEmpresa);
       
Contratada obj = dao.obterPorChave(chave);
       
dao.close();
       
return obj;
   
}

   
public List obterTodasContratadasPorContrato(Integer numeroContrato) {
       
ContratadaDao dao = new ContratadaDao();
       
List lista = dao.obterPorNumeroContrato(numeroContrato);
       
dao.close();
       
return lista;
   
}

   
public List obterTodasContratadasPorEmpresa(String cnpjEmpresa) {
       
ContratadaDao dao = new ContratadaDao();
       
List lista = dao.obterPorCnpjEmpresa(cnpjEmpresa);
       
dao.close();
       
return lista;
   
}

   
public void inserirContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.inserir(contratada);
       
dao.close();
   
}

   
public void atualizarContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.atualizar(contratada);
       
dao.close();
   
}

   
public void excluirContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.excluir(contratada);
       
dao.close();
   
}
}


***

Com isso, finalizamos o nosso componente Aplicação. Agora nos resta construir o componente Web, o qual será a nossa interface com o exemplo que estamos desenvolvendo. Isso ficará para o próximo post. Até lá!

PS: Os arquivos .java foram disponibilizados no serviço 4Shared mas foram apagados após um tempo de inatividade de minha conta. Por isso, colei o código das classes no meio do texto desse post e retirei os links originais.

domingo, 6 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 2ª parte

Continuando o post anterior, vamos agora à fase de modelagem do banco de dados. Eu usarei o banco MySQL 5, mas você pode usar qualquer outro que seja relacional. Crie um banco (ou esquema) chamado 'javabahia' e, em seguida, crie as tabelas abaixo listadas, adaptando-as para o banco de dados que tiver sido escolhido.

CREATE TABLE usuario (
login varchar(14) NOT NULL,
senha varchar(40) NOT NULL,
nome varchar(60) NOT NULL,
email varchar(100) default NULL,
PRIMARY KEY (login)
);
CREATE TABLE empresa (
cnpj varchar(14) NOT NULL,
nome varchar(60) NOT NULL,
email varchar(100) default NULL,
PRIMARY KEY (cnpj)
);
CREATE TABLE contrato (
numero int(10) unsigned NOT NULL auto_increment,
objeto varchar(100) NOT NULL,
dataassinatura date NOT NULL,
prazovigencia int(10) unsigned NOT NULL,
cadastrante varchar(14) NOT NULL,
PRIMARY KEY (numero)
);
CREATE TABLE contratada (
numerocontrato int(10) unsigned NOT NULL,
cnpjempresa varchar(14) NOT NULL,
codigobanco int(10) unsigned NOT NULL,
agencia varchar(5) NOT NULL,
conta varchar(10) NOT NULL,
PRIMARY KEY (numerocontrato,cnpjempresa)
);
ALTER TABLE contrato ADD CONSTRAINT fk_contrato_usuario FOREIGN KEY fk_contrato_usuario (cadastrante) REFERENCES usuario (login) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE contratada ADD CONSTRAINT fk_contratada_contrato FOREIGN KEY fk_contratada_contrato (numerocontrato) REFERENCES contrato (numero) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE contratada ADD CONSTRAINT fk_contratada_empresa FOREIGN KEY fk_contratada_empresa (cnpjempresa) REFERENCES empresa (cnpj) ON DELETE NO ACTION ON UPDATE NO ACTION;


Agora, vamos adicionar as bibliotecas de classes do Hibernate à IDE Netbeans 6. Vá ao site http://www.hibernate.org/ e baixe os pacotes Hibernate Core e Hibernate Entity Manager, da versão 3. Separe, em uma pasta do seu computador, os seguintes arquivos para serem referenciados posteriormente pelo Netbeans:

hibernate3.jar
hibernate-entitymanager.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
ant-1.6.5.jar
ant-antlr-1.6.5.jar
antlr-2.7.6.jar
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
commons-collections-2.1.1.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
ejb3-persistence.jar
javassist.jar
jboss-archive-browsing.jar
jta.jar


No Netbeans, clique no menu Ferramentas (Tools), Bibliotecas (Libraries). Clique no botão Nova Biblioteca (New Library), digite Hibernate como o nome da biblioteca, e escolha, como o Tipo da Biblioteca (Library Type), Bibliotecas de Classes (Class Libraries). Clique no botão Adicionar JAR (Add Jar/Folder) e aponte para os arquivos que você havia separado anteriormente. Clique em OK para fechar a caixa de diálogo.


Screenshot 1
Ainda é necessário adicionar o driver JDBC do banco de dados escolhido. Pegue o arquivo .jar do driver JDBC do seu banco de dados e separe-o em uma pasta do seu computador. Faça o mesmo processo que fizemos para registrar a biblioteca do Hibernate, colocando o nome do seu banco como o nome da biblioteca. No caso do MySQL, o Netbeans já traz o driver JDBC para esse banco.

Agora poderemos criar o nosso projeto para o componente Aplicação. Vá no menu Arquivo (File), Novo Projeto (New Project). Escolha a categoria Java e o tipo de projeto Biblioteca de Classes Java (Java Class Library); clique no botão Avançar (Next). Dê o nome JavaBahiaApp para o projeto, escolha a localização dele no seu computador e clique no botão Finalizar (Finish).

Clique com o botão direito no projeto recém-criado, e escolha a opção Novo (New), Classes de Entidade do Banco de Dados (Entity Classes from Database). Na caixa de diálogo que se abre, escolha Nova Conexão de Banco de Dados (New Database Connection) na lista de seleção Conexão de Banco de Dados (Database Connection). Escolha na lista Nome (Name) o driver do seu banco de dados, e preencha os demais campos para apontar para o banco que criamos anteriormente. Marque para Lembrar Senha (Remember Password) e clique no botão OK, duas vezes.

O Netbeans listará as tabelas do banco de dados à esquerda. Clique no botão Adicionar Tudo (Add All) e depois no botão Avançar (Next).

Screenshot 2
Escreva no campo Pacote (Package), o valor 'javabahia.entidade', e clique no botão Unidade de Persistência (Persistence Unity). Deixe o nome sugerido pelo Netbeans e escolha Hibernate na lista Biblioteca de Persistência (Persistence Library). Escolha a Estratégia de Geração de Tabelas (Table Generation Strategy) Nenhuma (None), pois já criamos as tabelas anteriormente. Clique no botão Criar (Create).

Screenshost 3
Quando o Netbeans retornar para a caixa de diálogo principal, desmarque a opção Gerar Anotações de Consulta Nomeada para Campos Persistentes (Generate Named Query Annotations for Persistence Fields), e clique no botão Finalizar (Finish). Você deverá estar com o seu projeto como mostra a figura a seguir.

Screenshot 4
Abra as classes para olhar o código que foi gerado pelo Netbeans. As classes Entidades foram geradas a partir das tabelas do banco de dados, e ficaram quase iguais ao nosso modelo de classes de domínio. Não mexeremos nelas nesse momento, para que possamos mostrar os próximos passos. Sugiro a você, leitor, que estude as anotações (annotations) da JPA que foram introduzidas em nossas classes Entidades para aprofundar seus conhecimentos; elas são auto-explicáveis. Leia estes posts sobre JPA (aqui e aqui) do nosso amigo Ramon Lopes, pois eles podem ser úteis.

No próximo post veremos a criação das demais classes do componente Aplicação. Até lá!