Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ CAMPUS PATO BRANCO CURSO SUPERIOR DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS MARCOS BERWANGER DESENVOLVIMENTO DE PORTAL WEB E-COMMERCE Pato Branco - PR 2008 MARCOS BERWANGER DESENVOLVIMENTO DE PORTAL WEB E-COMMERCE Monografia apresentada como requisito parcial para obtenção de título de Tecnólogo no Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas da Universidade Tecnológica Federal do Paraná, Campus Pato Branco. Orientador: Prof. Géri Natalino Dutra, M.Sc Pato Branco – PR 2008 II DEDICATÓRIA Este trabalho é dedicado as incríveis pessoas que fazem parte da minha vida, aos meus pais, ao meu querido irmão Gustavo, e a minha namorada Cristiane. Por sua paciência e compreensão. III AGRADECIMENTOS Ao colega Tarlis Tortelli Portela pela imensurável contribuição na realização deste trabalho. IV RESUMO O presente estudo apresenta uma análise sobre ferramentas de auxílio no desenvolvimento de softwares, denominados frameworks, para o desenvolvimento de uma aplicação voltada para o ambiente de Internet. Trata-se de um comparativo entre frameworks Struts1, JavaServer Faces2 e Mentawai3, destinados ao controle de aplicações Web. Além da exploração do suporte a persistência através do paradigma do mapeamento Objeto-Relacional. Por fim, o foco na ferramenta Mentawai e na Java Persistence API4 resulta em uma aplicação voltada para o comércio eletrônico. As conclusões apontam que estas ferramentas são alternativas dinâmicas a altura das atuais necessidades e imposições do mercado de software. 1 http://struts.apache.org/ 2 http://java.sun.com/javaee/javaserverfaces/ 3 http://www.mentaframework.org 4 http://java.sun.com/javaee/technologies/persistence.jsp V ABSTRACT This study presents an analysis of tools to help in the development of softwares, known as frameworks, for the development of an application dedicated to the environment of Internet. It is a comparison between Struts, JavaServer Faces and Mentawai, for the control of Web applications. Besides the exploration of the support to the persistence through the paradigm of Object-Relational mapping. Finally, the focus in the Mentawai platform and in the Java Persistence API results in an application dedicated to e-commerce. The conclusions suggest that these tools are dynamic alternatives at the same level as the current needs and requirements of the software market. VI LISTA DE FIGURAS Figura 1: Arquitetura MVC ____________________________________________ 8 Figura 2: Ciclo interativo MVC. ________________________________________ 10 Figura 3: Controle descentralizado do Model 1. ___________________________ 11 Figura 4: Controle centralizado do Model 2. ______________________________ 11 Figura 5: Ciclo de vida Struts. _________________________________________ 15 Figura 6: Infra-estrutura de aplicações Web. _____________________________ 24 Figura 7: Ciclo de vida do JavaServer Faces. ____________________________ 26 Figura 8: Resultado final para o usuário. ________________________________ 30 Figura 9: Equivalência entre elementos do projeto orientado a objetos e o modelo relacional. ________________________________________________________ 33 Figura 10: Ciclo de vida de software baseado em ciclos interativos. ___________ 35 Figura 11: EJB são objetos Java configurados através de annotations._________ 41 Figura 12: Os componentes oferecidos pelo EJB. _________________________ 42 Figura 13: Organização geral da API EJB 3. _____________________________ 42 Figura 14: Interface resultante do arquivo JSP. ___________________________ 47 Figura 15: Interface resultante após a autenticação. _______________________ 49 VII LISTA DE TABELAS Tabela 1: Pontos fracos do Struts. _____________________________________ 20 Tabela 2: Pontos fortes do Struts. _____________________________________ 20 Tabela 3: Comparativo de algumas funcionalidades Struts vs. JSF. ___________ 31 Tabela 4: Comparativo de algumas funcionalidades Struts, JSF e Mentawai. ____ 51 VIII LISTA DE ABREVIATURAS E SIGLAS API: Application Programming Interface. Interface de Programação de Aplicativos; CD-ROM: Disco compacto de armazenamento de dados. Mídia removível. CE: Comércio Eletrônico. CRUD: Create, Retrieve, Update, Delete. Criar, Consultar, Atualizar e Excluir. EJB: Enterprise JavaBean. HTML: HyperText Markup Language. Linguagem de Marcação de Hipertexto. HTTP: Hypertext Transfer Protocol. Protocolo de Transferência de Hipertexto. IDE: Integrated Development Environment. Ambiente Integrado de Desenvolvimento. JCP: Java Community Process. JEE: Java Enterprise Edition. J2EE: Java 2 Enterprise Edition. JPA: JavaPersistence API. JSF: JavaServer Faces. JSP: JavaServer Pages. JSR: Java Specification Requests. MVC: Model, View, Controller. Modelo, Visão e Controle. ORM: Object-Relational Mapping. Mapeamento Objeto Relacional. POJO: Plain Old Java Objects. RAD: Rapid Application Development. Desenvolvimento Rápido de Aplicação. SQL: Structured Query Language. Linguagem de Consulta Estruturada. TI: Tecnologia da Informação. UML: Unified Modeling Language. Linguagem de Modelagem Unificada. URI: Uniform Resource Identifier. Identificador Uniforme de Recursos. URL: Uniform Resource Locator. Localizador de Recursos Universal. Web: World-Wide-Web. Rede Mundial de Computadores. XML: eXtensible Markup Language. Linguagem de Marcação Extensível. IX SUMÁRIO RESUMO _________________________________________________________ IV ABSTRACT _______________________________________________________ V LISTA DE FIGURAS ________________________________________________ VI LISTA DE TABELAS _______________________________________________ VII LISTA DE ABREVIATURAS E SIGLAS ________________________________ VIII SUMÁRIO _________________________________________________________ IX 1 INTRODUÇÃO ___________________________________________________ 1 1.1 JUSTIFICATIVA _______________________________________________ 3 1.2 OBJETIVOS __________________________________________________ 4 1.2.1 Objetivo Geral ______________________________________________ 4 1.2.2 Objetivos Específicos ________________________________________ 4 2 FUNDAMENTACAO TEORICA ______________________________________ 5 2.1 COMÉRCIO ELETRÔNICO ______________________________________ 5 2.2 FRAMEWORKS _______________________________________________ 6 2.2.1 Frameworks MVC ___________________________________________ 8 2.2.1.1 Framework Apache Struts ________________________________ 12 2.2.1.2 Framework JavaServer Faces (JSF) ________________________ 22 2.2.2 Frameworks ORM _________________________________________ 31 3 MATERIAIS E MÉTODOS _________________________________________ 34 3.1 ANÁLISE E PROJETO ORIENTADO A OBJETOS ___________________ 34 3.2 LINGUAGEM DE PROGRAMAÇÃO JAVA __________________________ 36 3.2 CAMADA DE VISÃO - FRAMEWORK MVC MENTAWAI _______________ 37 3.3 CAMADA DE PERSISTÊNCIA – FRAMEWORK EJB 3 ________________ 41 3.4 BANCO DE DADOS MYSQL ____________________________________ 44 4 RESULTADOS __________________________________________________ 45 4.1 DESCRIÇÃO DO SISTEMA _____________________________________46 4.2 FUNCIONALIDADES __________________________________________ 46 4.3 COMPARATIVO MENTAWAI vs. STRUTS vs. JSF ___________________ 51 4.4 PRODUTIVIDADE E TRANSPARÊNCIA ___________________________ 52 4.5 PUBLICAÇÃO ________________________________________________ 54 5 CONCLUSÃO ___________________________________________________ 55 REFERÊNCIAS ___________________________________________________ 58 1 INTRODUÇÃO Nos últimos anos, o ambiente organizacional tem experimentado profundas mudanças, relacionadas, em sua maioria, com as tecnologias da comunicação. A globalização de mercados e integração interna e externa das empresas, por exemplo, caracterizam um novo ambiente empresarial, no qual as organizações dos mais variados setores têm realizado significativos investimentos em Tecnologia da Informação (TI), passando a oferecer produtos e serviços amplamente apoiados nessa tecnologia. Assim, seja pelo novo ambiente empresarial ou por força das influências entre os setores, todas as organizações têm sido afetadas pela nova realidade do mercado e comércio eletrônico. Essa situação tem exigido das organizações grande esforço para a assimilação e a utilização das tecnologias de informação referentes a comércio eletrônico, em sua operacionalização e em sua estratégia competitiva. (Albertin, 1999). Nos primeiros seis meses de 2008, o comércio eletrônico (e-commerce) no Brasil faturou 3,8 bilhões de reais, o que representa um crescimento nominal de 45% em relação aos meses de janeiro a junho de 2007, segundo dados da E-BIT Informação, empresa brasileira especializada em fornecimento de informações sobre o e-commerce. (E-BIT empresa, 2008) De acordo com a E-BIT, o volume faturado no primeiro semestre de 2008 corresponde a praticamente todo montante faturado durante o ano de 2006, quando o e-commerce brasileiro alcançou a marca de R$ 4,4 bilhões em vendas de bens de consumo. De acordo com a empresa, a justificativa para a grande e contínua expansão do comércio pela Internet está no incremento no número de consumidores que, do primeiro semestre de 2007 até o primeiro semestre de 2008, cresceu aproximadamente 42%, ou seja, um acréscimo de 3,5 milhões de novos compradores, totalizando 11,5 milhões de pessoas que já experimentaram comprar na Web até Junho de 2008, o que representa cerca de 6,1% da população brasileira. Inúmeros são os fatores que tem levado os consumidores a mudar o comportamento de compra, com destaque para a inclusão digital, incentivada pelo Governo Federal, a conveniência da compra on-line, principalmente nas grandes cidades e, a eficiência dos sites de busca e comparadores de preços. (E-BIT empresa, 2008) 2 O grande motor de todo este movimento, a Internet, proporciona uma imensa rede de oportunidades, abrindo mercados impensáveis e infinitos. Um “ser” de crescimento orgânico, natural, e principalmente, veloz. É neste meio que esta proposta se insere, buscando suprir novas necessidades da sociedade moderna. Necessidades estas, que uma vez supridas tornar-se-ão parte fundamental do cotidiano dos indivíduos. A Web vem modificando a forma como se estabelecem as relações interpessoais, ou seja, muda-se a forma como as pessoas fazem negócios e se comunicam. A noção de espaço é perdida quando se passa, subitamente, a trabalhar com horizontes globais. Superando-se barreiras, surpreende com a velocidade com que os novos produtos podem passar a fazer parte da realidade dos consumidores. De modo geral, a Internet vem modificando o modo de se relacionar, o modo de comprar e de vender, enfim, a maneira de pensar da sociedade moderna. Segundo Pinho (2000), montar uma loja virtual é, sem dúvida, muito mais complicado do que fazer um site na Internet. Mas tem futuro: as amplas e ainda promissoras possibilidades do comércio eletrônico na Internet despertam a atenção de empresas e comerciantes, estimulando os empreendedores a se tornarem os novos “Webmilionários” do e-commerce. Esta evolução constitui instrumento motivador para a entrada de novas ferramentas e sistemas capazes de suprir espaços ainda não explorados pelos “empresários virtuais”. Diante deste movimento acelerado e consistente, onde os consumidores vem mudando sua maneira de comprar, observa-se a oportunidade para criação de plataformas de comércio voltadas para a Internet: portais de comércio eletrônico. Em suma, propõe-se a criação de um canal capaz de intermediar a negociação entre consumidores e vendedores a fim de permitir que os mais variados produtos e serviços possam ser veiculados e o seu respectivo processo de entrega, gerenciado. Atualmente, tal qual a evolução existente no âmbito comercial, a tecnologia de informação, que dá sustentabilidade a esta realidade, também está em constante processo de aprimoramento. Ferramentas e técnicas surgem a todo o momento e, entre elas as plataformas (Frameworks) MVC e ORM que são voltadas especificamente para o ambiente da Web. Frameworks desta modalidade serão objetos de estudo deste trabalho e deverão auxiliar no desenvolvimento da aplicação em questão. 3 1.1 JUSTIFICATIVA A evolução do ambiente da Internet vivenciado atualmente requer não apenas redes mais rápidas e internacionalizadas, exige também revisões constantes do processo de desenvolvimento de software em busca do uso do aparato tecnológico condizente, aliado a adoção das melhores práticas de desenvolvimento. A interatividade compõe fator primordial das aplicações voltadas para a Internet, sem ela as aplicações seriam incapazes de oferecer a imensa gama de serviços hoje existentes. As aplicações devem atender às requisições dos usuários, realizando acesso a dados, executando tarefas de negócios, exibindo dados e, controlando seu próprio fluxo, sempre através de uma interface amigável e uma estrutura robusta. Assim, tão importante quanto visar o conhecimento envolvido no ambiente de comércio eletrônico, faz-se o estudo aprofundado das plataformas que objetivam, justamente, facilitar e agilizar o desenvolvimento, conduzindo analistas e desenvolvedores a focar seus esforços em processos de negócio. O estudo e a adoção de plataformas tornam-se imprescindíveis quando estas permitem otimizar o desenvolvimento. Os Frameworks MVC desoneram a camada de visão da aplicação, enquanto as plataformas ORM proporcionam uma camada de persistência quase que automatizada, aliviando o programador de tarefas repetitivas cuja implementação manual exigirá conhecimentos específicos. Comparar as formas de utilização dessas ferramentas, salientando suas características essenciais, permite conduzir empresas e desenvolvedores em busca das melhores alternativas, contribuindo para o aprimoramento geral do processo de criação de software. No que tange o comercio eletrônico observa-se a possibilidade de aprimorar características e até mesmo traduzir processos tradicionais para o ambiente da Internet, introduzindo tecnologia de informação em processos populares e largamente utilizados. 4 1.2 OBJETIVOS Arquitetar e desenvolver um portal de comércio eletrônico (e-commerce), através do qual os usuários possam vender produtos e serviços, gerenciando seus processos de entrega. 1.2.1 Objetivo Geral Através de técnicas de orientação a objetos, elaborar análise e projeto, implementando, com auxilio de Frameworks e ferramentas específicas, um portal de Internet capaz de executar e gerenciar processos de venda e entrega de produtos e serviços. 1.2.2 Objetivos Específicos a) Desenvolver um estudo bibliográfico sobre o ambiente de comércio eletrônico; b) Explorar a tecnologia Java voltada para a Internet, e alguns dos principais Frameworks MVC e ORM existentes; c) Efetuar análise do sistema; d) Implementar o Sistema utilizando a linguagem de programação Java paraWeb, desenvolvida pela Sun Microsystems, com o auxilio do framework MVC Mentawai e da JavaPersistence API (JPA). e) Publicar o sistema como portal na Internet. 5 2 FUNDAMENTACAO TEORICA Com vistas a analisar e exemplificar algumas das tecnologias existentes destinadas ao desenvolvimento voltado para a Internet serão demonstrados detalhadamente os Frameworks MVC JavaServer Faces e o Apache Struts, além de uma visão geral sobre a técnica ORM e, inicialmente, a respeito do Comércio Eletrônico. 2.1 COMÉRCIO ELETRÔNICO O comércio eletrônico é a mais recente e promissora aplicação criada com a TI (Tecnologia da Informação), que não se restringe apenas à compra e à venda de produtos e serviços por meio de redes de computadores. Os sistemas de comércio eletrônico (CE) podem ser explorados para fins de comunicação entre filiais, conectividade com clientes e com fornecedores, publicidade e, naturalmente, a realização de transações comerciais. O conceito de comércio eletrônico, segundo Kalakota & Whinston (apud Albertin, 1999), deve então ser entendido sobre quatro diferentes perspectivas: 1. De uma perspectiva de comunicações, o CE é a entrega de informações, produtos/serviços ou pagamentos por meio de linhas de telefone, redes de computadores ou qualquer outro meio eletrônico; 2. De uma perspectiva de processo de negócio, o CE é a aplicação de tecnologia para a automação de transações de negócio e fluxos de dados; 3. De uma perspectiva de serviço, o CE é uma ferramenta que endereça o desejo das empresas, dos consumidores e da gerência para cortar custos de serviços, enquanto melhora a qualidade das mercadorias e aumenta a velocidade da entrega do serviço; 4. De uma perspectiva on-line, o CE prevê a capacidade de comprar e vender produtos e informações na Internet e em outros serviços on-line. A disseminação do sistema de comércio eletrônico, em todas as suas formas, tem como peça-chave a grande adoção desses tipos de tecnologias por clientes, fornecedores e empresas. A disseminação nas novas tecnologias enfrenta 6 sempre obstáculos – entre eles, a natural resistência a mudanças, os aspectos percebidos com a nova tecnologia, a necessidade de infra-estrutura e os benefícios percebidos, mas pode ser beneficiada pela curva de aprendizagem acumulada pelas tecnologias anteriores. Por isso, os tempos de adoção de tecnologias como o pager, fax, videocassete, telefone celular, computador pessoal, CD-ROM e Web são cada vez mais curtos. (PINHO, 2000, p. 211). Paralelamente ao crescimento extensivo e a imensa gama de oportunidades que surgem com o advento do comércio eletrônico, é fundamental que as novas propostas sejam avaliadas sob aspectos como concorrência, publicidade e segurança. Segundo Felipini (2007), é fundamental que o site seja visto pela rede, tendo em vista que cerca de 50% dos consumidores on-line pesquisaram seus produtos através de sites de busca como Google, Yahoo, MSN, entre outros, antes de realizar suas compras. Além dos desafios comerciais existentes neste ambiente competitivo, outro fator preponderante é a grande quantidade de variáveis existentes em sistemas distribuídos como é o caso da Web, o que amplia consideravelmente o grau de complexidade das aplicações desenvolvidas para este fim. Com o intuito de tornar estes desafios mais palpáveis a indústria de software, proprietário ou open source (software de código aberto), vem buscando constantemente desenvolver ferramentas e técnicas capazes de facilitar o trabalho dos desenvolvedores. Algumas destas ferramentas recebem o nome de Framework, ou, plataforma de trabalho. A seguir descreve-se sua funcionalidade básica e duas de suas variações, os Frameworks MVC e os Frameworks ORM. 2.2 FRAMEWORKS Frameworks são conjuntos de classes que colaboram a fim de oferecer suporte a outros sistemas que podem ser sobre ele desenvolvidos. São projetados com a intenção de facilitar o desenvolvimento de software, habilitando designers5 e 5 Profissionais responsáveis pela elaboração do projeto estético e funcional de um Web Site. 7 programadores a gastarem mais tempo determinando as exigências do software do que com detalhes de baixo nível do sistema. Os softwares, assim como as pessoas, são mais semelhantes do que diferentes. Eles são executados nos mesmos computadores, esperam entradas dos mesmos dispositivos, produzem as mesmas exibições e gravam os dados nos mesmos discos rígidos. (HUSTED, 2004, p. 5) Ainda de acordo com Husted (2004), os Frameworks fornecem aos desenvolvedores conjuntos de componentes estruturais que têm as seguintes características: • São conhecidos por funcionarem bem em outras aplicações; • Estão prontos para serem usados com o próximo projeto; • Podem também ser usados por outras equipes na organização. De modo geral os Frameworks estão presentes na grande maioria das empresas especializadas em desenvolvimento de software por trazerem vantagens como: • Redução de custos; • Redução do tempo de resposta aos clientes; • Maximização da reutilização (análise, design, código, testes); • Foco no desenvolvimento dos processos de negócio; • Menor necessidade de manutenção; • Maior consistência e compatibilidade entre aplicações. Entre os Frameworks mais conhecidos e utilizados na atualidade estão os Object-Relational Mapping (ORM) e os Model-View-Controller (MVC). O primeiro utilizado nas tarefas de persistência de dados e o segundo na simplificação dos trabalhos voltados a camada de controle e visão de uma aplicação Web. As subseções 2.2.1 e 2.2.2 tratam dessas tecnologias. 8 2.2.1 Frameworks MVC No final dos anos 70, quando as interfaces gráficas do usuário (GUIs) estavam sendo inventadas, arquitetos de software viam as aplicações como tendo três partes maiores: a parte que gerencia os dados, a parte que cria as telas e os relatórios e a parte que lida com as interações entre o usuário e outros subsistemas (REENSKAUG, 1995). No início dos anos 80, o ambiente de programação ObjectWorks/SmallTalk introduziu esse grupo de três partes como uma estrutura de desenvolvimento. Na linguagem Smalltalk 80, o sistema de dados é denominado Model (Modelo), o sistema de apresentação é chamado de View (Exibição) e o sistema de interação é o Controller (Controlador). Muitos ambientes de desenvolvimento moderno, inclusive o Swing6 do Java, usam essa arquitetura Model/View/Controller (MVC) como a base de suas próprias estruturas (HUSTED, 2004, p. 28). O MVC destaca-se dos demais padrões JEE como um padrão arquitetural para construção de aplicações interativas. Dividindo a aplicação em três tipos de objetos (Figura 1): (1) o Model: representa o modelo de dados e as lógicas de negócio da aplicação; (2) o View: trata a entrada dos dados pelo usuário e a apresentação das informações e (3) o Controller: define a maneira como a interface do usuário reage às entradas do mesmo, responsabilizando pelo controle do fluxo da aplicação (NASCIMENTO, 2004). Figura 1: Arquitetura MVC 6 http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/package-frame.html 9 O Model sabe sobre qualquer View, eles são chamados dependentes e esta é a única relação que deve existir a partir do Model para a View. Views e Controllers aparecem em pares. A View conhece exatamente o Controller, e um Controller conhece exatamente uma View. A View e o Controller conhecem o mesma Model, mas o Model não conhece o Controller (REENSKAUG, 1995, p. 335). O princípio do padrão MVC consiste em dividir as tarefas (atender às requisições dos usuários, realizar acesso a dados, executar tarefas de negócios, exibir dados e, controlar seu próprio fluxo), assumindoque atividades como apresentação dos dados e o seu acesso devem estar separadas, visto que, caso a fonte de dados seja alterada, a interface com o usuário não deverá ser reescrita, e que mesmo que esta interface mude, as regras de negócio permanecerão as mesmas. O uso do MVC oferece muitos benefícios ao projeto de aplicações. Por separar os conceitos de apresentação, controle de fluxo e lógica de negócios, ele reduz a duplicação de código, centraliza o controle e torna a aplicação mais robusta e portável. O MVC também favorece a clara divisão de tarefas entre componentes de uma mesma equipe de desenvolvimento. Enquanto alguns membros especializam-se e são responsáveis pelo design de interfaces, outros podem cuidar da codificação das lógicas de negócios, da representação do fluxo de controle da aplicação e outros ficarão dedicados a tratar das funcionalidades relativas ao banco de dados. Este é um modelo apropriado, por exemplo, para uma fábrica de software. Além disso, novas fontes de dados e novos tipos de clientes são facilmente adicionados à aplicação, adaptando-os para operarem como parte da arquitetura MVC. Por exemplo, se uma aplicação desktop (executada localmente) precisar oferecer recursos Web, uma camada de componentes de apresentação será construída, acoplada ao controlador de fluxo da aplicação e compartilhará regras de negócio com a aplicação desktop (STEARNS, 2002). “A camada de aplicação J2EE serve solicitações HTTP (Figura 2). Ao mais alto nível, a camada da Web faz quatro coisas básicas em uma ordem específica: interpreta a solicitação do cliente, expede os pedidos para a lógica de negócio, seleciona a próxima tela para exibição e, gera e distribui a próxima Visão (View)” (STEARNS, 2002). 10 Figura 2: Ciclo interativo MVC. Fonte: STEARNS, 2002. Os benefícios trazidos pelo uso da arquitetura MVC são evidentes, no entanto, a construção independente de um framework que a implemente, pode tornar-se inviável. Segundo Stearns (2002), é altamente recomendável optar por um framework existente ao invés de projetar e construir um personalizado. De acordo com o autor, as vantagens que um framework pode proporcionar à aplicação: • Desacopla apresentação e lógica em componentes distintos; • Separa os papéis dos desenvolvedores; • Fornece um ponto central de controle; • Contribui com a unidade de teste e manutenção; • Pode ser comprado ao invés de construído; • Proporciona um rico conjunto de funções; • Incentiva o desenvolvimento e a utilização de componentes padronizados; • Proporciona estabilidade; • Tem o apoio da comunidade de desenvolvimento para solução de problemas, aprendizado e implantação de melhorias; • Pode reduzir os custos de formação dos profissionais; • Simplifica a internacionalização; • Facilita a validação de entradas; • Podem ser compatíveis com ferramentas de desenvolvimento (IDE). Na plataforma JEE existem duas formas de se projetar uma aplicação WEB, “Model 1” e “Model 2”. Na primeira o fluxo da aplicação é controlado diretamente pelos arquivos JSP, ou seja, cada página indica qual é a próxima e a anterior. Ao contrário deste, no Model 2 - MVC propriamente dito - a navegação é 11 gerenciada por Servlets7 intermediários, que conduzem o usuário e efetuam o controle da aplicação. No Model 1 as lógicas de apresentação e navegação ficam misturadas, ou seja, o controle é descentralizado (Figura 3). Figura 3: Controle descentralizado do Model 1. Fonte: MILLS, 2003. Para Stearns (2002), o Model 1 é indicado para aplicações pequenas, cujos fluxos são simples e não requerem controle centralizado. Já o Model 2 é recomendado para aplicações maiores, pois o controle do fluxo é centralizado. Tal arquitetura permite tornar as páginas JSP independentes e, normalmente, reutilizáveis. Fazendo com que as aplicações sejam mais facilmente mantidas e, da mesma forma, as funções de autenticação, autorização e auditoria realizadas. A Figura 4 demonstra a proposição do Model 2 (MVC): Figura 4: Controle centralizado do Model 2. Fonte: MILLS, 2003. A utilização de um framework MVC pode simplificar muito a construção de aplicações com a arquitetura Model 2. O Apache Struts Web Application Framework é um dos Frameworks mais utilizado neste segmento e vem adquirindo maturidade ao longo de alguns anos de evolução. Outro framework que vem atraindo a atenção 7 Classes Java capazes de gerar conteúdo dinâmico executadas sobre um container Web. 12 da comunidade Java é o Java Server Faces. Ambos oferecem um servlet de controle configurável, além de bibliotecas de classes e tag libraries8 para a construção de páginas JSP. Muitas ferramentas integradas de desenvolvimento para a plataforma JEE vêm aderindo à arquitetura MVC, através do suporte aos Frameworks. 2.2.1.1 Framework Apache Struts O Struts é um framework de fonte aberta mantido pela Apache Software Fundation (ASF) como parte integrante do projeto Jakarta. Seu nome, do inglês “pilastra”, é uma analogia às bases que mantêm casas, prédios, pontes etc. Struts é um framework MVC para desenvolvimento de aplicações Web que usa uma arquitetura do Model 2, provendo três componentes chave: 1. Um manipulador “request” provido pelo desenvolvedor da aplicação que é mapeado para um padrão URI; 2. Um manipulador “response” que transfere o controle para outro recurso responsável por completar a resposta; 3. Uma tag library que ajuda os desenvolvedores a criar páginas JSP de forma interativa. O funcionamento do framework está diretamente relacionado com a classe ActionServlet que controla o fluxo navegacional. A classe Action é usada para acessar as classes de negócios. Quando o ActionServlet recebe uma solicitação do container9, usa o URI para determinar qual Action usará para lidar com a solicitação. Uma Action pode validar a entrada (input) e acessar a camada de negócios para recuperar as informações nos bancos de dados e outros serviços de dados. (HUSTED, 2002, pg. 14) As requisições são direcionadas ao ActionServlet graças a um mapeamento (servlet-mapping) definido no arquivo descritor da aplicação, o Web.xml. É comum o uso do padrão *.do neste mapeamento, embora isto seja 8 Coleção de tags (marcadores) personalizadas http://java.sun.com/products/jsp/tutorial/TagLibrariesTOC.html 9 Container Java Enterprise Edition (JEE) é responsável por gerenciar o ciclo de vida dos objetos, dar suporte ao multithread, segurança, e suporte a páginas JSP (Java Server Pages). 13 apenas uma convenção e não uma regra. A listagem 1 exibe um trecho do arquivo Web.xml, responsável pela definição do ActionServlet e pelo seu mapeamento para o padrão convencional. O elemento <servlet> configura o ActionServlet, identificando-o por “Action”, enquanto o elemento <servlet-mapping> associa o servlet “Action” ao padrão *.do. (NASCIMENTO, 2005) Listagem 1. Definição do ActionServlet do Struts no Web.xml. Assim, pode-se escalonar o fluxo de navegação dos componentes do Struts da seguinte forma: 1. O usuário faz uma solicitação através de uma URL no browser (navegador de páginas Web). Por exemplo: “http://localhost:8080/cadastro/listarUsuarios.do”. A extensão “.do” será usada para invocar (mapear) o Servlet Controller (ActionServlet) do Struts. 2. Caso seja a primeira solicitação que o container está recebendo para esta aplicação, ele irá invocar o método “init()” da ActionServlet carregando as configurações do arquivo “Struts-config.xml” em estruturas de dados na memória. 14 Esta passagem será executada uma única vez, tendo em vista que nas solicitações subseqüentes, o ActionServlet consulta estas estruturas na memória para decidir o fluxo a ser seguido. 3. Baseadono fluxo definido no arquivo “Struts-config.xml”, e que neste momento já se encontra carregado em estruturas na memória, o ActionSerlet identificará qual o ActionForm (classe responsável pela validação dos dados) irá invocar. Esta última, através do método “validate” irá verificar a integridade dos dados que foram recebidos na solicitação oriunda do navegador. 4. O controle da aplicação é retomado pelo ActionServlet, que verifica o resultado da verificação do ActionForm. Caso ocorra alguma falha na validação o usuário recebe um formulário JSP/HTML (geralmente o mesmo que fez a solicitação), informando o motivo do não atendimento da solicitação, para que o usuário possa preencher corretamente os dados para realizar nova solicitação (request). Na hipótese da validação ter retornado positivamente, o ActionServlet encaminha o fluxo para o próximo passo, a Action. 5. O controlador, baseado no fluxo da aplicação (estruturas já carregadas em memória) invoca uma classe Action. Nela, o método “execute” será invocado e delegará a requisição para a camada de negócio. 6. A camada de negócio irá executar algum processo (geralmente popular um Bean10, ou uma coleção). O resultado da execução deste processo (objetos já populados) será usado na camada de apresentação para exibir os dados. 7. Quando o controle do fluxo da aplicação votar ao Action que invocou o processo da camada de negócio, será analisado o resultado, e definido qual o mapa adotado para o fluxo da aplicação. Neste ponto, os objetos que foram populados na camada de negócio serão anexados como atributos na seção do usuário. 8. Baseado no mapeamento feito pela Action, o controlador faz um forward para o JSP para apresentar os dados. 9. Na camada de apresentação (View), os objetos que foram definidos como atributos da sessão do usuário serão consultados para montar o HTML para o browser. 10. A resposta requisitada retorna ao usuário. 10 Beans, ou JavaBeans, de acordo com sua especificação (http://java.sun.com/products/javabeans/) são “componentes reutilizáveis de software manipulável em uma ferramenta de construção”. 15 Na Figura 5, observa-se o ciclo de vida do request no Struts descrito anteriormente. Figura 5: Ciclo de vida Struts. Fonte: RAIBLE, 2006. Para exemplificar o funcionamento do framework Struts são exibidos trechos de códigos de um sistema de Logon (autenticação). A Listagem 1 demonstra o código fonte responsável por exibir a tela de boas vindas. <%@ taglib uri="/tags/Struts-bean" prefix="bean" %> <%@ taglib uri="/tags/Struts-html" prefix="html" %> <%@ taglib uri="/tags/Struts-logic" prefix="logic" %> <HTML> <HEAD> <TITLE>Welcome!</TITLE> <html:base/> </HEAD> <BODY> <logic:present name="user"> <H3>Welcome <bean:write name="user" property="username"/>!</H3> </logic:present> <logic:notPresent scope="session" name="user"> <H3>Welcome World!</H3> </logic:notPresent> <html:errors/> <UL> <LI><html:link forward="logon">Sign in</html:link></LI> <logic:present name="user"> <LI><html:link forward="logoff">Sign out</html:link></LI> </logic:present> </UL> </BODY> </HTML> Listagem 1: Fonte JSP para a página de boas vindas. (HUSTED, 2004, p. 64) 16 A Listagem 2 exibe o código fonte para a tela de Logon: <%@ taglib uri="/tags/Struts-html" prefix="html" %> <HTML> <HEAD> <TITLE>Sign in, Please!</TITLE> </HEAD> <BODY> <html:errors/> <html:form Action="/LogonSubmit" focus="username"> <TABLE border="0" width="100%"> <TR> <TH align="right">Username:</TH> <TD align="left"><html:text property="username"/></TD> </TR> <TR> <TH align="right">Password:</TH> <TD align="left"><html:password property="password"/></TD> </TR> <TR> <TD align="right"> <html:submit/> </TD> <TD align="left"> <html:reset/></TD> </TR> </TABLE> </html:form> </BODY> </HTML> Listagem 2: Fonte JSP para a página de conexão. (HUSTED, 2004, p. 68) Em ambas as Listagens (1 e 2), pode-se perceber a inserção das tags personalizadas do Struts, que dão maior flexibilidade ao desenvolvedor e tornam o código transparente para os Web Designers. Quando o formulário da Listagem 2 acima for enviado (submetido) dois objetos do framework entrarão em cena: o ActionForm e o Action. Parte do primeiro, ActionForm, é exemplificada na Listagem 3. public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if ((username == null) || (username.length() < 1)) errors.add("username", new ActionError("error.username.required")); if ((password == null) || (password.length() < 1)) errors.add("password", new ActionError("error.password.required")); 17 return errors; } Listagem 3: Método para validação (LogonForm). (HUSTED, 2004, p. 74) Caso a validação ocorra com sucesso o ActionRequest (controlador) encaminha o fluxo da aplicação para a Action “LogonAction” que deve autenticar o usuário no sistema. O método perform desta Action é descrito na Listagem 4. public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String username = ((LogonForm) form).getUsername(); String password = ((LogonForm) form).getPassword(); boolean validated = false; try { validated = isUserLogon(username,password); } catch (UserDirectoryException ude) { ActionErrors errors = new ActionErrors(); errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.logon.connect")); saveErrors(request,errors); return (new ActionForward(mapping.getInput())); } if (!validated) { //Retorna um erro predefino ActionErrors errors = new ActionErrors(); errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.logon.invalid")); saveErrors(request,errors); return (new ActionForward(mapping.getInput())); } // Salva o usuário logado na sessão HttpSession session = request.getSession(); session.setAttribute(Constants.USER_KEY, form); // Retorna com sucesso return (mapping.findForward(Constants.SUCCESS)); } Listagem 4: Fonte Java para a classe LogonAction. (Adaptado de HUSTED, 2004, p. 75) 18 As mensagens que serão apresentadas ao usuário estão registradas no arquivo de configuração “application.properties”, como exemplificado na Listagem 5. welcome.title=Struts Logon Example Application welcome.heading=Welcome! errors.footer=</UL><HR> errors.header=<H3><FONT color="red">Validation Error</FONT></H3>You must correct the following error(s) before proceeding:<UL> error.username.required=<LI>Username is required</LI> error.password.required=<LI>Password is required</LI> error.logon.invalid=<LI>Username and password provided not found in user directory. Password must match exactly, including any lower or upper case characters.</LI> error.logon.connect=<LI>Could not connect to user directory.</LI> Listagem 5: Arquivo de configuração application.properties. (Adaptado de HUSTED, 2004) Todo funcionamento da aplicação depende do arquivo “Struts- config.xml”. É nele que o fica armazenado o caminho a seguir, o fluxo que deve ser percorrido pelo framework. A Listagem 6 exibe as configurações utilizadas para que o processo de autenticação seja executado com sucesso. <?xml version="1.0" encoding="ISO-8859-1" ?> <Struts-config> <form-beans> <form-bean name="logonForm" type="app.LogonForm"/></form-beans> <global-forwards> <forward name="logoff" path="/Logoff.do"/> <forward name="logon" path="/Logon.do"/> <forward name="welcome" path="/Welcome.do"/> </global-forwards> <!— Definições de mapeamento -> <Action-mappings> 19 <Action path="/Welcome" type="org.Apache.Struts.Actions.ForwardAction" parameter="/pages/Welcome.jsp"/> <Action path="/Logon" type="org.Apache.Struts.Actions.ForwardAction" parameter="/pages/Logon.jsp"/> <Action path="/LogonSubmit" type="app.LogonAction" name="logonForm" scope="request" validate="true" input="/pages/Logon.jsp"> <forward name="success" path="/pages/Welcome.jsp"/> </Action> </Action-mappings> </Struts-config> Listagem 6: Arquivo de configuração Struts-config.xml. (Adaptado de HUSTED, 2004) Além das classes Java e das JavaServer Pages, um desenvolvedor tem que criar ou alterar, vários arquivos de configuração para ter uma aplicação Struts ativada e sendo executada. Segundo Husted (2004), são eles: • Web.xml: Descritor de desenvolvimento da aplicação Web requerido pela especificação JavaServlet. O contêiner Servlet/JSP usa esse arquivo para carregar e configurar sua aplicação. • Struts-config.xml: O descritor de desenvolvimento do framework. É responsável por carregar e configurar inúmeros componentes usados pelo Struts. • application.properties: Fornece os recursos de mensagens para a aplicação Struts. Ainda de acordo com Husted (2004), “o centro do framework é o ActionServlet, que o Struts usa como controlador. Embora possa ser subclassificado, a maioria dos desenvolvedores trata o ActionServlet como uma caixa preta, configurando-o a partir do descritor de desenvolvimento da aplicação Web (Web.xml) e o deixam como está”. 20 Como qualquer sistema complexo, o Struts é uma negociação de pacotes. Tem suas capacidades e fraquezas. Alguns desses pontos são subjetivos, porém ainda intrusivos. A Tabela 1 exibe as fraquezas do Struts. Tabela 1: Pontos fracos do Struts. Ponto fraco Observações Nenhum modelo de eventos O Struts está intimamente ligado ao modelo de solicitação- resposta usado pelo HTTP. Depuração Não há suporte para depuração automática. Nenhum modelo default (padrão) ou recomendações concretas O acesso para um modelo de dados permanente é deixado inteiramente como exercício para o desenvolvedor. Um ActionServlet Apenas um ActionServlet pode ser usado em uma única aplicação, o que pode ocasionar conflitos de configuração. Requer compreensão dos componentes Para trabalhar com o Struts, um desenvolvedor precisa compreender várias classes especiais e como elas interagem. O revendedor não oferece suporte de prioridade A Apache Software Foundation é uma organização de voluntários sem uma equipe paga que possa fornecer muitos envios diariamente. Lista de discussão é um obstáculo Devido ao tamanho da lista de discussão pode ser difícil encontrar a melhor informação. Os lançamentos dos formatos não são rápidos As versões do Struts foram relativamente lentas. Não há um cronograma definido para os lançamentos. Limites i18n Os recursos de mensagem do Struts são muito bons ao internacionalizar labels e mensagens de erro, mas não são adequados para gerenciar blocos maiores de texto. Predisposição do JSP Embora o uso de uma arquitetura MVC possa tornar seus recursos disponíveis para qualquer sistema de apresentação, há uma predisposição de longa data do Struts para JSP. Localização de exceções do JSP Muitas mensagens no nível de sistema, como as exceções JSP, não são localizadas e sempre exibidas em Inglês. As propriedades das tags são explicativas As extensões das tags do Struts podem requerer vários parâmetros e podem ser difíceis de programar. Assinaturas perform e execute Assinatura perform é um limite quando da invocação das Actions, constituindo um obstáculo arquitetural. Nomenclatura não clara Pequenas inconsistências encontradas na nomenclatura de classes e parâmetros confundem os novos desenvolvedores e tornam o framework mais difícil de aprender. Fonte: HUSTED, 2005, p. 52. Por outro lado o Struts possui inúmeros pontos fortes, como descrito na Tabela 2: Tabela 2: Pontos fortes do Struts. Capacidade Observações 21 Centrado no HTTP O Struts é desenhado em torno de um modelo de solicitação-resposta (request-response) padrão HTTP, familiar para muitos desenvolvedores Web. Registro padrão O Struts pode usar o sistema de registro default (padrão) do contêiner e não requer outro pacote para ser configurado ou entendido. Registro da depuração opcional Registra opcionalmente várias mensagens de status (situação) durante o processamento que podem ser úteis na depuração. Modelo neutro O Struts não é predisposto para nenhuma camada particular de permanência. Configuração centralizada A configuração do Struts encapsula o detalhe da implementação para uma aplicação ou módulo da aplicação, portanto pode ser revisado e gerenciado como um todo. Arquivo de recursos de mensagens diferentes para cada local Adicionar suporte a um novo local representa apenas adicionar outro arquivo de mensagens. Leve O Struts tem, relativamente, poucas classes básicas para os desenvolvedores aprenderem. Fonte aberta O código-fonte completo é fornecido sob a Apache Software License, deixando todas as suas opções abertas. Comunidade forte de desenvolvedores O número de desenvolvedores que utilizam Struts é grande, formando uma comunidade bastante ativa. Comunidade de revendedores O Struts é incorporado por vários produtos. Suporte Tratado em vários livros e artigos, possui fóruns profissionais com larga participação dos membros. Equipe de desenvolvimento Mais de 30 desenvolvedores contribuíram para a criação da versão 1.1 do Struts. Versões estáveis As versões formais são submetidas a longos períodos de testes, o que assegura um produto com alta qualidade. Suporte ao i18n O suporte a localização (internacionalização) está completamente predefinido no Struts. Extensões de tags. Possui conjunto completo de extensões de tags com finalidade geral além daquelas específicas do framework. Boa documentação Os JavaDocs (arquivos de documentação) do Struts são detalhados e completos, evitando consultas ao código-fonte do mesmo. Baseado nos padrões de construção (Design Patterns) Implementa em sua arquitetura vários padrões clássicos de desenvolvimento. Extensível Todas as suas definições padrão podem ser configuradas. As classes básicas podem ser anuladas e as subclasses carregadas em seu lugar. 22 O desenvolvedor pode personalizar as classes-chave como por exemplo, ActionForm e Action. Fonte: HUSTED, 2005, p. 53. Em busca da união entre o controle e o gerenciamento da aplicação Web com o desenvolvimento visual das aplicações desktop, os arquitetos da informação objetivaram desenvolver uma alternativa capaz de tornar a criação de portais de Internet mais prazerosa e semelhante à programação tradicional, surge, então, o JavaServer Faces. 2.2.1.2 Framework JavaServer Faces (JSF) De acordo com a definição de seus próprios criadores (Sun Microsystems, Inc.) JavaServer Faces, ou apenas, Faces, é um framework para desenvolvimento de aplicações baseadas na Web, compondo uma combinação entre o framework Apache Struts e a API Java voltada para interfaces gráficas, Swing. Tal como o Struts, o JSF provê o gerenciamento do ciclo (fluxo) da aplicação Web através de um controlador Servlet, e como o Swing, JSF fornece umrico e completo modelo de componentes com manipulação de eventos e renderização de componentes. JavaServer Faces é um padrão JEE e atualmente está em sua versão 1.2 liberada pela Java Community Process (JCP) sob a especificação JSR-25211. Esta que é uma atualização a versão 1.1, registrada sob número JSR-127. Já está em desenvolvimento a JSR-314, que trata da versão 2.0 do JavaServer Faces. Participam do projeto: Apache Software Foundation, IBM, Sun Microsystems, Oracle, entre outras. De acordo com Mann (2005, p. 4) nos períodos que antecederam o surgimento do desenvolvimento voltado para a Web falava-se em RAD, Rapid Application Development, cujo principal objetivo era permitir a construção de 11 http://www.jcp.org/en/jsr/detail?id=252. Consultado em 27 de agosto de 2008. 23 poderosas aplicações com um conjunto de componentes reutilizáveis. Quem alguma vez usou ferramentas como Visual Basic, PowerBuilder, ou Delphi, sabe que eles eram um grande salto no desenvolvimento de aplicações de alta produtividade. Pela primeira vez, tornou-se fácil desenvolver interfaces de usuário complexas e integrá- las com fontes de dados. Uma das propostas do JSF é permitir que as técnicas de “arrastar e soltar” (drag and drop) oriundas da tecnologia RAD possam ser utilizadas no desenvolvimento de aplicações voltadas para a Internet. Mann (2005, p. 4) destaca: Ferramentas RAD eram excelentes para o desenvolvimento de aplicações desktop, mas também foram bastante úteis para prototipagem rápida, pois elas poderiam criar rapidamente uma interface com pouco ou nenhum código. Além disso, menores barreiras de entrada permitiam, tanto programadores experientes quanto novatos, obter resultados imediatos. Dentro da perspectiva RAD, o JSF possui as seguintes partes: • Um conjunto de componentes pré-fabricados de interface de usuário. Por exemplo: botões, hyperlinks12, caixas de seleção e campos de texto. • Um modelo de programação orientado a eventos; • Um modelo de componentes que permite a desenvolvedores independentes fornecerem componentes adicionais. • O JSF, assim como o Struts, é um framework concebido dentro dos padrões do Model 2, os pontos básicos são (MANN, 2005, p. 18): • Consiste no uso dos Plain Old Java Objects (POJOs13), EJBs14, ou semelhantes; • Para a camada de visão (View) podem ser utilizados JSPs ou outras tecnologias de demonstração; • O controlador é sempre implementado em forma de Servlet. A infra-estrutura de aplicações Web pode ser encarada com uma pilha de serviços. Os serviços mais próximos da base prestam soluções mais básicas de canalização, mas de pouca abstração. Já os serviços do topo proporcionam maior 12 Referência em um documento hipertexto para outro documento ou recurso na Web. 13 Plain Old Java Objects: Objetos Java simples. 14 Enterprise JavaBean: componente da plataforma JEE. http://java.sun.com/products/ejb/index.jsp 24 abstração. Possuindo todos os serviços em conjunto obtém-se uma estrutura extremamente poderosa. (MANN, 2005, p. 20) A Figura 6 apresenta a relação entre JSF, Struts, JSPs, Servlets e os tradicionais Web Servers. A disposição das tecnologias na margem direita da figura demonstra a evolução gradual ocorrida na infra-estrutura das aplicações Web. É possível observar o momento comum (navegação, validação, Model 2, etc.) entre o JSF e o Struts, e a posterior superação do primeiro. Figura 6: Infra-estrutura de aplicações Web. Fonte: MANN, 2005, p. 20. A separação entre a apresentação e a lógica de negócios é um tema central sobre o design de aplicações Web, situação reforçada pelo padrão MVC. Na implementação JSF esta separação é realizada por beans. Os JavaBeans, ou apenas Beans, diferentemente dos objetos, podem ser configurados e manipulados sem o uso de programação. Tradicionalmente, os beans, são utilizados como componentes de interface de usuário (botões, campos de texto etc), porém, no contexto JSF são 25 utilizados, sempre que preciso, para ligar classes Java a páginas Web ou arquivos de configuração. “[...] o desenvolvedor JSF não precisa escrever nenhum código para construir ou manipular um bean user. A implementação JSF constrói os beans de acordo com os elementos managed-bean (do inglês, bean gerenciado) contidos no arquivo de configuração”. (GEARY, 2007, p. 32) Em uma aplicação os beans são normalmente usados para : • Componentes de interface de usuário; • Uniformizar o comportamento de um formulário (backing beans); • Objetos de negócios cujas propriedades são exibidas nas páginas Web; • Serviços como fontes de dados externas, que precisem ser configurados quando uma aplicação for montada. De modo geral, as aplicações JSF rodam sobre um servlet container, e tradicionalmente contêm as seguintes características15: • Componentes JavaBeans que contém as especificações de funcionalidade e dados; • Interpretadores de eventos; • Páginas JSP; • Classes auxiliares para o lado servidor, tais como de acesso a banco de dados. • Uma tag library para renderização de componentes UI sobre a página; • Uma tag library para representação de manipuladores de eventos, validadores e outras ações. • Componentes UI representados como objetos estáticos (stateful) no servidor; • Backing beans, que definem propriedades e funções para os componentes UI; • Validadores, conversores e gerenciadores de eventos; • Um arquivo de configuração para a aplicação onde são especificados os recursos da aplicação. 15 The J2EE 1.4 Tutorial, cap. 17. http://java.sun.com/j2ee/1.4/docs/tutorial/doc/ 26 Diferentemente do framework Struts a especificação JSF define seis fases distintas, conforme mostrado na Figura 7. Figura 7: Ciclo de vida do JavaServer Faces. Fonte: GEARY, 2007. Geary (2007, p. 28) descreve as fases da seguinte forma: 1. Restaurar Visão (Restore View): recupera a árvore de componentes para a página requisitada caso ela tenha sido exibida anteriormente (inclusive mantendo as informações inseridas pelo usuário), ou constrói uma nova árvore de componentes, caso esteja sendo exibida pela primeira vez. Caso a requisição não contenha os dados solicitados, o controlador pula para a fase de Renderizar resposta (Render response). Isto acontece quando a página é exibida pela primeira vez. 2. Aplicar Valores de Requisição (Apply Request Values): Cada objeto verifica quais valores requisitados pertencem a ele e armazena-os. 3. Processar Validações (Process Validations): Os valores aplicados no passo anterior são validados (testados) e aplicados como “valores locais”. Caso ocorram erros de conversão ou validação, o controlador invoca a fase de Renderizar Resposta, para que o usuário re-informe os dados (inputs). 4. Atualizar Valores do Modelo (Update Model Values): Os valores locais são usados para atualizar os beans vinculados aos componentes. 27 5. Invocar Aplicação (Invoke Application): O método Action do componente (botão ou link) que causou o envio do formulário. Após a sua execução retorna uma String16 com o resultado. Esta é passada para o controlador de navegação, que por sua vez procura a página seguinte. 6. Renderizar Resposta (Render response): Codifica a resposta e a envia para o navegador. A Listagem 7 é demonstra um bean gerenciado do JSF, neste caso ele é responsável por obter as informações definidas através da interface com o usuário. Na Listagem 8 pode-se observar que seu escopo é de request, ou seja, “<managed- bean-scope>request</managed-bean-scope>”. public class UserForm { private String id; public User user = new User(); public UserManager mgr; public void setId(String id) { this.id = id; } public voidsetUser(User user) { this.user = user; } public void setUserManager(UserManager userManager) { this.mgr = userManager; } public String edit() { if (id != null) { // assuming edit setUser(mgr.getUser(id)); } return "success"; } Listagem 7: Código fonte de um Managed Bean. (RAIBLE, 2006) Na Listagem 8 é exibido o arquivo “faces-config.xml”, responsável pela configuração da aplicação. Neste arquivo são definidas as regras de navegação (“<navigation-rule>”), informando para qual página o usuário será redirecionado após a submissão (request). 16 Conjunto de caracteres alfanuméricos. 28 <application> <variable-resolver> org.springframework.Web.jsf.DelegatingVariableResolver </variable-resolver> <locale-config> <default-locale>en</default-locale> <supported-locale>en</supported-locale> </locale-config> <message-bundle>messages</message-bundle> </application> <navigation-rule> <from-view-id>/userForm.jsp</from-view-id> <navigation-case> <from-outcome>*</from-outcome> <to-view-id>/userList.jsp</to-view-id> <redirect/> </navigation-case> <navigation-case> <from-outcome>cancel</from-outcome> <to-view-id>/userList.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/userList.jsp</to-view-id> <redirect/> </navigation-case> </navigation-rule> <managed-bean> <managed-bean-name>userForm</managed-bean-name> <managed-bean-class> org.appfuse.Web.UserForm </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>id</property-name> <value>#{param.id}</value> </managed-property> <managed-property> <property-name>userManager</property-name> <value>#{userManager}</value> </managed-property> </managed-bean> Listagem 8: Arquivo faces-config.xml do JSF. (RAIBLE, 2006) Para a camada de visão, o JSF utiliza sua tag library para formatação das páginas JSP, conforme demonstrado na Listagem 9. Observa-se a vinculação com os demais arquivos através do identificador do formulário (<h:form id="userForm">). 29 Através desta informação os dados informados no formulário são enviados ao bean descrito na Listagem 7. Em caso de erro na validação de algum campo, a aplicação retorna seu fluxo ao formulário e, as tags como “<h:message for="firstName" styleClass="errorMessage"/>” exibem as mensagens ao usuário. <f:view> <f:loadBundle var="messages" basename="messages"/> <h:form id="userForm"> <h:inputHidden value="#{userForm.user.id}"> <f:convertNumber/> </h:inputHidden> <h:panelGrid columns="3" styleClass="detail" columnClasses="label"> <h:outputLabel for="firstName" value="#{messages['user.firstName']}"/> <h:inputText value="#{userForm.user.firstName}" id="firstName"/> <h:message for="firstName" styleClass="errorMessage"/> <h:outputLabel for="lastName" value="#{messages['user.lastName']}"/> <h:inputText value="#{userForm.user.lastName}" id="lastName" required="true"/> <h:message for="lastName" styleClass="errorMessage"/> <h:outputLabel for="birthday" value="#{messages['user.birthday']}"/> <t:inputCalendar monthYearRowClass="yearMonthHeader" weekRowClass="weekHeader" id="birthday" currentDayCellClass="currentDayCell" value="#{userForm.user.birthday}" renderAsPopup="true" addResources="false"/> <h:message for="birthday" styleClass="errorMessage"/> </h:panelGrid> </h:form> </f:view> Listagem 9: Arquivo de View, página JSP formatada com tags JSF. (RAIBLE, 2006) E, por fim, a Figura 8, exibe o resultado que, após interpretado pelo navegador, será apresentado ao usuário. 30 Figura 8: Resultado final para o usuário. Fonte: RAIBLE, 2006. Raible (2006) elenca alguns fatores positivos e negativos em relação ao JSF. Os primeiros: • Padrão JEE – grande demanda e vasta gama de empregos; • Desenvolvimento rápido e fácil; • Framework rico no gerenciamento de fluxo (navegação). Em relação aos pontos negativos, o autor destaca: • “Sopa” de tags para as páginas JSP; • Não ser pleno nas questões de Seguraça ou REST (Transferência de Estado Representacional); • Não ter uma única fonte para a implementação. Na comparação dos Frameworks Struts vs. JSF, Raible (2006) destaca alguns aspectos que podem ser vistos na Tabela 3. 31 Tabela 3: Comparativo de algumas funcionalidades Struts vs. JSF. Funcionalidade Struts JSF Integração com listas de dados e paginação. Utiliza uma tag de exibição específica que faz parte da tag library; Possui uma tabela de dados (DataTable) sem ordenação. Redirecionamento pós autenticação e o armazenamento de URLs (bookmarking). Permite total controle sobre as URL (endereços); Efetua requisições (POST) para todos os fluxos, URLs não são consideras. Configuração dos validadores e suas mensagens. Utiliza uma solução madura, conhecida por CommonsValidator Possui mensagens padrão não tão agradáveis, porém são facilmente configuráveis. Testabilidade Disponibiliza StrutsTestCase que é uma extensão do JUnit que permite teste unitários nas Actions da aplicação. As classes de páginas JSF podem ser facilmente testadas. Capacidade de manutenção de mensagens durante redirecionamentos (redirect after POST): Permite mensagens oriundas de redirecionamentos JSF requer uma solução personalizada, mensagens internacionalizadas (i18n) são difíceis de serem gerenciadas em páginas que manipulam beans. Internacionalização Utiliza um arquivo de recursos (ResourceBundle) por localidade. Requer a declaração do arquivo de recursos na própria página. Fonte: RAIBLE, 2006. 2.2.2 Frameworks ORM Nos dias atuais, tão importante quanto as funcionalidades de um software é a competência com a qual armazena os dados e informações inseridas por usuários e sistemas externos. Ou seja, a grande maioria dos softwares comerciais existentes no mercado somente torna-se verdadeiramente efetiva quando exerce a capacidade de persistir aquilo que é inserido e produzido por ele. Quase todos os aplicativos requerem dados persistentes. A persistência é um dos conceitos fundamentais em desenvolvimento de aplicativos. “Se um sistema de informação não preservasse os dados inseridos pelos usuários quando a 32 máquina anfitriã fosse desligada, o sistema seria de pequeno uso prático” (BAUER, 2005). Grande parte dos desenvolvedores de sistemas conhecem e utilizam a persistência de dados em forma de bancos de dados relacionais. De acordo com Bauer (2005) a tecnologia relacional é um denominador comum de muitos sistemas discrepantes e plataformas de tecnologias, tornando-se a representação mais comum para entidades de negócios. A SQL (Structured Query Language) ou Linguagem de Consulta Estruturada figura como ferramenta essencial para a manipulação dos bancos de dados relacionais, de tal importância que muitos desenvolvedores passam a chamá- los de bancos de dados SQL. No entanto, nos últimos sete anos, a aceitação generalizada da linguagem de programação Java provocou a ascendência do paradigma orientado a objetos para o desenvolvimento de softwares. Este novo modelo quando voltado para as funções de persistência conduziu arquitetos e desenvolvedores a incompatibilidade do paradigma objeto/relacional. É neste momento, em meio a um debate caloroso sobre o “problema” da persistência, que surge uma solução chamada de Mapeamento Objeto/Relacional (ORM), que vem encontrando aceitação crescente. Para esta nova abordagem, Bauer (2005) explica que: [...] ao invés de trabalhar diretamente com as linhas e colunas de um conjunto de resultados SQL, a lógica de negócios interage com o [...] modelo de domínio orientado para objetos e sua realização em tempo de execução (runtime) como um gráfico de objetos interconectados.A lógica de negócios nunca é executada dentro de um banco de dados (como um procedimento armazenado SQL) mas, sim, implementada em Java. Isso permite que a lógica de negócios faça uso de conceitos orientados para objetos sofisticados como herança e polimorfismo. O mapeamento objeto/relacional é a persistência de objetos automatizada e transparente dentro de um aplicativo Java para as tabelas de um banco de dados relacional. A solução do ORM consiste nas quatro seguintes peças: 1. Uma API para executar operações CRUD; 2. A linguagem ou API para especificar consultas que referenciam classes e propriedades de classes; 3. Um recurso para especificar o mapeamento de metadados; 33 4. Uma técnica para a implementação do ORM para interagir com objetos transacionais a fim de executar a verificação suja, buscas de associações ociosas e outras funções de otimização. (BAUER, 2005) Quando uma implementação ORM como Hibernate3 ou Toplink é utilizada é fundamental que estas se baseiam na “idéia de separação entre interface, domínio e persistência. Todas as operações e consultas da interface são realizadas por meio da camada de domínio, e não em expressões SQL” (WAZLAWICK, 2004). De acordo com Wazlawick (2004) o Diagrama de Classes de Projeto permite a geração automática de uma estrutura de banco de dados relacional, a qual reflete, em memória secundária, exatamente a informação que os objetos representam em memória primária. Cada classe deve representar uma tabela e cada atributo classe um campo desta. A Figura 9 demonstra esta equivalência. Figura 9: Equivalência entre elementos do projeto orientado a objetos e o modelo relacional. Fonte: WAZLAWICK, 2004. Na prática, o que ocorre é a “tradução” do modelo de classes para o modelo relacional, implementado em grande parte das tecnologias de Banco de Dados utilizados atualmente. Como resultado deste trabalho pode-se aliar o desempenho desses repositórios com a dinamicidade e a as potencialidades da programação orientada a objetos. 34 3 MATERIAIS E MÉTODOS Diante das inúmeras tecnologias existentes atualmente e da velocidade com que novas ferramentas surgem e adentram ao ambiente das empresas cabe aos profissionais de TI estar em permanente contato e buscar conhecer as novas criações a fim de aprimorar o desenvolvimento dos softwares de maneira geral. No que diz respeito ao processo de análise e projeto de sistemas, a técnica desenvolvida pelo Professor Raul Sidnei Wazlawick (WAZLAWICK, 2004) vem tendo grande aceitação por analistas e arquitetos. Baseada no Processo Unificado, a metodologia será utilizada como base para o desenvolvimento do sistema e será mais bem descrita na seqüência. Igualmente inovador, o framework MVC brasileiro Mentawai, que propõe a configuração programática (linguagem Java) da aplicação, servirá de plataforma para a camada de apresentação. Já a camada de persistência será implementada com o auxilio do framework ORM Java Persistence API (JPA) que compõe a especificação EJB 3.0 (Enterprise JavaBean), efetivada através do banco de dados relacional MySQL. Estas ferramentas e tecnologias são descritas a seguir. 3.1 ANÁLISE E PROJETO ORIENTADO A OBJETOS Classicamente, o processo de desenvolvimento de software divide-se em quatro grandes fases: análise, projeto, implementação e testes. A primeira etapa, a análise, tem como objetivo levar o analista a investigar e descobrir a realidade para a qual o sistema será elaborado. De acordo com Wazlawick (2004) esta etapa é importantíssima porque ninguém é capaz de entender com perfeição um problema usual de sistemas de informação na primeira vez que o olha. 35 O processo de análise, então, será o enunciado do problema e, o projeto será uma proposta para sua resolução. Assim, a fase de projeto enfatizará uma proposição de solução que atenda aos requisitos da análise. Baseado no Processo Unificado (também conhecido como RUP, ou Rational Unified Process), fortemente associado à anotação UML, Wazlawick (2004) enfatiza que a fase de concepção incorpora o estudo de viabilidade e uma parte da análise de requisitos. A fase de elaboração incorpora a maior parte da análise de requisitos, a análise de domínio e o projeto. A fase de construção corresponde a programação e testes, e a fase de transição consiste na instalação e manutenção do sistema. A figura 10 resume as fases e a dinâmica do ciclo de vida interativo do UP: Figura 10: Ciclo de vida de software baseado em ciclos interativos. Fonte: WAZLAWICK, 2004, p. 24. Wazlawick (2004) salienta: O UP propõe um processo ágil, com poucos artefatos e pouca burocracia, o qual permite o desenvolvimento de software rapidamente, pois o que interessa ao cliente é o software pronto, e não uma pilha de documentos justificando por que não ficou pronto. A documentação deve ser dirigida para a produção do software. Cada passo no processo tem um objetivo muito claro e uma utilização precisa, visando sempre à produção de um código que atenda aos requisitos do melhor jeito possível no menor tempo. O projeto orientado a objetos tem como seu núcleo, o Diagrama de Classes, denominado DCP – Diagrama de Classes de Projeto. Ao contrário do que muitos pensam, de que os “diagramas são feitos para documentar”, os diagramas do processo unificado visam contribuir efetivamente para a fase de construção, gerando, em muitos casos, o próprio código que deverá 36 compor a aplicação. Com o auxilio dos diagramas de seqüência, diagramas de colaboração e padrões de projeto (design patterns) e, baseado nas etapas anteriores é construído o diagrama de classes. O diagrama de classes é um esquema que descreve as classes que comporão o sistema. Cada classe descreve um conjunto de características familiares a um determinado tema, podendo ser composta por propriedades (atributos) e serviços (métodos). Quando esta classe torna-se concreta (instanciada) passa a ser chamada de Objeto. Por exemplo, a classe Funcionário possui os atributos nome e naturalidade e, os métodos definirNome() e definirNaturalidade(). A classe Funcionário instanciada torna-se um objeto, cujos atributos podem ser definidos através de seus métodos. Quando invoca-se definirNome(“João”) imediatamente a propriedade “nome” do novo objeto é alterada. 3.2 LINGUAGEM DE PROGRAMAÇÃO JAVA Linguagem de programação criada por James Gosling na década de 90 na Sun Microsystems. Similar à C#17 na sua sintaxe, mas orientada a objetos. Utiliza máquina virtual que interpreta o código compilado em bytecode, tornando extremamente portável entre sistemas diferentes, desde embarcados até mainframes. A plataforma EE – Enterprise Edition, plataforma empresarial – volta para desenvolvimento de aplicações para servidores. Possui Servlets e JSPs uma especialização do Servlet que permite alocação de código Java e código HTML (HyperText Markup Language). (DEITEL,2005, p. 6). 17 Linguagem orientada a objetos derivada do C e do C++. 37 3.2 CAMADA DE VISÃO - FRAMEWORK MVC MENTAWAI Inúmeros são os Frameworks existentes hoje no mercado (dois foram demonstrados no Capítulo II). Neste vasto ambiente insere-se o framework Mentawai. Desenvolvido por brasileiros, o Menta, como foi apelidado, propõe-se a abolir por completo o uso de XML e Annotations18 para sua configurações. Adotando a configuração programática, o Mentawai figurou como primeiro framework Web MVC a adotar, implementar, documentar e incentivar todo e qualquer tipo de configuração (Actions, filtros, validações, listas, pool de conexões, Inversão de Controle, etc.) através de arquivos Java. (http://www.mentaframework.org) O framework nasceu em oito de junho de 2005 e em pouco mais de um mês nascia o ApplicationManager:configuração em código Java independente do restante da aplicação e centralizada numa única classe. Apesar das críticas iniciais devido à aversão a XML, as vantagens da configuração programática foram gradualmente sendo elucidadas: • Mais natural, pois trata-se de código Java e não de uma especificação em XML. • Menos propensa a erros, já que uma configuração em Java pode ser compilada antes de ser carregada pela aplicação Web. • Ótima integração com IDEs (Integrated Development Environment ou Ambiente Integrado de Desenvolvimento), permitindo usar recursos como auto- completar, auto-compilar (build automático), refactoring (refatoração), etc. • Flexibilidade total que apenas uma linguagem de programação pode oferecer, o que permite criar seus próprios métodos de configuração, laços, testes, ou seja, o desenvolvedor possui liberdade para fazer a configuração se adaptar e não o desenvolvedor se adaptar ao XML. • Utilizar linguagens de script como JRuby, Groovy, BeanShell, entre outras. para configurar sua aplicação, possibilitando uma configuração dinâmica que pode ser recarregada automaticamente pelo contêiner a cada modificação. • Possibilidade de documentação (JavaDoc) da configuração realizada e dos métodos utilizados. 18 Anotações utilizadas para configuração inseridas diretamente no código Java. 38 Outra característica do framework é o comprometimento em abstrair e simplificar as principais tarefas recorrentes de todo projeto Web. Ao invés de direcionar o desenvolvedor a outros Frameworks o Menta procura oferecer soluções ou abstrações para as funcionalidades básicas de toda aplicação: pool de conexões com o banco de dados, autenticação, autorização, IoC (Inversão de Controle), envio de e-mail, upload de arquivo, paginação, tag library, etc. Atualmente, o Mentawai é utilizado em ambiente de produção de diversas empresas, o destaque internacional é a Sun Microsystems que o está utilizando em alguns servidores de sua Intranet (rede corporativa privada) e a referência nacional é o Tribunal de Contas do Ceará. O framework possui uma comunidade ativa de usuários e desenvolvedores19. Na maioria das aplicações controladas por Frameworks MVC a configuração é realizada através de arquivos XML. No Mentawai todas as especificações da aplicação são feitas na classe ApplicationManager. Ela conterá as informações principais da aplicação. (OLIVEIRA, 2005) De acordo com Oliveira (2005), o Mentawai utiliza o paradigma de Actions (ações). Suas principais características são: • Uma Action tem uma entrada (org.mentawai.core.Input) e uma saída (org.mentawai.core.Output); • Toda ação gera um resultado (java.lang.String) ao término de sua execução, normalmente sucesso ou erro. Sendo que o desenvolvedor pode criar outros resultados. • Para cada resultado há uma conseqüência (org.mentawai.core.Consequence). Estas conseqüências, para aplicações Web, normalmente são Forward ou Redirect. Da mesma forma que os resultados, o desenvolvedor pode criar suas próprias conseqüências; Uma ação tem acesso aos Contextos (org.mentawai.core.Context), que são para a aplicação Web um contexto de sessão (org.mentawai.core.SessionContext) ou um contexto de aplicação (org.mentawai.core.ApplicationContext). O framework permite a criação de contextos pelo próprio desenvolvedor. 19 http://www.mundojava.com.br/NovoSite/21materiacapa.shtml 39 Um exemplo de action Mentawai pode ser vista na Listagem 10. package examples.hello; import org.mentawai.core.*; public class HelloMentawai extends BaseAction { public String execute() throws ActionException { String username = input.getStringValue("username"); if (username == null || username.trim().equals("")) { return ERROR; } output.setValue("username", username.toUpperCase()); return SUCCESS; } } Listagem 10: Exemplo de Action Mentawai. Fonte: OLIVEIRA, 2005. A ação descrita na Listagem 10 procura por um parâmetro “username” no seu input (entrada de dados). Como retorno ela envia para o output (saída de dados) o parâmetro “username” convertido para maiúsculo. Se nome de usuário recebido (vindo da página JSP) estiver vazio o resultado da Action será ERROR, caso contrário será SUCCESS. A Action HelloMentawai herda a classe BaseAction do framework que é uma interface que provê acesso a dados protegidos, acesso a dados de entrada (input) e saída (output), acesso ao contexto da sessão e da aplicação, entre outras funcionalidades. Para garantir o funcionamento da Action é preciso que a mesma esteja configurada no ApplicationManager, sem XML, apenas código Java, conforme descrito na Listagem 11. public class ApplicationManager extends org.mentawai.core.ApplicationManager { public void loadActions() { ActionConfig ac = new ActionConfig("/HelloWorld",HelloMentawai.class); ac.addConsequence(HelloMentawai.SUCCESS, new Forward("/hello.jsp")); ac.addConsequence(HelloMentawai.ERROR, new 40 Forward("/username.jsp")); addActionConfig(ac); } } Listagem 11: Exemplo do ApplicationManager. (OLIVEIRA, 2005) Em caso de erro o usuário é direcionado à página “username.jsp” (Listagem 12) que fez o primeiro envio de dados à Action. <html> <body> <h1>Hello Metawai!</h1> <form Action="HelloWorld.mtw" method="post"> Type an username: <input name="username" size="25" /> <input type="submit" value="Send"> </form> </body> </html> Listagem 12: Formulário que envia os dados para a Action, “username.jsp”. (OLIVEIRA, 2005) Em caso de sucesso a navegação é direcionada para a página “hello.jsp” (Listagem 13), onde são utilizadas tags específicas do Menta para exibição de dados nos formulários JSP. <%@ taglib uri="/WEB-INF/lib/mentawai.jar" prefix="mtw" %> <html> <body> <h3>Hello <mtw:out value="username" /> from Mentawai!</h3> </body> </html> Listagem 13: Formulário que recebe os dados da Action, “hello.jsp”. (OLIVEIRA, 2005) Em suma, o Mentawai é um framework com uma proposta diferenciada, que visa proporcionar flexibilidade e agilidade, sem exigir de seus usuários profundo conhecimento em XML. 41 3.3 CAMADA DE PERSISTÊNCIA – FRAMEWORK EJB 3 A chave para a simplificação do desenvolvimento de softwares empresariais é proporcionar Frameworks capazes de esconder a complexidade (tais como transações, segurança, e persistência) dos desenvolvedores. Um framework bem concebido promove reutilização de código, aumenta a produtividade do programador, e resulta em melhor qualidade de software. (YUAN, 2005) Um dos principais motivos da escolha dos desenvolvedores pela plataforma Java é a sua independência de vendedor. Da mesma forma o EJB 3.0 (Enterprise JavaBeans) é um padrão aberto concebido por fornecedores independentes. Sua especificação é desenvolvida e apoiada por todos os grandes fornecedores, open source ou comerciais, da comunidade Java. O framework EJB 3.0 isola os desenvolvedores da aplicação servidora. Ou seja, ao contrário da solução JBoss20 cuja implementação é baseada em Hibernate21 e, da Oracle que é baseada em Toplink22, os desenvolvedores, para se utilizarem do EJB 3.0 não precisam conhecer as APIs específicas destes fornecedores. Sem depender de arquivos XML de configuração externos os POJO são, através de annotations (anotações, metadados), transformados em beans, Enterprise JavaBeans (PANDA, 2007). A Figura 11 demonstra essa transformação. Figura 11: EJB são objetos Java configurados através de annotations. Fonte: PANDA, .2007, p. 8. O EJB foi desenvolvido para prestar suporte às camadas de negócio e de persistência. A Figura 12 exibe a localização do framework EJB dentro da arquitetura de quatro camadas (Apresentação,
Compartilhar