Este documento apresenta um exemplo de uso de padrões J2EE em uma arquitetura de sistema de auto-escola, descrevendo quatro padrões (Intercepting Filter, Business Delegate, Session Facade e Data Access Objects) e como eles são aplicados nas camadas de apresentação, negócio e integração de acordo com as boas práticas J2EE Blueprints.
Padrões de projeto - Adapter, Proxy, Composite e Bridge
Artigo Padrões J2EE: Um exemplo de uso
1. Padrões J2EE: Um exemplo de uso
Erivan de Sena Ramos1, Pedro Henrique Pereira1
1
Universidade Estadual do Ceará (UECE)
Fortaleza – CE – Brasil
erivansr@gmail.com, pedrohenripereira@gmail.com
Abstract. This paper presents an example of using J2EE patterns in a software
project, identifying the improvements in the development and implementation
of software using the of good J2EE Blueprints, featuring a modeling system
that uses this platform.
Resumo. Este trabalho apresenta um exemplo de uso dos Padrões J2EE em
um projeto de software, identificando as melhorias no desenvolvimento e na
implementação de um software com a utilização das boas práticas J2EE
Blueprints, destacando a modelagem de um sistema que utiliza essa
plataforma.
1. Introdução
A Sun Microsystems (2011) apresenta o Java 2 Enterprise Edition (J2EE), como
uma plataforma que define um padrão para o desenvolvimento de aplicações
empresariais distribuídas e multicamadas. O J2EE estabeleceu um novo modelo para o
desenvolvimento de aplicações distribuídas. O modelo é baseado em componentes bem
definidos. Este modelo é destinado tanto para padronizar, quanto para simplificar os
diversos tipos de aplicações distribuídas existentes atualmente.
Marinescu (2002) indica que, sem um conjunto de boas práticas de modelagem,
o desenvolvimento utilizando a arquitetura multicamadas J2EE pode se tornar muito
difícil. Alur et al. (2002) complementa que uma boa maneira de adquirir experiência em
projeto é pela utilização de padrões que se constituem em um moderno e importante
mecanismo para a elaboração de projetos orientados a objetos.
Este trabalho apresenta a arquitetura do sistema de uma Auto-Escola, utilizando
uma arquitetura multicamadas baseado no J2EE, descrevendo e justificando a
aplicabilidade de quatro padrões, englobando as três camadas de uma aplicação web, de
acordo com as boas práticas J2EE Blueprints (apresentação, negócio e integração). Cada
padrão segue a estratégia aplicada, incluindo diagrama de classes e trecho do código
fonte do exemplo.
2. Plataforma Java 2 Enterprise Edition (J2EE)
Júnior (2003) leciona que a Plataforma J2EE é um conjunto de especificações
para acesso a diversos serviços de infraestrutura, tais como segurança, distribuição de
processamento, controle de transações, comunicação entre camadas e outros. Estas
especificações são implementadas por diversos fornecedores, que competem entre si
para oferecer serviços de melhor qualidade e preços mais competitivos.
2. Júnior (2003) indica ainda que dessa forma, uma das grandes vantagens da
Plataforma J2EE é que as aplicações podem acessar os serviços oferecidos de forma
independente de fornecedor. As organizações que adotam esta plataforma possuem
considerável liberdade de escolha, podendo determinar o fornecedor mais adequado para
a sua situação. Além disto, os desenvolvedores podem concentrar esforços na lógica
específica do negócio, pois as funções de infraestrutura são disponibilizadas pela
Plataforma J2EE, potencialmente gerando ganhos de produtividade consideráveis. A
Figura 1 ilustra o conceito.
Figura 1. Plataforma J2EE (JÚNIOR, 2003)
As aplicações acessam serviços como controle de transações ou acesso remoto
através das especificações contidas na Plataforma J2EE, implementadas por algum
fornecedor. A implementação da plataforma, no entanto, pode ser trocada sem
significativas alterações do código das aplicações, já que todo o acesso às
funcionalidades da plataforma é feito através de especificações padronizadas.
2. J2EE Blueprints
O J2EE é um conjunto de procedimentos recomendados para desenvolver
aplicações J2EE, e divide as aplicações em camadas. Os padrões J2EE representam
soluções consideradas melhores práticas para implementar vários componentes
essenciais em cada uma das camadas identificadas pelo J2EE Blueprints. Os padrões são
dispostos em três camadas: Apresentação, Negócios e Integração.
Schneide (1999) indica que em termos de orientação a objetos, a utilização de
padrões é importante porque identificam classes, instâncias, seus papéis, colaborações e
distribuição de responsabilidades. São, portanto, descrições de classes e objetos que se
comunicam, implementados a fim de solucionar um problema comum em um contexto
específico.
Alur et al. (2002) lista as vantagens de se utilizar padrões em um projeto:
a) foram testados: refletem a experiência e conhecimento dos desenvolvedores
que utilizaram estes padrões com sucesso em seu trabalho;
b) são reutilizáveis: fornecem uma solução pronta que pode ser adaptada para
diferentes problemas quando necessário;
c) são expressivos: formam um vocabulário comum para expressar grandes
soluções sucintamente;
3. d) facilitam o aprendizado: reduzem o tempo de aprendizado de uma
determinada biblioteca de classes. Isto é fundamental para o aprendizado dos
desenvolvedores novatos;
e) diminuem retrabalho: quanto mais cedo são usados, menor será o retrabalho
em etapas mais avançadas do projeto.
3. Arquitetura do Sistema
Para exemplificar o uso dos Padrões J2EE, este trabalho apresenta arquitetura de
um sistema de Auto-Escola, destacando a aplicabilidade de quatro padrões: Intercepting
Filter, Business Delegate, Session Facade, e Data Access Objects. Cada um destes
padrões engloba uma das três camadas de uma aplicação web (Apresentação, Negócio e
Integração), de acordo com as boas práticas J2EE Blueprints.
O sistema em questão tem por finalidade controlar e automatizar os processos de
sua auto-escola desde cadastros e matrículas a acompanhamentos de aulas práticas e
teóricas. Cadastrar os alunos nas aulas práticas e realizar reservas das aulas práticas. O
sistema emite relatórios de todas as movimentações de aulas práticas e teóricas por
alunos, acompanhamentos dos resultados exames junto ao Departamento de Trânsito.
Também é possível obter relatórios de movimentações financeiras, além de poder
acompanhar custos por veículo ou por aluno, entre outros relatórios e estatísticas
emitidos pelo sistema.
Para este trabalho são apresentadas somente algumas funcionalidades do sistema
que utilizam os padrões citados. Para cada padrão, segue a sua estratégia aplicada
incluindo diagrama de classes e trecho do código fonte. As classes definidas para o
sistema, e apresentadas neste trabalho são separadas em pacotes, sendo eles: web;
cliente, ejb e dao.
Cada um destes pacotes pertence a uma camada do sistema e contém os padrões
de projeto para estas camadas.
5. 3.1.1 Pacote Web
Este pacote contém a implementação de um Intercepting Filter, que verifica a
cada solicitação se o usuário efetuou a autenticação;
a) AcompanhamentoProcesso: contém os processos de pedido de habilitação. A
partir dela serão solicitadas as ações possíveis dentro de um processo de
habilitação, como agendamentos de aula, pagamentos de taxas e
acompanhamento do processo;
b) AutenticacaoFilter: é o Intercepting Filter para verificar, em todos os acessos, se
o usuário efetuou a autenticação na aplicação. No caso do exemplo, faz-se uso
da estratégia de implementação StandardEncodeFilter, deixando o controle do
filtro a cargo da especificação do Servlet, Servlet 2.3 Specification.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain
chain) throws IOException, ServletException {
boolean permitido = verificaAcesso((HttpServletRequest) request);
if (!permitido) {
String logon = "logon.jsp?next=" + getNextURL((HttpServletRequest)
request);
((HttpServletResponse) response).sendRedirect(logon);
}
chain.doFilter(request, response);
}
O método verificaAcesso verifica se o usuário que está “logado” tem permissão
para acessar o recurso solicitado. Caso sim, o método retorna true. O método
getNextURL retorna a URL que estava sendo requisitada, para que, caso a
autenticação seja positiva, a aplicação seja redirecionada para o recurso
solicitado.
6. 3.1.2 Pacote Cliente
Este pacote contem os Business Delegate, que são classes que representam os
objetos de negócio distribuídos. Estas classes ficam do lado do cliente e simplificam o
acesso aos EJB;
a) PagamentoAluno: fornece acesso ao EJB PagamentoAlunoBean;
b) AgendamentoAula: é o business delegate do EJB AulaSessionBean. Os clientes
acessam esta classe que por sua vez delega todas as chamadas de método para o
EJB;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
class AgendamentoAula {
private static AgendamentoAula instance = new AgendamentoAula();
private AgendamentoAula() {}
public static AgendamentoAula getInstance() {
return instance;
}
public List<Aula> getAllAulas() throws Exception {
List<Aula> aulas = new ArrayList<Aula>();
try {
AulaSessionBean ejb = EJBLocator.getInstance().getAulaSession();
aulas = ejb.getAllAulas();
} catch (Exception e) {
throw new Exception(e.getMessage(), e);
}
return aulas;
}
public Aluno getAluno(Integer id) throws Exception {
Aluno aluno = null;
try {
AlunoSessionBean ejb = EJBLocator.getInstance().getAlunoSession();
aluno = ejb.getAluno(id);
} catch (Exception e) {
throw new Exception(e.getMessage(), e);
}
return aluno;
}
}
A classe AgendamentoAula representa um Business Delegate, sei o qual a visão
acessaria diretamente a camada de negócio (neste caso, um EJB). Ela representa a forma
como o cliente fará a interface com o EJB.
No exemplo, de acordo com a estratégia Delegate Proxy Strategy, a classe
AcompanhamentoAula faz o acesso à camada de negócio através de um Business
Delegate, sem conhecer os detalhes da implementação da lógica. Por exemplo, não se
sabe como foi feita a obtenção do aluno, se através de um DAO, um EJB ou outras
classes de negócio.
7. 3.1.3 Pacote EJB
Este pacote contém os session beans que formam a camada de Session Facade
do sistema.
a) AlunoSessionBean: é a classe de implementação do EJB que provê os serviços
para localizar o aluno para o agendamento de aula prática. Este EJB contém os
métodos para obter os dados do aluno solicitado.
b) PagamentoAlunoBean: é a classe de implementação do EJB que provê o serviço
para consolidar o pagamento de aula feita pelo aluno, levando em consideração
as possíveis regras;
3.1.4 Pacote DAO
Este pacote contém os Data Access Objects. Estes objetos abstraem o acesso às
tabelas do banco de dados. No contexto deste exemplo, existiriam as classes AlunoDAO,
ProcessoDAO, AulaDAO e InstrutorDAO.
public Aluno buscarAlunoPorId(int id) throws HibernateException {
String hql = "from Aluno where id = " +
montarParametroHQL(PARAMETRO.NOME);
Collection<ParametroHQL> parametros = new ArrayList<ParametroHQL>();
parametros.add(new ParametroHQL(PARAMETRO.NOME, id));
return (Aluno)carregarUnico(hql, parametros);
}
Exemplo de método da classe AlunoDAO (Estratégia de implementação Custom DAO Strategy)
Esta classe disponibiliza diversos métodos para facilitar a persistência e consulta de
objetos no banco de dados. Estes métodos encapsulam os objetos nativos da camada de
persistência, de modo que o desenvolvedor tenha seu desenvolvimento acelerado.
4. Conclusão
A plataforma de desenvolvimento J2EE apresenta uma série de vantagens para o
desenvolvimento de aplicações que necessitam de escalabilidade, disponibilidade e
portabilidade.
A utilização dos Padrões J2EE provoca uma grande reutilização no
desenvolvimento. No caso de um sistema de porte médio, conforme verificado na
arquitetura apresentada neste trabalho, estas características ficam ainda mais realçadas,
uma vez que na própria especificação das classes é realizada a sua relação com os
padrões de projeto.
Enfim, o uso dos Padrões J2EE pode ser um diferencial de produtividade para o
desenvolvimento de soluções empresariais.
8. 5. Referências
Alur, Deepak; Crupi, John; Malks, Dan. Core J2EE Patterns: as melhores práticas
eestratégias de design. Rio de Janeiro: Campus, 2002.
Bill Dudney, Stephen Asbury, Joseph K. Krozak e Kevin Wittkopf. J2EE AntiPatterns
(2003). Ed. Wiley Publishing.
Júnior, Valdo Noronha Peres Junior. Estratégias para a utilização da tecnologia J2EE
com a arquitetura de cinco camadas. 124f. Dissertação (Mestrado em Ciências da
Computação) – Universidade Federal de Minas Gerais, Belo Horizonte, 2003.
Marinescu, Floyd. EJB Design Patterns: Advanced Patterns, Processes, and Idioms.
New York: John Wiley & Sons, 2002.
Schneide, Ricardo Luiz. Design Patterns. Rio de Janeiro, maio 1999. Disponível em:
<http://www.dcc.ufrj.br/~schneide/PSI_981/gp_6/design_patterns.html>. Acesso em:
6 ago 2011.
Sun Microsystems. Designing Enterprise Applications With The J2EE Platform
Enterprise Edition. Disponível em: <http://java.sun.com/blueprints/guidelines/
designing_enterprise_applications_2e/index.html>. Acesso em: 6 ago. 2011.