• Nenhum resultado encontrado

Aula 13

N/A
N/A
Protected

Academic year: 2021

Share "Aula 13"

Copied!
9
0
0

Texto

(1)

Servidores de Aplicação

Aula 13

(2)

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.

(3)

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.

(4)

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

(5)

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:

(6)

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

(7)

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()));

(8)

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

(9)

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.

Referências

Documentos relacionados

Este caráter deletério do hábito de presentear juízes ao procedimento jurídico foi claramente percebido e argumentado por Pierre Coustau, pois seu 39º

RESUMO: O presente trabalho tem por objetivo analisar a fábula “O gavião e o rouxinol”, presente na obra de Hesíodo Os Trabalhos e os Dias, destacando a intenção

Se por alguma razão você não puder comparecer ao médico para fazer uso da medicação na data marcada, o ERANFUL ® pode ser administrado 3 dias antes ou 3 dias depois desta data.

E) CRIE NO SEU CADERNO UM TÍTULO PARA ESSA HISTÓRIA EM QUADRINHOS.. 3- QUE TAL JUNTAR AS SÍLABAS ABAIXO PARA FORMAR O NOME DE CINCO SUGESTÕES DE PRESENTE PARA O DIA

É o nome usado para descrever empresas que prestam serviços financeiros, tendo na tecnologia seu grande diferencial — muitas delas, inclusive, não têm agências para atender

Quando um atributo não é composto, recebe um valor único como nome, por exemplo e não é um atributo chave, então ele será atributo simples.. Banco de Dados – Professor

Antes de mostrarmos a rela¸ c˜ ao entre regularidade de uma curva e existˆ encia de reparametriza¸c˜ oes por comprimento de arco dessa curva, notemos uma propriedade sim- ples

A tabela Empregado está na 1FN porque possui apenas atributos simples e monovalorados. Apenas o atributo Horas_Trabalhadas é funcionalmente dependente da chave primária completa.