Universidade Federal de Santa Catarina Departamento de Informática e Estatística INE5631 – Projetos I Gisele Floriano Pereira - 02238586 Resumo do Trabalho de Conclusão de Curso: Avaliação do Framework Struts para Implementação de Aplicações Web usando Padrão Modelo-Visão-Controlador Por Alice Alves Corrêa O trabalho resumido neste documento teve como objetivo principal, analisar os aspectos específicos do Framework Struts e apresentar a implementação de um sistema de notas fiscais utilizando este framework, juntamente com a arquitetura Modelo-VisãoControlador. Na introdução é feita uma análise sobre a evolução dos sistemas e/ou páginas Web. Fala de como o usuário passou de simplesmente um ente que navega pelo site para um papel passivo na visualização e comportamento dos sistemas. Neste contexto, a autora cita as tecnologias que foram utilizadas no surgimento da Web, mas que se tornaram ineficientes ou não atendiam a todas as necessidades dos novos paradigmas de desenvolvimento de sistemas. Entre essas tecnologias, estão a linguagem C e o Perl. Para suprir as necessidades deixadas por essas tecnologias, surgiram então o Php e o JSP. Mesmo atendendo às novas necessidades, JSP por exemplo quando utilizado, é dificil de manter e reutilizar, por misturar no código tanto a parte gráfica, quanto a parte lógica do sistema. Surge então o Struts, que é um framework para sanar essas dificuldades e contruir aplicações reusáveis e fáceis de manter. Sua intenção era a de separas as camadas de um sistema, em camada de apresentação, lógica e de negócios. Esse framework foi implementado em Java baseando-se nos padrões MVC - Modelo - Visão - Controlador. Dentre os principais objetivos a serem alcançados com esse trabalho, pode-se citar: A avaliação do Struts para implementação de aplição Web no padrão MVC, conhecendo seus componentes e suas formas de utilização. Avaliação dos requisitos para o desenvolvimento, a complexidade e limitações do Struts. Como justificativa para o desenvolvimento deste trabalho, a autora cita grandes portais e suas dificuldades em manter tais sistemas, devido ao alto custo de desenvolvimento, operação e atualização destes sites. O Struts seria, então, uma forma de reduzir estes custos das empresas que planejam ter ou tenham um sistema, aumentando assim a sua renda e tendo possibilidades de gerar novos empregos. Além disso, outras justificativas utilizadas foram: - o fato do Struts ter código livre e sem custos; - A facilidade da internacionalização do sistema; - a possibilidade de divisão de trabalho entre programadores e designers. No capítulo dois, são apresentadas as principais tecnologias destinadas ao desenvolvimento de aplicações Web. - CGI - Common Gateway Interface: surgiu com o propósito de permitir que os servidores interagissem com aplicações externas de uma maneira pela qual as páginas de hipertexto não tivessem mais que ser exclusivamente estáticas. Essa é sua principal vantagem, porém possuim limitações em sua implementação. O tempo de resposta, por exemplo, apresentado por aplicações que utilizam esta tecnologia, pode ser imenso, dependendo da quantidade de usuários que estejam fazendo requisições ao mesmo tempo. Outra desvantagem é o fato deste estar rodando em um processo separado no servidor Web, o que dificulta a manipulação do fluxo de informações, autorizações e autenticação de usuários. - Tecnologias de Páginas de Servidor: criadas com o intuito de permitir criação de páginas fáceis de manter principalmente por não-programadores. Algumas tecnologias como ASP, PHP, templates Velocity e JSP são exemplos desta categoria. Suas principais vantagens são: - A página do servidor não é um arquivo de programa compilado na aplicação básica. - A sintaxe da página do servidor lembra uma página HTML convencional. - O atendimento de cada resquisição não implica na criação de um novo processo no sistema operacional. - Plataforma J2EE: Plataforma para executar aplicações Java do lado do servidor. Foi responsável pela padronização das APIs e pela diminuição do tempo de aprendizado para aplicações Java para servidores. São definidos dois tipo de contêineres para o gerenciamento do ciclo de vida de componente no servidor: os servlets e os Enterprise Java Beans, ou EJB. Servlets surgiram como uma alternativa eficiente para aplicações CGI. Oferecem mecanismos adequados a qualquer servidor baseado em requisições e respostas. Seu ciclo de vida possui 4 etapas: o cliente emite uma requisição ao servidor; o servidor chama o Servlet para que efetue a execução do serviço solicitado; o Servlet gera conteúdo dinâmico, respondendo á solicitação do cliente, podendo usar recursos disponíveis na plataforma Java; o Servidor retorna o resultado gerado para o cliente como uma resposta http. O Servlet tem ainda a vantagem de permitir a utilização de toda a plataforma baseada em Java, incluindo a vantagem da sua portabilidade. Java Server Pages é uma especificação que combina Java e HTML para prover conteúdo dinâmico em páginas Web. JSPs são mais convenientes de se escrever porque permitem que o código seja inserido diretamente em páginas HTML, em contraste com os servlets, nos quais todo o conteúdo em HTML precisa ser gerado a partir do código Java. A primeira vez que o arquivo é requisitado, ele é traduzido em um Servlet e compilado em um objeto que é carregado na memória. O servlet gerado atende a requisição e a saída é enviada ao cliente requisitante. Em todas as requisições seguintes o servidor irá averiguar se o código fonte da página mudou. Caso o código não tenha mudado, o servidor chama o objeto Java que já está compilado. Se o código fonte foi alterado, o contêiner irá recompilar novamente a página. As JSPs fornecem duas abordagens distintas para a inserção do código que será usado no servidor: - - scriptlets: códigos Java colocados diretamente na página. Os scriptlets são relativamente fáceis de usar, rápidos e poderosos, porém sua manutenção e atualização são trabalhosas. Tags JSP Customizadas: tem sintaxe e formato parecido com as tags HTML; elas requerem um pouco mais esforço para serem escritas, entretanto são muito mais fáceis de usar e manter em longo prazo. Na seção 2.3.2.2, é feita uma comparação do JSP com outras tecnologias, onde suas vantagens são descritas sobre cada uma. A conclusão é que JSP possui vantagens sobre todas as suas tecnologias concorrentes. Padrões de Projeto Padrões de projeto são soluções já testadas que se mostraram eficientes para resolver problemas recorrentes e que devem serseguidas para resolução destes problemas. Esses padrões são identificados e reutilizados, inclusive em desenvolvimento de Software. Os padrões servem como um guia no desenvolvimento de novas aplicações. Eles mostram qual a melhor maneira para se implementar a aplicação, após definição de características e requisitos do sistema. Neste contexto, o padrão MVC viabiliza uma maneira eficiente de projetar sistemas de software interativos. Sua idéia central é separar as interfaces dos dados representados. A utilização do padrão MVC torna as aplicações mais fáceis de serem desenvolvidas e mantidas, caso as seguintes características estejam presentes: a aparência possa ser mudada sem afetar as estruturas de dados e lógica do negócio e a aplicação deve manter diferentes interfaces, como linguagens diversas ou diferentes níveis permissão de usuário. Alguns modelos de implementação de aplicações utilizando jsp são descritos pela autora. Modelo 1: maneira mais fácil de desenvolver aplicações baseadas em JSP. Nesse modelo, ao clicar em um link, uma página JSP é chamada diretamente. O Código JSP contém código embutido para acessar os Java Beans do Modelo. O Java Beans do Modelo contém atributos para capturar os parâmetros passados pela requisição. Além disso ele contém lógica de negócios para acessar os dados necessários para a página. A página JSP é então mostrada em HTML usando Java Beans, podendo usar também classes auxiliares e outras tags. Este modelo é indicado para aplicações de pequeno porte, pois há muitos scriptlets embutidos no JSP. Modelo 2 – MVC: A principal diferença entre o Modelo 1 e o Modelo 2 é que no segundo, um controlador gerencia as requisições de um usuário, ao invés da própria página JSP. O controlador é implementado como um servlet. Neste modelo praticamente não existem scriptlets, mas eles ainda precisam ser usados nesse modelo. Porém em comparação com o modelo 1, esta é bem mais fácil de se manter e reusar. O Framework Struts Neste capítulo, é definido o que é um Framework e é feito um estudo detalhado sobre o Struts. O Struts, criado em 2000, foi construído utilizando tecnologias J2EE, porém não é parte do padrão J2EE. Assim, ele é um padrão complementar ao J2EE. O Struts é uma implementação do lado do servidor do MVC usando uma combinação de JSP, JSP tags e Servlets Java. Este framework possui este nome em referência às estruturas da engenharia civil, que é o que dá sustentação às construções. Essa analogia ilustra bem a função de Struts em uma aplicação, pois o Struts serve para dar sustentação a cada camada de uma aplicação. Struts é muito útil na internacionalização de sistemas, pois permite que um sistema construído com este framework use rótulos e mensagens em arquivos separados. Quando uma mensagem ou rótulo precisa ser escrito, a aplicação pode se referir à mensagem através de sua chave. O Framework recupera o texto para o rótulo durante a execução. O nome e localização de arquivos de imagens também podem ser lidos a partir de um pacote de recursos. O Modelo é comumente chamado de camada de negócios. O modelo representa os dados da lógica de negócios e deveria assemelhar-se com as entidades no mundo real e processos para a organização. A camada do modelo esconde os detalhes da implementação, o que facilita o gerenciamento de alterações. O termo ‘modelo’ tem vários significados diferentes. Em termos gerais, um modelo é uma representação de um aspecto da realidade. O principal propósito de criar um modelo é ajudar a entender, descrever, e simular como as coisas funcionam no mundo real. Tipos de modelo: - Modelo Conceitual: O Modelo conceitual é desenvolvido de um conjunto de casos de uso para o sistema. O propósito de construir o modelo é ajudar a identificar as entidades que mais facilmente serão classes no estágio de projeto e ajudar a entender melhor o problema do domínio. Durante a análise do domínio do problema, o modelo conceitual deve ser desenvolvido baseado em entidades do mundo real dentro do espaço do problema. O modelo conceitual ilustra os conceitos, os relacionamentos e os atributos que pertencem a cada conceito. O comportamento atualmente não é representado nesse tipo de modelo. - Persistência: são dados que devem ser armazenados de forma a poderem ser recuperados depois. Esses dados podem ser armazenados em banco de dados, representando de forma plana os dados e seus relacionamentos. A seguir, serão listados os principais componentes do Struts, citado no Trabalho de Conclusão de Curso aqui resumido. A Visão Uma visão corresponde a uma representação do modelo do domínio em uma interface com o usuário. Existem muitas visões diferentes do mesmo modelo. Metaforicamente falando, a visão é uma janela que clientes podem usar para olhar o estado do modelo, e a perspectiva pode ser diferente dependendo em qual janela um cliente observa. Uma visão corresponde a uma representação do modelo do domínio em uma interface com o usuário. A visão dentro da camada web do MVC tipicamente consiste em páginas HTML e JSP, que são usadas para prover conteúdo estático, enquanto JSPs podem ser usados para conteúdo tanto estático quanto dinâmico. Action Forms: A Classe ActionForm é usada para capturar entradas de dados de formulários HTML e transferir estes dados para a classe Action. A classe ActionForm age como um buffer para armazenar o estado dos dados que o usuário entrou enquanto estava sendo validado. DynaActionForm: Na versão 1.0 do Struts, era necessário que cada formulário nas páginas fosse associado a uma ActionForm. A versão 1.1 mudou isso com a introdução da subclasse DynaActionForm, que seria o ActionForm dinâmico. Um ActionForm convencional é desenvolvido em Java e declarado no arquivo de configuração do Struts enquanto a DynaActionForm não tem uma classe Java associada. Bibliotecas de Tags: As Bibliotecas de tags Struts fornecem a maior parte das funcionalidades que as aplicações precisam para criar uma apresentação seguindo o padrão MVC. Java Server Pages Standard Tag Library (JSTL): Como uma alternativa para as tags JSP, a Java Server Pages Standard Tag Library (JSTL) apresenta um conjunto de tags que podem se sobrepor às tags do struts. Rapidamente podemos esperar que os contêineres sejam otimizados para o uso de JSTL, tonando-a a biblioteca de tags escolhida para a maior parte das aplicações. JSTL não dispensa a necessidade de tags personalizadas. O Controlador: O Controlador é um Servlet Java, cujos componentes são responsáveis por detectar as entradas do usuário, possivelmente alterar o domínio do problema, e selecionar a próxima visão para o cliente. O Controlador ajuda a separar a apresentação do modelo. Essa separação nos dá muito mais liberdade para desenvolver uma grande variedade de apresentações baseadas em um único modelo. O uso do controlador provê um ponto centralizado de controle onde todas as requisições dos clientes são inicialmente processadas. O controle centralizado efetua duas requisições do MVC. Primeiro o controlador age como o mediador/tradutor entre as entradas e o modelo, provendo uma funcionalidade comum, como segurança, login e outros serviços importantes por trás de cada requisição do cliente. Segundo, a visão é desacoplada da lógica de negócios e de outros componentes de visão, uma vez que todas as requisições são filtradas através do controlador. Isso faz com que as aplicações se tornem muito mais flexíveis Classe Action: Esta classe é a parte central do Struts. Ela é a ligação entre a requisição de um cliente e a lógica dos negócios. Cada classe Action é destinada tipicamente para efetuar uma única operação de negócios do interesse do cliente. Uma única operação de negócios não significa que a Action não possa efetuar somente uma tarefa. Ao invés disso, a tarefa que ele efetua deve ser coesa e centrada em uma única unidade funcional. Em outras palavras, as tarefas efetuadas pela Action devem ser relacionadas a uma operação de negócios. Não deveria ser criado uma Action com funcionalidades de cesta de compras e responsabilidade de login e logout juntos, por exemplo. Essas áreas da aplicação não são fortemente relacionadas e não devem ser associadas. DispatchAction: Como cada classe Action é destinada tipicamente para efetuar uma única operação de negócios do interesse do cliente, seria necessário criar uma classe Action para cada operação. Essa abordagem é valida, entretanto não é adequada, uma vez que pode existir duplicidade de código entre essas Actions. Assim a DispatchAction provê mecanismos para simplificar a execução de múltiplas operações, chamando-as pelo nome do método específico ao invés de sobrescrevermos o método execute(). Para tanto é necessário especificar no arquivo de configuração do struts o nome do parâmetro que irá apontar para o nome do método a ser utilizado. A Classe ActionForward: O método execute() retorna a próxima visão a ser mostrada. A ActionForward é a classe que encapsula a informação sobre a próxima visão a ser apresentada. O Struts estimula não colocar o nome da página JSP apontando diretamente para a próxima visão, mas sim usar um nome lógico. Essa associação entre o nome lógico e a página JSP física é encapsulada na instância ActionForward retornada do método execute(). Configuração de uma Aplicação: Em Struts é necessário configurar adequadamente o arquivo web.xml. O passo mais importante é configurar o ActionServlet, que receberá todas as requisições para a aplicação. Ainda, é preciso configurar o arquivo struts-config.xml. Depois de definir o servlet, precisamos definir que tipo de URL o servlet irá interceptar. O ideal é definir padrões que sejam caminhos ou sufixos. No bloco de recursos é criada uma referência para um recurso criado previamente, como por exemplo mecanismos de conectividade com um banco de dados JDBC (Java Database Connectivity). Arquivo de Configuração do Struts: O Arquivo de configuração do struts é do tipo XML, geralmente chamado de struts-config.xml, e segue as regras estabelecidas em uma DTD (Document Type Definition) correspondente a sua versão, que mostra todos os elementos possíveis dentro de um arquivo de configuração. os cinco elementos mais importantes e os seus atributos mais relevantes são: 1 - Seção de definição de Form Beans. 2 - Seção de definição de Global Forwards. 3 - Seção de definição de Action Mappings. 4 - Seção de definição do Controlador. 5 - Seção de definição do Recurso de Mensagens. Tratamento de Exceções: O Tratamento de Exceções é uma parte crucial no desenvolvimento de aplicações para a Internet Na versão 1.1 do Struts foi adicionado ao framework um pequeno, porém eficiente framework de tratamento de exceções, que permite o tratamento declarativo e programático de erros. Plug-ins do Struts: Um dos benefícios do Struts é a capacidade de validar dados. Caso qualquer validação falhe, a aplicação mostra o formulário HTML novamente para que os dados sejam corrigidos, permitindo que não seja necessário se preocupar com os mecanismos que capturam e mostram dados inválidos. Validações no Cliente: As validações do lado do cliente são inseguras pois é fácil enviar uma página web e evitar qualquer script executado na página original. Assim, não podemos contar com as validações do lado do cliente, entretanto elas podem ser úteis, uma vez que evitam o envio imediato da página ao servidor, o que economiza tempo e largura de banda. Sendo assim, o ideal seria validar os dados tanto no servidor quanto no cliente usando o mesmo conjunto de regras. Utilização do Validador: Para utilizar o validador é necessário especificar no arquivo de configuração do struts e indicar onde estão localizados os arquivos de configuração do validador: No struts, as validações se localizam em dois arquivos XML – o validation.xml e o validation-rules.xml. O validation-rules.xml contém o conjunto de regras que estão prontas para serem utilizadas. O segundo arquivo – validation.xml é especifico da aplicação. Ele é o responsável por associar o arquivo que contém as regras com cada campo de um form do Struts. Tiles: O objetivo principal do Tiles é tirar o layout comum de páginas, de forma que possa ser reusado em várias JSPs. No tiles, os layouts representam a estrutura da página como um todo. O Layout é simplesmente uma JSP. Podemos associar essa estrutura a um molde com encaixes. È possível colocar outras JSPs nesses encaixes de forma declarativa. Por exemplo, podemos criar um layout com cabeçalho, corpo e rodapé. No arquivo de configuração do tiles, determinamos quais páginas serão colocadas em cada encaixe. Em tempo de compilação, o framework tiles compõe a página usando o layout e preenchendo seus encaixes com cada JSP individualmente. Em essência o tiles é um framework que permite a apresentação conjunta de páginas a partir de componentes. - Desenvolvimento de uma Aplicação usando Struts No Trabalho apresentado pela autora, foi desenvolvida uma aplicação para avaliar a adequação da utilização do Struts para desenvolvimento de uma aplicação Web. Foi desenvolvido um projeto de uma Aplicação para Geração de notas fiscais com fluxo de caixa, que emite notas fiscais de acordo com os dados informados pelo usuário. Houve um processo de Análise, utilizando UML, com diagramas de Casos de Uso. Foram descritos três casos de uso principais: gerar nota fiscal, receber pagamento e pagar conta. Foram definidos ainda contratos para auxiliar na definição do comportamento do sistema e definir o efeito das operações. A partir destes dados, foram definidas as entidades, diagrama de classes, de seqüência e de estado. A implementação ficou da seguinte forma: Controlador: O controlador foi implementado utilizando a classe Action, que possui apenas um método que é executado quando a página é enviada, o método execute(). O fluxo das operações foi tratado através de comparações ou de obrigar o usuário a criar uma classe Action para cada atividade desejada. Visão: Para os Form Beans foi usada a classe ValidatorActionForm ao invés da classe ActionForm, para que fosse possível utilizar o validador. A classe ValidatorForm não foi utlizada, para não haver ma validação para cada Form Bean, que poderá ser usado por diversas Action, mas sim efetuar a validação em cada Action em separado. Modelo: Para a camada do modelo, que representa as entidades usadas no sistema, foi criada uma classe que mapeia os valores obtidos diretamente do banco de dados. Existem métodos para quatro operações básicas do banco de dados: inserir, alterar, apagar e selecionar. - Resultados obtidos a partir do trabalho Foram levantadas algumas limitações do Struts, como: Inexistência de um modelo de eventos; Dificuldades para depuração; Apenas um ActionServlet é usado em uma aplicação, o que pode ocasionar conflitos na configuração; É necessário o conhecimento dos componentes do Struts para que se consiga trabalhar com ele, incluindo o conhecimento das classes e de como elas interagem; entre outras. Pontos fortes: O Struts é desenvolvido no modelo solicitação-resposta do protocolo HTTP, sendo bem familiar para desenvolvedores web; Não é atrelado a nenhum a camada particular de persistência; A configuração do Struts encapsula detalhes para uma aplicação ou módulo; O Struts possui relativamente poucas classes básicas para que os desenvolvedores aprendam; Bem documentado; Versões estáveis; Baseado em Padrões; Extensível; entre outros. - Conclusões Uma das maiores vantagens de se usar um framework de desenvolvimento é a habilidade de estender e customizar as características de acordo com a necessidade da aplicação. Ficou clara a importancia da existência de frameworks que auxiliem o desenvolvimento de aplicações para a web e a necessidade de efetuar o desacoplamento entre suas camadas para prover ganho no potencial de produtividade de desenvolvimento. Para o desenvolvimento da aplicação o framework mostrou-se bastante flexível, entretanto a maleabilidade apresentada ainda permite que sejam cometidos os mesmos erros que originam aplicações difíceis de manter, pois apesar de existir uma separação entre apresentação e lógica de negócios, a delimitação do modelo e da lógica pode não ser efetuada. É importante destacar a importância de se possuir um protótipo bem definido, que sirva de base para o desenvolvimento, de forma que estenda os componentes do Struts para prover as funcionalidades desejadas com a maior reutilização de código possível. Não resta dúvida de que para projetos de sistemas mais complexos, o framework Struts contribui consideravelmente para a melhoria da qualidade do software, auxiliando na divisão de tarefas entre desenvolvedores e designers, facilitando a evolução do sistema e aumentando a manutenibilidade.