JavaEE Exercicios
JavaEE Exercicios
JavaEE Exercicios
2013 e poderá ser usado de acordo com os termos da licença Creative Commons BY-SA (Attribution-
ShareAlike) descrita em http://creativecommons.org/licenses/by-sa/3.0/br/legalcode.
O texto foi elaborado como material de apoio para treinamentos especializados em linguagem Java
e explora assuntos detalhados nas especificações e documentações oficiais sobre o tema, utilizadas
como principais fontes. A autoria deste texto é de inteira responsabilidade do seu autor, que o
escreveu independentemente com finalidade educativa e não tem qualquer relação com a Oracle.
github.com/helderdarocha/javaee7-course
github.com/helderdarocha/CursoJavaEE_Exercicios
github.com/helderdarocha/ExercicioMinicursoJMS
github.com/helderdarocha/JavaEE7SecurityExamples
www.argonavis.com.br
CDD 005.13’3
Exercícios de Java EE 7
4.1 biblioteca-livro-jpa
Objetivo: alterar o exercício anterior e substituir a camada de persistência DAO
por JPA. Para isto o objeto Livro deve ser transformado em uma entidade (através de
anotações @Entity e @Id), e o DAO deve ser implementado com chamadas a
métodos do EntityManager.
A interface não precisa mais declarar as exceções usadas no DAO, portanto pode
ser implementada de forma mais simples (o nome anterior pode ser mantido):
@RequestScoped
public interface LivroService {
Livro findByID(int id);
Livro findByISBN(String isbn);
Collection<Livro> getLivros();
int insert(Livro livro);
void update(Livro livro);
void delete(Livro livro);
}
5.1 biblioteca-livro-ejb
Objetivos: Separar as responsabilidades da camada Web, dados e negócios,
substituindo os comandos por backing beans (CDI) mapeados a propriedades e ações
de formulários JSF, e isolando a camada de dados atrás de uma fachada de serviços
EJB.
Neste exercício, o código dos comandos irá migrar para métodos de um LivroBean
(bean CDI), que também irá conter uma propriedade representando uma entidade
cujos campos serão mapeados a um formulário, para inserção e edição de livros. A
responsabilidade do LivroBean será interligar a camada Web com a camada de
negócios. Ele não irá realizar operações de persistência.
A camada de negócios será implementada através de um EJB Stateless Session
Bean, via interface @Local, que oferece uma fachada de serviços que será injetada (via
@EJB) no LivroBean. O EJB usará o EntityManager para implementar os métodos da
camada de persistência. Como os métodos do EJB serão transacionais por default, seu
código ficará muito mais simples com apenas três classes: Livro (Entity),
LivroJPAService (EJB) e LivroBean (CDI), mais a interface LivroService (EJB).
O diagrama abaixo ilustra a arquitetura da aplicação.
3) (opcional) Fornecer uma (ou mais) fachada de serviços EJB (ex: uma interface
Biblioteca, ou interfaces LivroService, AutorService, etc. para cada entidade) com
uma série de serviços que serão disponibilizados pela camada de negócios. Incluir
listas de livros, autores e editoras, pesquisa por ISBN para livros e operações CRUD.
Este exercício está resolvido no /projeto-parcial.
4) (opcional) Implementar uma interface simples usando JSF e backing beans que
permitam a) inserir novos livros, autores e editoras, b) listar livros, autores e editoras
existentes, c) selecionar autores e editoras existentes na inserção e edição de livros.
Não precisa ser uma interface interativa (pode ser um servlet para criar os livros,
autores e editoras, e uma página XTHML para listar os resultados, como no exemplo
AppWebCorrida). Este exercício está resolvido no /projeto-parcial com uma solução
interativa.
O foco deste exercício é explorar relacionamentos entre entidades, portanto, os
itens 3 e 4 são opcionais (se não quiser criar EJBs e as interfaces JSF e backing beans
aproveite os arquivos disponíveis em /arquivos e /extras.)
A solução proposta tem como objetivo principal ser didática. Fique à vontade para
melhorá-la se desejar.
Construa a aplicação a partir do exercício anterior, ou a partir de um novo projeto.
Opcionalmente aproveite os arquivos HTML e as classes prontas (pasta /arquivos)
ou semi-prontas (pasta /extras), ou ainda o projeto (Maven) parcialmente concluído
em /projeto-parcial. A solução está disponível na pasta /solucao.
Este exercício possui duas partes. A primeira consiste em criar consultas simples e
estáticas, que serão exibidas em uma página. Na segunda parte as pesquisas devem ser
incorporadas na aplicação para filtrar listas de livros, autores, editoras, etc.
a) A primeira parte (/projeto-parte-1) envolve dados estáticos. Veja na página
queries-9.xhml e QueryBean.java as 6 consultas JPQL que devem ser implementadas.
Implemente uma de cada vez e veja os resultados. O único arquivo que precisa ser
alterado é QueryBean.java.
Para testar os resultados é preciso ter dados de teste. Se desejar use a
infraestrutura existente para inserir livros, autores, editoras, ou use os links
disponibilizados para configurar um ambiente de testes na página setup-testes.xhtml.
Um bean (ConfigBean) e um EJB (TestServiceEJB) foram disponibilizados para
esvaziar as tabelas e incluir dados de teste. Esvazie as tabelas e depois aperte o
segundo botão da página setup-testes.xhtml para criar os dados de teste.
Observação: como não foi implementado mapeamento de cascade entre Livro,
Autor, Editora e Exemplar, a remoção das entidades em setup-testes.xhtml precisa ser
feita em ordem: primeiro Autor, depois Livro, Exemplar, Editora. Fica como
exercício implementar o cascade-delete para evitar esse problema (aproveite e
implemente também o cascade-persist e merge, e depois simplifique o código no
TestServiceEJB.java onde indicado.)
b) Na segunda parte (/projeto-parte-2) devem ser implementadas pesquisas
interativas.
1) Incluir um campo de texto na lista de autores para filtrar pelo nome.
2) Incluir um campo de texto na lista de editoras para filtrar pelo nome.
3) Incluir campos de texto na lista de assuntos para filtrar pela descrição e pelo
código, além de um menu para selecionar qual índice usar. (resolvido)
4) Incluir campos de texto na lista de livros para filtrar pelo título, autor, editora e
assunto, e um menu para filtrar pelo idioma. (resolvido)
A pesquisa deve alterar a lista de itens exibidos em tempo real (com delay de um
segundo, para campos de texto, portanto é preciso que os componentes usem Ajax,
renderizem novamente a tabela para cada alteração, e que os beans preservem o
estado dos dados durante as várias requisições que durar a pesquisa (use
@ConversationScope)
Nesta versão estão resolvidos os exercícios 3 e 4 acima, que usam a API Criteria.
Não deixe de analisar o código das classes e páginas envolvidas para entender o seu
funcionamento, antes de tentar fazer os outros. As classes incluem EJBs (onde são
implementados os queries JPQL ou Criteria – veja apostila de JPA) e managed beans
(onde as consultas são delegadas para EJBs, e dados são mapeados a formulários e
componentes JSF). As páginas são acopladas aos managed beans onde os
componentes são mapeados. Veja mais informações sobre os componentes usados e o
uso de <f:ajax> na apostila de JSF.
Para os exercícios desta seção (1 e 2) os arquivos a serem alterados são AutorBean,
EditoraBean, AutorEJB, EditoraEJB, autores.xhtml, editoras.xhtml. Procure as
indicações (comentários) em cada arquivo para mais detalhes, e use os exercícios
resolvidos como modelo.
A solução destes exercícios está em /solucao. Se você achar que o exercício está
muito simples e quiser um desafio maior, use como ponto de partida a solução do
exercício anterior.