ARQUITETURA DE SISTEMAS WEB EM CAMADAS UTILIZANDO AS TECNOLOGIAS JSF E EJB3.1 Ismael Härter Dewes¹, Luiz Camargo² Resumo: O presente artigo visa contribuir com o desenvolvimento de sistemas de software em Java voltados para Web, tendo como objetivo apresentar uma arquitetura de sistemas Web em camadas, utilizando as tecnologias JSF (Java Server Faces) e EJB 3.1 (Enterprise Java Beans), ressaltando vantagens quanto à utilização do mesmo, bem como uma análise de aplicabilidade. Palavras chave: Arquitetura. JSF. EJB. Abstract: This article aims to contribute to the development of software systems in Java Web oriented, aiming to present an architecture of web systems in layers, using JSF (Java Server Faces) and EJB 3.1 (Enterprise Java Beans) technologies, highlighting advantages as to its use, as well a analyze a form of applicability. Keywords: Architecture. JSF. EJB. 1 INTRODUÇÃO Uma arquitetura bem elaborada auxilia no gerenciamento de complexibilidade do software trazendo diversos benefícios como: redução de tempo e custo de desenvolvimento e na manutenibilidade do mesmo, além de facilitar a combinação de abordagens e reutilização de código (Padrões de Projeto e Orientação a Objetos), estando diretamente relacionado a atributos de qualidade, enfatizando-se os requisitos não funcionais, relacionados à segurança, desempenho entre outros. A arquitetura está diretamente ligada ao sucesso de um sistema e conduz à evolução do software. “A arquitetura de um software consiste na definição de seus componentes, as propriedades externamente visíveis destes elementos e os relacionamentos entre eles, enfatizando a separação dos interesses.” (BASS, 2003). O presente artigo tem como objetivo apresentar uma arquitetura de sistemas web em camadas, utilizando as tecnologias JSF (Java Server Faces) e EJB3.1 (Enterprise JavaBeans), mostrando vantagens, bem como exemplificar uma forma de aplicabilidade. Um dos motivos que levaram ao desenvolvimento deste trabalho foi entender e definir uma arquitetura a ser utilizada em aplicações para web com Java e quais tecnologias e frameworks que poderiam ser usados para este fim. Este artigo está organizado da seguinte maneira: na seção 2 é apresentada uma breve descrição sobre Engenharia de Software; na seção 3 é feita uma descrição sobre arquitetura em camadas; na seção 4 é apresentado o padrão MVC; na seção 5 é apresentado o framework JSF, sua arquitetura e ciclo de vida; na seção 6 é descrito sobre o Enterprise Java Beans 3.1 e algumas vantagens quanto ao uso do mesmo; na seção 7 é apresentado um modelo de arquitetura utilizando o framework JSF e EJB 3.1, bem como um exemplo de aplicação e trechos de código; a seção 8 possui resultados obtidos na utilização da arquitetura proposta e a seção 9 apresenta a conclusão do artigo. ______________________ ¹Pós - graduando em Engenharia de software pela UNISOCIESC: [email protected] ²Professor da UNISOCIESC. e-mail: [email protected] 2 ENGENHARIA DE SOFTWARE A Engenharia de Software é a área da computação que estabelece uma abordagem sistemática de desenvolvimento de software com qualidade envolvendo processos, técnicas e ferramentas apropriadas para uma ampla gama de aplicações, considerando prazos, restrições e recursos disponíveis (PRESSMAN, 2011). A criação da Engenharia de Software surgiu no intuito de contornar a crise do software, dando um tratamento de engenharia ao desenvolvimento de sistemas complexos caracterizados por um conjunto de componentes abstratos (estrutura de dados e algoritmos) encapsulados na forma de procedimentos, funções, módulos, objetos ou agentes e interconectados entre si, compondo a arquitetura do software, devendo ser executados em sistemas computacionais (WIKILIVROS, 2011). 3 ARQUITETURA EM CAMADAS O padrão de arquitetura em três camadas separa as funcionalidades de uma aplicação visando tornar o sistema mais flexível, possibilitando alteração de forma independente em cada uma das camadas, sendo elas, segundo Akemi (2013): • Camada de apresentação: responsável por receber dados de entrada e apresentar os resultados, sendo a interface com o usuário. • Camada de regras de negócio: controla todo o fluxo de informação, sendo intermediária entre a camada de apresentação e a de acesso a dados. • Camada de acesso a dados: responsável por persistência dos dados da aplicação. 3.1 Objetivos da arquitetura em camadas Segundo Peres (2011) a arquitetura em camadas tem os seguintes objetivos: Dividir a aplicação em módulos o mais independente possível (Modularidade); Reduzir o custo de manutenção da aplicação (Manutenibilidade); Permitir que funcionalidades sejam acrescentadas sem impactar nas já existentes (Extensibilidade); Permitir o reuso de classes e componentes em outros módulos da aplicação ou em outras aplicações (Reusabilidade). De acordo com Pressman (2011, 7. ed. pág. 118-119) Arquitetura de software é a espinha dorsal do sistema a ser construído. Afetando interfaces, estruturas de dados, desempenho e fluxo de controle de programas, maneira pela qual os testes podem ser conduzidos, a manutenção do sistema realizada e muito mais. Por todas essas razões, o projeto deve começar com as considerações arquitetônicas. Só depois de a arquitetura ter sido estabelecida devem ser considerados os elementos relativos a componentes. 4 O PADRÃO MVC Conforme Almeida (2006), o MVC (Model-View-Controller) é um padrão de arquitetura que tem objetivo separar dados, ou lógica de negócio (Model), da interface do usuário (View) e do fluxo da aplicação (Controller), permitindo que várias interfaces possam acessar e visualizar uma mesma lógica de negócios, como apresentado na Figura 1. Na arquitetura MVC , a lógica de negócios (Model) não tem ligação direta com a camada de apresentação (View). • • • Modelo (Model): responsável pela lógica do negócio. Visão (View): é responsável pela interação com o usuário e por apresentar visões dos dados do negócio, não se preocupando como estes foram obtidos, apenas em apresentá-los. Controle (Controller): responsável pelo fluxo das informações entre as camadas de visão e de modelo. Figura 1- Fluxo de eventos e informações em uma arquitetura MVC Fonte: Adaptada de Mota(2011) É importante salientar que na arquitetura em camadas, conforme conclusão de Duarte (2011), camadas dizem como os componentes são agrupados e o MVC define como eles interagem. 5 O FRAMEWORK JSF E SUA ARQUITETURA JSF 2.0 é um framework Java para Web no padrão MVC, que permite a elaboração de elementos de interfaces gráficas, orientado a eventos. Possui um conjunto de bibliotecas para representação de componentes visuais e gerenciamento de estado, possibilitando a manipulação de eventos e validações dos dados de entrada, bem como um conjunto de bibliotecas para definição e controle de navegação de páginas. JSF tem como objetivo simplificar a construção de interfaces com usuários. Possui componentes reutilizáveis, suporte a internacionalização e acessibilidade possibilitando a implementação de forma ágil e a utilização de Ajax em alguns de seus componentes, contendo validadores e conversores. (SANTOS, 2012). 5.1 Arquitetura A arquitetura do JSF, demonstrada na Fig.2, permite o desacoplamento entre os componentes e possibilitando adicionar novos elementos, criar páginas usando eventos e componentes. Os componentes de interface do usuário (UI) são organizados em uma estrutura de árvore, na qual cada componente pode ser associado com métodos e atributos de um bean. Cada componente pode ser associado com uma função de validação ou classe (DEVITTE, [sd]). Figura 2 - Arquitetura JSF Fonte: Devitte (s.d.) 5.2 Ciclo de vida De acordo com Gonçalves (2010), o ciclo de vida do JSF é composto por seis fases Figura 3: Restaurar Apresentação: O processamento da requisição do ciclo de vida do JSF é iniciado nesta fase, com a construção da árvore de componentes. • Aplicar Valores Requisitados: Nesta fase o JSF resgata os valores informados pelo usuário e os armazena em seus componentes, sendo que os valores são convertidos para o tipo apropriado (se o valor é uma String, é convertido para String). • Processar Validações: Nesta fase são processados os “validadores” (validators) registrados para cada componente, sendo verificado se os valores armazenados na fase anterior se aplicam a todas as regras. • Atualizar Valores do Modelo: Após todos os componentes serem validados, os dados do modelo do aplicativo são atualizados sendo o Managed Bean associado à página. Se houver erro na conversão, o JSF dispara um erro de tempo de execução, isto ocorrendo o JSF adiciona esses erros no FacesContext e renderiza a página de visão ao usuário. • Invocar Aplicação: Esta fase é responsável por manipular eventos do aplicativo, tal como enviar um formulário ou acessar outra página por meio de um link. • Renderizar Resposta: Nesta fase a página é renderizada. A fase codifica a resposta e a envia de volta ao navegador sendo que a cada nova requisição o ciclo recomeça. • Figura 3 - O ciclo de vida do JSF Fonte: Devitte (s.d.) 6 ENTERPRISE JAVA BEANS 3.1 E VANTAGENS QUANTO À SUA UTILIZAÇÃO Enterprise Java Beans 3.1 são componentes Java que executam em servidores de aplicação, fornecendo diversos serviços pré-programados, como: escalabilidade (representada por vários EJBs executando ao mesmo tempo), segurança e controle de acesso, transações distribuídas, transparência de localização e componentes remotos (SAMPAIO, 2011). Tem como características simplificar a implementação de aplicações corporativas, bem como disponibilizar serviços tanto local quanto remoto. Facilita o desenvolvimento de aplicações utilizando anotações, reduzindo a quantidade de código, sem a necessidade de utilização de arquivos XML. Existem três tipos diferentes de EJB são eles: • Entity Beans: representação de um objeto que vai persistir numa base de dados. • Session Beans: executa uma tarefa para o cliente. Pode manter o estado durante uma sessão com o cliente (Statefull) ou não (Stateless). • Message Driven Beans: processa mensagens de modo assíncrono entre os EJBs e cuja API de mensagens é o Java Message Service (JMS) (FONSECA, 2010). O EJB na especificação 3.1 apresenta algumas novidades, citadas por Luz (2009), entre elas: • Singleton Beans - Componente que implementa o Design Pattern Singleton, permitindo capturar eventos de inicialização e encerramento da aplicação; • Interface opcional para componentes - Na criação de componentes EJBs não é mais obrigatória a criação de uma interface remota ou local; • Timer Service - Melhorias no serviço de agendamento de forma declarativa (por annotation ou XML); • Deploy de EJBs na camada Web (.war) - Permite o uso de EJBs diretamente na camada Web; • Chamadas assíncronas a métodos - Uma alternativa simplificada à MDBs (MessageDriven Beans) para chamada assíncrona; • Nomes JNDI globais padronizados - Esse recurso proporciona melhor portabilidade; • EJB Lite - Estabelece uma versão mais leve para um contêiner de EJBs. Na seção a seguir será exemplificada a utilização do EJB3.1 utilizando anotações em um modelo de arquitetura em camadas. 7 MODELO DE ARQUITETURA E EXEMPLO DE APLICAÇÃO Na Figura 4, encontra-se um modelo de arquitetura utilizando o framework JSF e o EJB 3.1 bem como a definição das camadas de apresentação, negócio e persistência, a interação entre elas e algumas tecnologias usadas nas respectivas camadas. A camada de apresentação está disposta no ModuloWEB utilizando JSF, Facelets xhtml, Managed Bean e Primefaces. No ModuloEJB estão as camadas de negócio usando Java Beans e a de persistência com JPA (Java Persistence API). A camada de apresentação interage com a de negócio que por sua vez interage com a de persistência, sendo que a camada de apresentação não interage diretamente com a de persistência. Figura 4 – Modelo de arquitetura em camadas A Figura 5 contém a tela utilizada para exemplificar a camada de apresentação de um módulo de consulta de contas a pagar utilizando JSF e Primefaces (extensão do JSF), possibilitando filtrar informações sobre a conta, vencimento, bem como selecionar forma de pagamento e situação. O resultado da consulta é exibido em uma tabela clicando no botão “Consultar”. Figura 5 -Tela Contasapagar.xhtml 7.1 Trechos de código utilizados para exemplificar o desenvolvimento da tela Contasapagar.xhtml. Na utilização de páginas JSF usa-se pelo menos três declarações de namespaces definidas como padrão pelas tags f (linha 4), h (linha 5) e ui (linha 6). O Primefaces é definido pela tag p (linha7) exemplificado na Fig. 6. Figura 6 – Configuração necessária para utilização dos componentes JSF e Primefaces Na tela Contasapagar.xhtml (Fig. 5) foram demonstrados alguns componentes como o campo de texto “Conta” definido pelo componente “p:inputText” do Primefaces Fig.7 (linhas 1 e 2), o botão “Consultar”: responsável por realizar a consulta das contas a pagar de acordo com os filtros informados sendo definido pelo componente “p:comandButton” Fig.8 (linha 1 a 3), para exibir os resultados da consulta foi criada uma tabela definida pelo componente “p:dataTable” (linha 3) e as colunas da tabela criadas pelo componente “p:column” (linha 10 e 15) Fig. 9. Figura 7 – Trecho de código do campo Conta Figura 8 – Trecho de código do campo Consultar Figura 9 - Trecho de código responsável por exibir os resultados da consulta realizada O ManagedBean ContasapagarMB.java realiza uma instância do EJB ContasServiceFacade na aplicação através da anotação @EJB demonstrado na Fig.10 (linha 9), retornando também a lista de contas a pagar. Um ManagedBean definido pela anotação @ManageBean (linha 2) com o escopo de View (@ViewScoped), linha 1, permanece na memória enquanto for submetido para a mesma tela. Figura 10 – Trecho de código do ContasapagarMB A interface ContasapagarServiceFacade.java demonstrada no trecho de código da Fig.11 foi definida para acesso local, poderia ser utilizada para acesso remoto utilizando a anotação @Remote ao invés de @Local (linha 2). Figura 11 – Interface ContasapagarServiceFacade A classe ContasapagarServiceFacadeImp.java Fig. 12 é responsável pela lógica de negócio, que implementa a interface ContasapagarServiceFacade.java Fig.11. Foi utilizado o EJB do tipo Stateless definido pela anotação @Stateless (linha3) pelo fato de não precisar manter o estado, caso fosse necessário, poderia ser substituído pela anotação @Stateful. Figura 12 – ContasapagarServiceFacadeImp Para separar a lógica de persistência (linha 8 a 30) dos dados da lógica de negócio foi criada a classe ContasapagarService.java demonstrada na Fig.13. Figura 13 – ContasapagarService 8 RESULTADOS OBTIDOS COM A APLICAÇÃO DA ARQUITETURA Com a criação de um protótipo (contendo uma tela de consulta de contas a pagar) a partir de um modelo de arquitetura em camadas utilizando anotações, para adquirir conhecimento, tendo como ambiente de desenvolvimento o Eclipse Juno e o servidor JBoss 7.1.1, foi possível programar de forma rápida e simplificada com o EJB3.1 eliminando a necessidade de se criar interfaces home e a de usar descritores de implementação XML em módulos EJB (necessários na especificação EJB2.x) reduzindo consequentemente a quantidade de código (para cada interface home diminui em média 4 linhas de código e cada bean de sessão elimina a necessidade de criar os métodos: ejbActivate, ejbPassivate, ejbRemove e setSessionContext), bem como testar e exemplificar sua utilização e mostrar a separação entre os módulos: WEB onde está disposta a camada de apresentação usando tecnologias como JSF 2.0 e Primefaces (extensão do JSF) e o EJB ficando as camadas: de negócios onde foi utilizado EJB3.1 e a de persistência com JPA com trechos de códigos descritos na seção 7. Com a utilização destas tecnologias também foi possível observar que uma consulta realizada em uma tabela contendo 7 colunas e 316 registros leva em torno de 0,19 segundos para ser executada. A consulta foi realizada acionando-se o botão “Consultar” da tela de contas a pagar exemplificado na Fig. 5 da seção 7. O tempo de execução foi calculado desde o acionamento do botão até o retorno da consulta em forma de uma lista de contas, utilizando-se para isto a função (System.currentTimeMillis()) que retorna o tempo em milissegundos, onde o tempo final é subtraído do inicial e dividido por 1000 para se ter o resultado em segundos. Tabela1. Resultados obtidos Consulta Consulta realizada em uma tabela contendo 7 colunas com 316 registros 9 Tempo de execução 0,19 segundos CONCLUSÃO A arquitetura em camadas proporciona a divisão das funcionalidades de um sistema, separando-as em camada de: visão, negócio e persistência possibilitando realizar alterações de forma independente em cada camada, tornando os códigos mais limpos. Também facilita a manutenção e adição de recursos e o reaproveitamento de códigos. Conforme consta na seção 8, uma arquitetura utilizando componentes JSF, que simplificam a construção de interfaces através de componentes reutilizáveis, e com o EJB 3.1 que utiliza anotações, reduzindo significativamente a quantidade de códigos, agilizam o processo de desenvolvimento de aplicações Web. Este modelo de arquitetura pode ser utilizado em trabalhos futuros, acrescentando-se outras tecnologias e frameworks, de acordo com a necessidade, que possam facilitar ainda mais o desenvolvimento de sistemas web. REFERÊNCIAS AKEMI, Válquíria; PEREIRA, Cristiane; GUIMARÃES, Thamires S. Arquitetura em três camadas. Disponível em: <http://outratecno.blogspot.com.br/2013/03/arquitetura-em-3camadas.html > Acesso em: out.2013. ALMEIDA, 2006 Rodrigo Rebouças de. Model-View-Controller (MVC). Disponível em: <http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/arqu/mvc/mvc.html> Acesso em: 30 out. 2013. BASS, 2003 in SANTOS, Paulo Victor dos. Arquitetura Otimizada Para Desenvolvimento Web Utilizando Novas Tecnologias. Disponível em: <http://www.webartigos.com/artigos/arquiteturaotimizada-para-desenvolvimento-web-utilizando- novas-tecnologias/93779/> Acesso em: 27 out. 2013. DEVITTE, Gustavo Agostini. A Tecnologia JavaServer Faces (JSF). Disponível em: < http://www-usr.inf.ufsm.br/~agostini/> Acesso em: 03 nov. 2013. DUARTE, Anderson. MVC x Camadas. Disponível em: <http://bugnocodigo.blogspot.com.br/2011/08/mvc-x-camadas.html> Acesso em: 30 out. 2013. FONSECA, Natanael. Enterprise Java Beans. Disponível em: <http://www.natanaelfonseca.com.br/2010/09/enterprise-java-beans.html> Acesso em: out. 2013. GONÇALVES, Edson.Ajax com JSF 2.0. Disponível <http://www.edsongoncalves.com.br/tag/javaserver-faces/> Acesso em: nov. 2013. em: LUZ, Giulian Dalton. EJB 3.1. Disponível <http://www.globalcode.com.br/noticias/EntrevistaEJB31> Acesso em: 03 nov. 2013. em: MOTA, Kleber. Java, Software – Desenvolvimento de uma aplicação Java SE com o MVC. Disponível em:<http://www.klebermota.eti.br/2011/12/23/desenvolvimento-de-uma-aplicacao-javase-com-o-mvc/ > Acesso em: 20 nov. 2013. PERES, Marcela Mariotti. Arquitetura em três camadas – parte 1. Disponível em: < http://marcelamperes.wordpress.com/2011/07/14/arquitetura-em-tres-camadas-parte-1/> Acesso em: 03 nov. 2013. PRESSMAN, Roger S. Engenharia de Software-Uma Abordagem Profissional. 7. ed. ARMED, 2011.p.118-119.Disponível em:<http://conhecimentodissipado.blogspot.com.br/2013/10/downloadengenharia-de-software-7.html> Acesso em: 16 nov. 2013. ------. Engenharia de Software-Uma Abordagem Profissional. 7. ed. ARMED, 2011. Disponível em:<http://conhecimentodissipado.blogspot.com.br/2013/10/download-engenharia-de-software7.html> Acesso em: 20 nov. 2013. SAMPAIO,Cleuton. Java Enterprise Edition 6: desenvolvendo aplicações corporativas. Rio de Janeiro: Brasport, 2011. SANTOS, Paulo Victor dos. Arquitetura Otimizada Para Desenvolvimento Web Utilizando Novas Tecnologias. Disponível em:< http://www.webartigos.com/artigos/arquitetura-otimizadapara-desenvolvimento-web-utilizando-novas-tecnologias/93779/> Acesso em: 27 out. 2013. WIKILIVROS, Engenharia de Software/O que é Engenharia de Software? Disponível em:<http://pt.wikibooks.org/wiki/Engenharia_de_Software/O_que_%C3%A9_Engenharia_de_Soft ware%3F>. Acesso em: 25 jan. 2014.