Você está na página 1de 11

PROJETO AGENDA

Bem vindo ao projeto Agenda. Ele é dedicado a construir um framework básico para JEE6,
utilizando as tecnologias mais importantes desta plataforma, como JPA, JSF, EJB, JAAS, etc. O
objetivo é didático, ou seja, pretende servir como material prático para o aprendizado de
programação Java para WEB, podendo ser utilizado tanto para laboratórios presenciais bem como
para estudo a distância (EAD).

Requisitos de Programas
IDE

Você deve ter o netbeans 6.9.1 ou maior (deve funcionar em versões a partir de 6.8): Opte pela
instalação completa (Isto exige que voce possua uma versão atualizada de Java SDK, estamos
utilizando o jdk 1.6.0_18 da Oracle (ex Sun). Observe que as subversões de 1921 estão causando
problemas no editor visual do netbeans, deve ser sanado a partir da 22 ou 23). Inicialmente nosso
banco de dados será o JavaDB, e o servidor de aplicações o Glassfish v3 (ambos acompanham a
versão completa do netbeans 6.9.1).

Controle de Versão
Você deve possuir o mercurial (hg) instalado. Recomendo visitar a seguinte página da documentação
do bitbucket: Getting Started with Bitbucket.
O PROJETO
O projeto será construído e disponibilizado no bitbucket, via mercurial. Um estudande pode clonar o
repositório e acompanhar o projeto com desejar. Neste caso, sugerimos armazenar o projeto clonado
dentro de uma pasta chamada BitBucket. (i.e.: NetBeansProjects/BitBucket/agenda).

Ao mesmo tempo, o projeto poderá ser construído passo a passo. Desta forma, é possível comparar
as versões, verificando uma contra a outra a qualquer momento.

Alternativas para obter o projeto

Algumas pessoas têm dificuldade para obter o projeto, por desconhecerem o mercurial. Alguns
pontos devem ser compreendidos, com relação ao papel de cada um relativo ao projeto:

 Estudantes: Para utilizar o projeto como uma forma de estudar e treinar as tecnologias
abordadas, estudantes podem e devem seguir os passos deste tutorial criando o projeto do nada.
podem atuar como usuarios, possuindo uma cópia do projeto localizada em uma pasta separada da
pasta de estudo.
 Usuários: Para rodar o projeto verificando suas funcionalidades, devem obter uma cópia
não versionada do projeto. Veja mais abaixo instruções de como obter esta cópia.
 Desenvolvedores: Devem ser registrados como desenvolvedores no projeto, e possuir uma
pasta clonada do projeto, ou seja, na hierarquia do mercurial, podemos dizer que devem possuir um
repositório local do projeto, que pode e deve sofrer alterações. Em algum momento conveniente
estas alterações podem ser empurradas (push) para o repositório original. EStude os comandos do
mercurial para saber como clonar e atualizar o repositório do projeto.
Para obter uma cópia não versionada do projeto: Visite o projeto Agenda no Bitbucket. Na aba
Overview, posicione o cursor sobre get source (que está no canto superior direito da referida aba), e
selecione uma opção de arquivo (.zip, .tar ou .bz2). Desta forma será feito um download do projeto
atualizado. Salve em uma pasta conveniente e abra o projeto no netbeans.
COMEÇANDO A CODIFICAR
Normalmente, em qualquer sistema operacional, o Netbeans armazena os projetos em uma pasta
padrão, denominada NetBeansProjects.

Com o Netbeans, crie um novo projeto, categoria Java EE, projeto do tipo Enterprise Application.

Pressione Next para o próximo diálogo.

No diálogo Name and Location: Project Name: Agenda Project Location:


<...>/NetBeansProjects/agenda Project Folder: <...>/NetBeansProjects/agenda/Agenda

Observe o folder: <...> significa o caminho em sua máquina até a pasta NetBeansProjects. Usuários
de windows devem trocar o simbolo / (barra) por \(contra barra).

Sete a caixa de diálogo "Use dedicated folder to store libraries".

faça: Libraries Folder: ../lib

Observe os .. (dois pontos). Isto fará com que as bibliotecas fiquem armazenadas na pasta lib, que
estará uma pasta acima da pasta Agenda, na hierarquia de pastas, ou seja, ao lado da pasta Agenda,
ambas dentro da pasta agenda (minusculo).

Pressione Next para o próximo diálogo.

No diálogo Server and Settings, faça:

Server: Glassfish Server v3 (deve estar selecionado por padrão).

Java EE version: Java EE 6 (idem).

Sete (marque com x):

Create EJB Module: Agenda-ejb Create WEB Application Module: Agenda-war.

Deixe o resto como está.

Pressione Finish.

Desta forma um projeto do tipo empresarial foi criado. Voce pode adquirir algumas noções iniciais
sobre projetos java empresariais vistando o documento NetBeans IDE 6.9 Features, lendo sobre ava
Enterprise Edition 6. Um projeto empresarial envelopa outros projetos, denominados modulos, em
nosso caso, a saber, modulo EJB e modulo WEB. Em seguida, iniciaremos a codificação de nossa
primeira Entidade.
JavaBean
Segundo a wikipedia, " ... são classes escritas de acordo com uma convenção em particular. São
usados para encapsular muitos objetos em um único objeto (o bean), assim eles podem ser
transmitidos como um único objeto em vez de vários objetos individuais. O JavaBean é um Objeto
Java que é serializavel, possui um construtor nulo e permite acesso às suas propriedades através de
métodos getter e setter". Por obedecer esta convenção, várias ferramentas ou classes especiais
conseguem manipular genéricamente java beans. Reflection é fundamental e eficiente. Estude mais
sobre o assunto em java beans na wikipedia.
EJB (Enterprise JavaBean)
Segundo a wikipedia, "EJB ou Enterprise JavaBeans é um dos principais componentes da plataforma
J2EE (Java 2 Enterprise Edition). É um componente do tipo servidor que executa no container do
servidor de aplicação. Os principais objectivos da tecnologia EJB são fornecer um rápido e
simplificado desenvolvimento de aplicações Java baseado em componentes distribuídas,
transacionais, seguras e portáveis". É uma tarefa difícil controlar a visibilidade de uma classe em um
ambiente distribuído (quem vê o que, e quando). Bancos de dados já implementam transações por
padrão, mas e dados em classes? Autenticar e autorizar usos (segurança) é outra dificuldade.
Finalmente, permitir que classes trafeguem entre vários servidores também é complexo. EJB é uma
tecnologia que facilita estas implementações. Atualmente (versão 3.1) graças ao uso
de annotations programar com EJB está bem mais simples. Estude mais sobreEJB na wikipidia.
POJO é uma sigla que em ingles significa pure old java object (simples e bom velho objeto java).
Entidades são POJO incrementadas com anotações (annotations) que indicam classes a serem
persistidas via algum ORM, do ingles object relational manager (gerenciador objeto relacional), que
associam transparentemente objetos a tabelas em um banco de dados relacional. O presente trabalho
adota o padrão JPA, java persistence API (API de persistência do java). A princípio utilizaremos
como implementação o eclipseLink (que atende o padrão JPA 2.0).
Criando uma unidade de persistência
Com o projeto Agenda aberto (setado como projeto principal e com todos os módulos (ou
dependências no caso) abertos, expanda o módulo Agenda-ejb na árvore de projetos, conforme pode
ser visto na Figura 1.

Figura 1: Árvore do projeto Agenda


Clique com o botão direito do mouse sobre o nó do projeto Agenda-ejb, e no menu que se abre
selecione Nova, e no novo menu que se abre, selecione Unidade de Persistência (caso a opção não
esteja visível, busque-a em Outros, mais abaixo no mesmo menu: Este menu armazena as opções
mais frequentemente utilizadas).
No diálogo Nova Unidade de Persistência que se abre, faça:

Nome da unidade de persistência = Agenda-ejbPU

Provedor de persistência = EclipseLink(JPA 2.0)(default)

Fonte de dados = jdbc/sample

Devem estar checados:

Utilize a API de transações do Java

Estratégia de geração de tabelas: Criar

Acione Finalizar.

A unidade de persistência foi criada.

Codificando a Entidade Pessoa


Na figura 2 um diagrama de classe contendo a entidade Pessoa é mostrado. Vamos ver os passos
para codificar Pessoa.java em seguida.

Figura 2: Diagrama da entidade Pessoa


Clique com o botão direito do mouse sobre o nó do projeto Agenda-ejb, e no menu que se abre
selecione Nova, e no novo menu que se abre, selecione Entidade de Classe (caso a opção não esteja
visível, busque-a em Outros, mais abaixo no mesmo menu: Este menu armazena as opções mais
frequentemente utilizadas.
No diálogo Nova Entidade de Classe que se abre, faça:

Nome da classe = Pessoa

Pacote = entities
Tipo da chave primária: Long

Acione Finalizar.

A entidade Pessoa foi criada.

Agora, é necessário realizar ajustes e adicionar propriedades a entidade Pessoa.

Delegando a geração de chaves sequenciais para o banco de dados

Na árvore do projeto, clique com o botão direito do mouse em Agenda > Agenda-ejb > Pacotes de
código fonte > entities > Pessoa.java. No menu que se abre, opte por abrir a entidade.

Observe que o código básico da entidade já está presente.

Localize, logo no início, a anotação @GeneratedValue e altere o


parâmetro GenerationType para IDENTITY. Com este valor o parâmetro faz com que o JPA
solicite ao banco de dados para criar uma chave ID do tipo sequencial. Deverá ficar assim:
1 @Id
2 @GeneratedValue(strategy = GenerationType.IDENTITY)
Adicionando parâmetros
Pode-se utilizar o diálogo Adicionar Propriedade, aionando o botão direito do mouse sobre o
código, no menu que se abre escolherInserir Código, e no menu que se abre, escolhendo Adicionar
Propriedade.

Para melhor clareza do código, sugerimos acionar o botão direito na linha em branco imediatamente
acima do trecho:

1 @Override
2 public int hashCode() {

Faça:

Nome = nome

Tipo = String

cheque: Protected, Gerar getter e setter, Bound e Gerar suporte a mudança de propriedade (este
último será feito apenas uma vez, quando gerar a primeira propriedade da classe, no caso nome).

Após isto, recomenda-se ajustar o código, movendo algumas linhas para junto da declaração da
classe, de forma que as propriedades fiquem imediatamente visíveis. O código ficará assim:

1 @Entity
2 @NamedQueries({
3 @NamedQuery(name = "Pessoa.findAll",
4
5
6
7
8 query = "SELECT p FROM Pessoa p ORDER BY p.nome")})
9 public class Pessoa implements Serializable {
1 private static final long serialVersionUID = 1L;
0 @Id
1 @GeneratedValue(strategy = GenerationType.IDENTITY)
1 private Long id;
1 @NotNull
2 protected String nome;
1 public static final String PROP_NOME = "nome";
3 @Transient
1 private PropertyChangeSupport propertyChangeSupport = new
4 PropertyChangeSupport(this);
Para adicionar a anotação @Transient acima da declaração do
identificador propertyChangeSupport, como aparece no final do código acima, insira uma nova
linha sobre a declaração, digite @Tran (arroba e o início da palavra Transient), pressione ctrl +
espaço (para acionar a funcionalidade de compleição de código), e escolha Transient na sugestão de
classes que aparece. O código pode ser simplemente digitado, mas neste caso, a IDE vai solicitar a
indicação da classe correta da anotação para realizar o import conveniente. Ao utilizar compleição
de código, a importação é gerada automáticmante. A anotação Transient indica ao JPA que a
propriedade deve existir somente na classe, ou seja, não deve ser persistida na tabela do banco de
dados.
O código pode ser simplemente digitado, mas neste caso, a IDE vai solicitar a indicação da classe
correta da anotação para realizar oimport conveniente. Ao utilizar compleição de código, a
importação é gerada automáticmante. A anotação Transient indica ao JPA que a propriedade deve
existir somente na classe, ou seja, não deve ser persistida na tabela do banco de dados.
Para adicionar a anotação @NotNull acima da declaração do identificador nome, como aparece no
código acima, insira uma nova linha sobre a declaração, digite @NotN (arroba e o início da
expressão NotNull), pressione ctrl + espaço (para acionar a funcionalidade de compleição de
código), e escolha NotNull na sugestão de classes que aparece, cuidando para especificar a classe
chamadajavax.validation.constraints.NotNull.
A API para Beans Validation do Java provê um mecanismo para validar dados de uma
aplicação. Beans Validation é integrada ao container Jave EE, permitindo que a mesma lógica de
validação seja utilizada em todas as camadas da aplicação empresarial. A anotação@NotNull é um
exemplo de utilização, especificando que o dado nome não pode ser persistido sem valor.
Haja de maneira semelhante para adicionar as anotações NamedQueries, NamedQuery e
parâmetros. Observe que existe auxílio de compleição de código para parâmetros de anotações.

No futuro novas propriedades serão adicionadas, mas no momento ficará assim. Salve o código.

Criando o EJB PessoaBean


Clique com o botão direito do mouse sobre o nó do projeto Agenda-ejb, e no menu que se abre
selecione Novo, no menu que se abre selecione Session Bean.
No diálogo Novo Session Bean que se abre, faça:
Nome do EJB = PessoaBean

Pacote: ejb

Marque Stateless para Tipo de Sessão.

Não selecione nenhuma das opções em Criar Interface (funcionalidade do EJB 3.1 para criar
Stateless ejb's).

Acione Finalizar.

Inicie a edição de PessoaBean.

Acione o botão direito do mouse abaixo da linha que diz:

1 // "Insert Code > Add Business Method")


Nas opções que se oferecem, selecione Insert Code > Add Business Method.
No diálogo Add Business Method que se abre, faça:

Name = retrievePessoas

Return Type = List<Pessoa>

Acione OK.

Complete o código para que fique da seguinte forma:

1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5 package ejb;
6
7 import entities.Pessoa;
8 import java.util.List;
9 import javax.ejb.Stateless;
1 import javax.ejb.LocalBean;
0 import javax.persistence.EntityManager;
1 import javax.persistence.PersistenceContext;
1 import javax.persistence.Query;
1
2 /**
1 *
3 * @author duo
1 */
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2 @Stateless
6 @LocalBean
2 public class PessoaBean {
7
2 // Add business logic below. (Right-click in editor and choose
8 // "Insert Code > Add Business Method")
2 @PersistenceContext
9 private EntityManager em;
3
0 public List<Pessoa> retrievePessoas() {
3 Query query = em.createNamedQuery("Pessoa.findAll");
1 return query.getResultList();
3 }
2 }

Acione o botão direito do mouse abaixo do método retrivePessoas (que acabou de ser criado).

Nas opções que se oferecem, selecione Insert Code > Add Business Method.
No diálogo Add Business Method que se abre, faça:
Name = persist

Return Type = void

Na aba Parameters logo abaixo acione o botão Adicionar.

Na linha que se oferece, faça:

Name = object

Type = Object

Acione OK.

Complete o código para que fique da seguinte forma:

1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5 package ejb;
6
7 import entities.Pessoa;
8 import java.util.List;
9 import javax.ejb.Stateless;
1 import javax.ejb.LocalBean;
0 import javax.persistence.EntityManager;
1 import javax.persistence.PersistenceContext;
1 import javax.persistence.Query;
1
2 /**
1 *
3 * @author duo
1 */
4 @Stateless
1 @LocalBean
5 public class PessoaBean {
1
6 // Add business logic below. (Right-click in editor and choose
1 // "Insert Code > Add Business Method")
7 @PersistenceContext
1 private EntityManager em;
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2 public List<Pessoa> retrievePessoas() {
3 Query query = em.createNamedQuery("Pessoa.findAll");
3 return query.getResultList();
3 }
4
3 public void persist(Object object) {
5 em.persist(object);
3 }
6 }

Criando o Managed Bean PessoaManagedBean


Clique com o botão direito do mouse sobre SourcePackages, no nó do projeto Agenda-war, e no
menu que se abre selecione Novo, no menu que se abre selecione JSF ManagedBean.

No diálogo que se abre, faça:


Class Name = PessoaManagedBean

Package = managedBeans

Scope: Selecione session na caixa de combinação.


Pressione o botão Finish.

Você também pode gostar