Servidores de Aplicação
Aula 13
Este material é parte integrante da disciplina oferecida pela UNINOVE.
O acesso às atividades, conteúdos multimídia e interativo, encontros virtuais, fóruns de discussão e a comunicação com o professor devem ser feitos diretamente no ambiente virtual de aprendizagem UNINOVE.
Uso consciente do papel.
Aula 13: Exercício de JPA – Parte I
Objetivo: Fazer um exercício em duas aulas, que demonstre o uso da API JPA,
utilizando o modelo MVC e conceitos de aplicativos distribuídos.
Introdução
Para demonstrar o uso da JPA, este exercício define um EJB que será o responsável para permitir o acesso de clientes remotos ao modelo de dados. Seguindo o modelo MVC, este exercício terá uma classe de entidade, que será o mapa Objeto/Relacional. Ele está situado na camada Model. Para usar esse componente, haverá um EJB, situado na camada Controller, que conectará o cliente (aplicativo Desktop) na camada View, à classe de entidade.
Criando a classe de entidade Cliente
O primeiro passo para este exercício é criar um módulo EJB, seguindo as seguintes etapas: “Novo -> Java EE -> Módulo EJB”. Dê um nome para o projeto (Neste exercício, ModuloJPA) e vá para a próxima tela. Defina as informações do servidor de aplicações: Glassfish 3 e Java EE 6 e clique em finalizar; isso fará com que a área de trabalho fique com a aparência da Figura 1.
Clique no ícone e nas opções “Novo -> Classe da Entidade” para adicionar uma ao projeto, com o nome Cliente. Nesse processo, pode ser que o Netbeans solicite a criação de uma nova fonte de dados. Para demonstração, no vídeo anexo à aula, é criada uma nova, mas é possível usar uma já existente. Essa fonte de dados é o provedor mencionado anteriormente, que permite que aplicação manipule as bases de dados.
Ao finalizar esse procedimento, serão criados os arquivos “Cliente.java” e “persistence.xml”. O passo seguinte é criar os atributos da classe cliente, conforme o código a seguir:
@Id
@GeneratedValue(strategy = GenerationType.AUTO) @Column(name="CD_CLIENTE")
private Long id; private String nome; private Integer telefone;
@Temporal(javax.persistence.TemporalType.DATE) private java.util.Date dataCadastramento;
Neste código, foram usadas quatro anotações: @Id (determina que o atributo id é uma chave primária na tabela); @GeneratedValue (determina que o atributo é uma chave primária gerada automaticamente pelo banco de dados); @Column (determina que o atributo id é a coluna CD_CLIENTE na tabela); e, @Temporal (converte automaticamente o valor de data no formato de Java para o formato padrão do banco de dados, sem que seja necessário escrever um código para isso).
Ao analisar o código-fonte gerado pelo Netbeans para essa classe de entidade, observe a instrução “private static final long serialVersionUID = 1L;”. Esse atributo da classe é o que define identificar a unicidade dessa classe, o que já foi mencionado antes.
Depois, deve-se adicionar os métodos getters e setters relacionados aos atributos da classe Cliente. Para isso, na linha acima do método “public Long getId()”, clique com o botão direito do mouse, e selecione “Inserir Código”, e
selecione a opção “Getter e Setter” no menu que se abre. Na tela seguinte, indique que a criação dos métodos getter e setter para os demais atributos da classe Cliente, e clique em Gerar. Isso fará com que mais código seja criado automaticamente para essa classe.
Escrevendo o session bean
Nesta aplicação, o session bean será o responsável por controlar o uso das classes de entidade para as tarefas de criação, atualização e remoção de clientes da base de dados, por meio da API de persistência, a verdadeira responsável por controlar os acessos ao banco de dados.
Para criar o bean de sessão, siga os mesmos passos da aula anterior para que a área de trabalho fique similar ao que é apresentado na Figura 2.
Figura 2 – Área de trabalho após adição do session bean.
Após alterar o arquivo “ClienteBean.java”, o código dele deve ser semelhante a esta listagem:
@Stateless
public class ClienteBean implements ClienteBeanLocal, ClienteBeanRemote { @PersistenceContext(name = "ModuloEJBPU")
EntityManager em;
public void cadastrarCliente(String nome, Long id, Integer telefone, Date data){ Cliente cli = new Cliente();
cli.setNome(nome); cli.setId(id); cli.setTelefone(telefone); cli.setDataCadastramento(data); } }
Depois, altere o arquivo “ClienteBeanRemote.java” para que ele tenha o seguinte código-fonte:
@Remote
public interface ClienteBeanRemote {
public void cadastrarCliente(String nome, Long id, Integer telefone, Date data); }
Clique no ícone com o botão direito do mouse e use a opção
instalar, a qual gerará o componente e o instalará no servidor de aplicações. Como resultado, será criada a tabela no banco de dados e o servidor será configurado para receber as conexões remotas.
Testando o bean de sessão com um aplicativo desktop
Aqui, criaremos novamente um aplicativo Desktop, igual ao que foi feito anteriormente. Para isso, clique no ícone “Novo Projeto -> Java -> Aplicativo Java”; dê um nome para o projeto (neste exercício, “Desktop”). Isso criará um novo projeto com o arquivo “Desktop.java” e seu método main.
Depois que o projeto tiver sido criado, adicione o projeto “ModuloJPA” e o arquivo “gf-client.jar” às bibliotecas do projeto, conforme os passos já descritos. Por fim, crie um arquivo de propriedade com o nome “jndi.properties” com as propriedades de conexão remota. O conteúdo desse arquivo não muda em relação ao que já foi feito. Isso fará com que o projeto do aplicativo Desktop tenha aparência da Figura 3.
Figura 3 – Área de trabalho do projeto Desktop.
O passo seguinte é alterar o arquivo “Desktop.java” para que ele tenha o seguinte código da listagem:
public static void main(String[] args) { try {
Properties props = new Properties();
props.load(new FileInputStream("jndi.properties")); InitialContext ctx = new InitialContext(props);
ClienteBeanRemote testeEJB = (ClienteBeanRemote)
ctx.lookup("beans.ClienteBeanRemote");
testeEJB.cadastrarCliente("Anselmo", Long.valueOf("1"), 5462345, new Date(System.currentTimeMillis()));
System.out.println("Cadastrou Anselmo");
testeEJB.cadastrarCliente("Duarte", Long.valueOf("2"), 5462345, new Date(System.currentTimeMillis()));
System.out.println("Cadastrou Duarte");
testeEJB.cadastrarCliente("Maria", Long.valueOf("3"), 5462345, new Date(System.currentTimeMillis()));
System.out.println("Cadastrou Maria");
testeEJB.cadastrarCliente("Roberta", Long.valueOf("4"), 5462345, new Date(System.currentTimeMillis()));
System.out.println("Cadastrou Roberta");
testeEJB.cadastrarCliente("Marcos", Long.valueOf("5"), 5462345, new Date(System.currentTimeMillis()));
System.out.println("Cadastrou Marcos");
testeEJB.cadastrarCliente("Aurélia", Long.valueOf("6"), 5462345, new Date(System.currentTimeMillis()));
System.out.println("Cadastrou Anselmo"); } catch (NamingException nex) {
nex.printStackTrace();
} catch (FileNotFoundException fnfex) { fnfex.printStackTrace();
} catch (IOException ioex) { ioex.printStackTrace(); }
}
Neste cliente, a instrução “ClienteBeanRemote testeEJB =
(ClienteBeanRemote) ctx.lookup("beans.ClienteBeanRemote");” declara o EJB que será acessado pelo cliente desktop e cada linha com a instrução “testeEJB.cadastrarCliente” adiciona um cliente ao banco de dados. Depois de terminar a alteração deste arquivo, o aplicativo pode ser testado.
No primeiro teste, apesar de aparecerem as mensagens de usuários cadastrados, após a verificação no banco de dados, percebeu-se que a inserção deste não funcionou.
Isso aconteceu porque no bean de sessão foi criado o contexto de persistência, o gerenciador de entidades, o método “cadastrarCliente” que atualiza os dados do objeto na memória, contudo faltou a instrução que efetiva a inserção dos dados na base.
Para fazer isso, no método “cadastrarCliente”, após a instrução
“cli.setDataCadastramento(data);” adicione a instrução “em.persist(cli);”. O método persist é que ativa o mecanismo de inserção de dados da JPA. Assim, após
adicionar essa instrução ao EJB, clique no ícone e execute as opções “Limpar e Construir” e depois a opção “Implantar”. Isso é necessário para atualizar o EJB no servidor de aplicações. Depois que ele tiver sido instalado, execute novamente o aplicativo Desktop, e veja que a inserção desses dados funcionou e confira no banco de dados.
* O QR Code é um código de barras que armazena links às páginas da web. Utilize o leitor de QR Code de sua preferência
para acessar esses links de um celular, tablet ou outro dispositivo com o plugin Flash instalado.
REFERÊNCIA
KEITH, Mike.; SCHINCARIOL, Merrick. EJB 3 Professional: Java Persistence API. EUA: A Press, 2008.