Conceitos: Estruturas de Aplicativo da Web

Tópicos

 

IntroduçãoTo top of page

Utilizar uma estrutura de aplicativo apresenta muitas vantagens durante a implementação de um aplicativo de software. Uma estrutura fornece uma infra-estrutura reutilizável que aborda muitos detalhes de implementação comuns nos aplicativos e ajuda a evitar as soluções de redescoberta e reimplementação em problemas de implementação comuns. Além disso, uma estrutura freqüentemente está de acordo com um modelo de programação que representa uma solução efetiva para os desafios de construção de um tipo específico de aplicativo. Para os aplicativos da Web J2EE (Java 2 Enterprise Edition), as estruturas com base no padrão de design MVC (Model-View-Controller) são consideradas as melhores do tipo e, entre elas, os Strutss são os mais populares. Mais recentemente, o comitê de padrões J2EE liberaram a especificação JSF (JavaServer Faces) oferecendo uma estrutura MVC com benefícios adicionais.

Este documento descreve os benefícios do padrão de design MVC e fornece uma visão geral dos Strutss e das estruturas JSF. Ele discute a finalidade, lista as vantagens e desvantagens e fornece diretrizes sobre como escolher entre eles. Finalmente, discute também a integração das tecnologias complementares, denominadamente, SDO (Service Data Objects) e EJB (Enterprise JavaBeans) em uma arquitetura que utiliza essas estruturas.

 

Padrão de Design do Model-View-ControllerTo top of page

O MVC (Model-View-Controller) é um padrão de design que separa a interface com o usuário de um aplicativo a partir de sua lógica de negócios. Ele faz isso dividindo em camadas a arquitetura do aplicativo em três partes: Modelo, Visualização e Controlador. A figura 1 mostra a arquitetura MVC conforme aplicada nos aplicativos da Web.

Figura 1: Arquitetura MVC para Aplicativos da Web

Modelo

O Modelo representa o estado do aplicativo e define as ações de negócios que o modificam (dados persistentes e lógica de negócios). Seu estado pode ser questionado (normalmente pela Visualização) e pode-se pedir para alterá-lo (normalmente pelo Controlador). Ele não sabe nada da Visualização ou do Controlador.

Visualização

A Visualização fornece a apresentação do Modelo. Representa a aparência do aplicativo, ou seja, sua interface com o usuário. É responsável por apresentar e coletar dados para e a partir do usuário. A Visualização pode obter o estado do Modelo, mas não pode modificá-lo.

Controlador

O Controlador reage à entrada do usuário e informa o Modelo para alterar seu estado de acordo. Especificamente, processa os pedidos de entrada do usuário, realizando seu dispatch para as funções de lógica de negócios apropriadas (no Modelo) e selecionando a resposta para o usuário (a Visualização) com base na saída.

Benefícios

A separação do padrão de design MVC da lógica de negócios a partir da apresentação resulta nos seguintes benefícios:

  • Manutenção Aprimorada

    É possível alterar a interface com o usuário sem afetar as regras de negócios e vice-versa porque as camadas de Visualização e Modelo são separadas. O impacto das mudanças é, portanto, minimizado.

  • Reusabilidade do Modelo

    É possível criar múltiplas visualizações do mesmo modelo. Por exemplo, se o seu aplicativo precisa suportar tipos diferentes de dispositivo do cliente (por exemplo, os telefones celulares e PDAs), é possível criar novas visualizações para cada tecnologia e reutilizar o mesmo modelo.

  • Separação das Responsabilidades

    as funções de desenvolvimento podem ser separadas, permitindo que membros diferentes da equipe de desenvolvimento enfatizem sua área de conhecimento. Por exemplo, os designers de Página da Web podem ser responsáveis pela camada Visualização e trabalhar independentemente dos desenvolvedores Java que podem se concentrar na implementação das camadas Controlador e Modelo.

 

Strutss To top of page

Struts é uma estrutura de aplicativo que permite a construção de aplicativos dinâmicos da web utilizando o padrão de design MVC. É uma coleta de classes Java de cooperação, Servlets e bibliotecas de tag JSP (JavaServer Page) que podem ser utilizados como uma fundação para a construção de uma implementação MVC de um aplicativo com base na arquitetura do J2EE Modelo 2 da Sun:

  • A camada Controlador é implementada pelos Servlets.
  • A visualização é implementada utilizando JSPs.
  • A camada Modelo é normalmente implementada utilizando JavaBeans ou Enterprise JavaBeans.

Arquitetura To top of page

A figura 2 mostra a implementação da arquitetura MVC em Strutss e o fluxo de processamento de um pedido do cliente.

Figura 2: Arquitetura MVC dos Strutss e Fluxo de Processamento do Pedido

Componentes do Controlador

Os componentes do Controlador principal dos Strutss consistem em um servlet do Controlador Frontal, ActionServlet e as classes ActionForm e Action.

  • ActionServlet

O ActionServlet recebe um pedido HTTP, chama as ações pedidas no Modelo e seleciona a próxima visualização a ser exibida. É o núcleo da estrutura. Uma instância da classe ActionServlet recebe todos os pedidos de entrada. O ActionServlet configura o estado de um ActionForm utilizando os campos correspondentes a partir do pedido HTTP, opcionalmente pede para validar a si mesmo e o transmite para uma Ação mapeada. Os pedidos são mapeados para Ações utilizando um arquivo de configuração (struts-config.xml).

  • ActionForm

A classe ActionForm representa os dados do formulário. A instância do ActionServlet ocupa automaticamente suas propriedades com valores a partir do formulário de entrada e o transmite para a Ação pedida. A ActionForm também é utilizada para guardar dados dinâmicos a partir do Modelo a ser exibido pela Visualização.

  • Ação

A classe Ação contém lógica para chamar a camada Modelo. Quando executada pelo ActionServlet, ela chama os objetos do Modelo para executar a lógica de negócios e, em seguida, diz ao Controlador ActionServlet para onde ir em seguida.

Modelo

Struts não especificam qual tecnologia deve ser utilizada para o Modelo. No entanto, normalmente, os objetos Modelo são implementados utilizando JavaBeans simples ou componentes mais poderosos como Enterprise JavaBeans.

Visualização

A Visualização é normalmente implementada utilizando Páginas do JavaServer para aproveitar as bibliotecas das bibliotecas de Tag Personalizada JSP fornecidas com a estrutura. Os dados dinâmicos a serem exibidos serão recuperados a partir do JavaBeans ou de instâncias da classe ActionForm criada pela camada do Controlador. As tags personalizadas são o mecanismo principal para acessar esses dados.

Benefícios To top of page

Struts é uma estrutura de código aberto suportada por uma forte comunidade do desenvolvedor e cujos padrões são gerenciados pelo projeto Jakarta da Apache Software Foundation. É uma opção atraente porque não é específica para fornecedores e é suportada em muitas ferramentas de desenvolvimento. Além de ser uma estrutura com base em MVC, os outros benefícios de Struts incluem:

  • Struts são centralizados em HTTP e ocultam o processamento do pedido HTTP de detalhes de baixo nível.
  • São neutros em relação a modelos e permitem que o desenvolvedor escolha qual tecnologia deve ser utilizada na camada Modelo.
  • Struts são altamente configuráveis. Os arquivos de configuração XML são utilizados para controlar o fluxo do aplicativo, validação da entrada do usuário e manipulação de erros.
  • Struts suportam a internacionalização/localização e fazem isso por meio da utilização de Java ResourceBundles padrão.
  • Struts fornecem os seguintes recursos que aprimoram muito a Reusabilidade:
    • Um conjunto rico de bibliotecas de tag de personalização JSP para manipular tarefas comuns como manipulação de bean geral, condicional, lógica de iteração e criação HTML
    • Uma subestrutura Lado a lado que permite a criação de gabaritos de Interface com o Usuário reutilizáveis para controlar o layout e promover uma aparência e comportamento comuns.
    • Acesso a JSTL (JSP Standard Tag Library) por meio de EL (Struts-Expression) para reutilização de código adicional

Limitações To top of page

As limitações de struts incluem:

  • A natureza de código aberto de struts significa que seu suporte conta com a comunidade do desenvolvedor.
  • Struts possuem uma "tendência JSP" já que é difcícil utilizar uma tecnologia diferente para a camada Visualização.
  • Struts não fornecem um componente de interface com o usuário e modelo de manipulação de evento para permitir a construção das ricas interfaces com o usuário da Web.

 

JavaServer Faces To top of page

JSF (JavaServer Faces) é uma estrutura de aplicativo que permite a construção de aplicativos Java Web utilizando a abordagem dirigida à interface com o usuário. A tecnologia fornece uma infra-estrutura para a construção de aplicativos da Web utilizando um modelo de componente da interface com o usuário padrão que é executado no servidor. Seu objetivo é tornar o desenvolvimento do aplicativo da Web mais fácil, simplificando o modelo de programação e promovendo o desenvolvimento da Web dirigido aos eventos, orientado para a interface com o usuário.

ArquiteturaTo top of page

JSF é uma estrutura de aplicativo com base em MVC. Fornece uma rica arquitetura para definir os componentes da interface com o usuário, gerenciando seu estado no servidor e manipulando os eventos gerados para o cliente. Também fornece suporte para validar a entrada do usuário e controlar a navegação da página. A figura 3 mostra os componentes principais da arquitetura JSF e descreve o fluxo de processamento de um pedido do cliente.

Figura 3: Arquitetura do Componente JSF e Fluxo de Processamento do Pedido de Página

FacesServlet

O FacesServlet é o ponto de entrada para todos os pedidos de uma página JavaServer Faces. Ele inicializa os recursos necessários pela estrutura para controlar o ciclo de vida da página e, subseqüentemente chama a página para processar o pedido. Serve como um Controlador Frontal para o aplicativo.

Página JavaServer Faces

Uma página JavaServer Faces é uma página JSP que inclui tags do JavaServer Faces para expressar todos os componentes da interface com o usuário que ela contém. Cada componente declara sua associação de valor com uma propriedade de Bean de Suporte e especifica quaisquer listeners de evento, validadores e conversores necessários. A estrutura sincronizará automaticamente os dados do componente com uma propriedade do limite em seu Bean de Suporte associado.

Árvore do Componente da Interface com o Usuário

Os componentes da interface com o usuário na página JSF são representados no servidor por uma árvore do componente (também chamada de "Visualização"). Quando um pedido é processado pela estrutura, essa árvore é criada (para um pedido de página inicial) ou restaurada do seu estado salvo (para pedidos de página subseqüentes).

Validador

Um Validador é utilizado para validar a entrada do usuário. JSF inclui muitas classes do validador padrão e suporta a criação de personalizados.

Bean de Suporte

Um Bean de Suporte é um JavaBean que guarda os dados para os componentes da interface com o usuário da Página JSF e implementa métodos que suportam seu comportamento. Esses métodos normalmente incluem a lógica para executar a manipulação, validação e controle de navegação do evento. Um Bean de Suporte normalmente chama métodos a prtir de um objeto de modelo para executar a lógica do negócio. O JSF permite declarar todos os Beans de Suporte utilizados pela página no arquivo de configuração Faces (face-config.xml) para que eles sejam automaticamente instanciados pelo contêiner da Web no tempo de inicialização do aplicativo (esses beans são chamados de Beans Gerenciados). O arquivo de configuração também especifica as regras de navegação da página que funcionam em conjunto com a lógica de controle de navegação nos Beans de Suporte.

Listener de Evento

Um Listener de Evento é uma classe definida pelo usuário projetada para manipular um tipo específico de evento gerado por componente. O JSF suporta três tipos de eventos: eventos alterados pelo valor (por exemplo, o usuário alterou um valor do componente), eventos de ação (por exemplo, o usuário clicou em um botão) e os eventos do modelo de dados (o usuário seleciona uma nova linha em um conjunto de dados).

Kit Fornecedor

Um Kit Fornecedor é um grupo de Fornecedores para um tipo de cliente específico. Um Fornecedor é uma classe que produz a saída apropriada para exibir um componente da interface com o usuário em um dispositivo do cliente específico. O JSF fornece um kit de fornecimento HTML padrão que gera HTML para a exibição do componente e permite construir seu próprio kit de fornecimento para outros tipos de cliente.

Conversor

Um Conversor é utilizado para converter um objeto para cadeia para exibição e a partir da cadeia para um objeto para processamento. Também é utilizado para aplicar a formatação e opções de localização.

BenefíciosTo top of page

O JSF é uma estrutura com base em padrões desenvolvida pelo JCP (Java Community Process) e fará parte de futuras liberações da especificação do J2EE (Java 2 Enterprise Edition). Assim, ele estabelece o padrão oficial para construção de interfaces com o usuário do lado do servidor Java. Suas principais habilidades incluem um modelo de programação simplificado que permite que os desenvolvedores construam aplicativos da web com esforço reduzido e uma arquitetura flexível que separe claramente a lógica do aplicativo da apresentação (por virtude de sua natureza MVC). Os seguintes benefícios são derivados dessas habilidades:

  • Desenvolvimento Rápido de Aplicativo

    O JSF ativa o desenvolvimento rápido de aplicativos da Web por meio de seu modelo de programação simplificado. Os desenvolvedores podem facilmente montar componentes da interface com o usuário reutilizáveis em uma página, conectá-los às origens de dados do aplicativo e ligar eventos gerados pelo cliente às rotinas de tratamento do lado do servidor. A estrutura cuida de sincronizar automaticamente o estado do componente e fornece suporte completo para as tarefas comuns de programação da Web como validar a entrada do usuário, executar a lógica de negócios e controlar a navegação da página. Além disso, cada vez mais fornecedores estão fornecendo suporte de ferramentas para construção de interfaces com o usuário da Web utilizando JSF de uma maneira visual para aprimorar ainda mais a produtividade.

  • Manutenibilidade

    A separação clara do JSF da apresentação e do comportamento no nível de componente da interface com o usuário resulta em uma separação de preocupações e sustentabilidade aprimorada em um nível refinado:

    o Um Designer de Página pode forcalizar utilizando uma tag para exibir um componente enquanto um desenvolvedor Java implementa seu comportamento. Ao concluir, eles podem rapidamente vincular os pedações utilizando o modelo de programação simples do JSF.

    o Alterações para a apresentação de um componente não afetam seu comportamento. Você pode, por exemplo, selecionar uma nova tag para exibir um componente sem precisar alterar o código "por trás dele".

  • Flexibilidade

    O JSF não o limita a uma tecnologia de apresentação específica ou linguagem de marcações:

    o O modelo de Fornecimento flexível do JSF permite que os componentes sejam independentes do dispositivo cliente. Os componentes podem ser exibidos de maneiras diferentes de HTML, utilizando fornecedores que geram uma linguagem de marcações diferente. Portanto, a mesma lógica do componente pode ser reutilizada para múltiplos tipos de cliente utilizando fornecedores diferentes.

    o O JSF fornece uma biblioteca de tag de personalização JSP para representar componentes em uma página JSP, mas também permite utilizar uma tecnologia de apresentação diferente de JSP. Isso é possível porque a tecnologia JSF está diretamente na camada superior do Servlet API.

  • Extensibilidade

    O modelo do Componente da Interface com o Usuário do JSF pode ser estendido para criar componentes personalizados. Isso permite criar componentes sofisticados como árvores e menus e construir interfaces com o usuário mais fáceis e mais ricas para os seus aplicativos da Web.

 

LimitaçõesTo top of page

As limitações JSF incluem:

  • É uma nova tecnologia que continuará a ser aprimorada com o tempo.
  • O JSF não tem recursos de gerenciamento de layout para promover uma aparência e um comportamento consistentes e permitir que uma página seja dividida em seções processadas individualmente.
  • O desenvolvimento de JSF é difícil quando feito a mão sem o suporte da ferramenta. Seus benefícios de RAD são verdadeiramente percebidos ao utilizar um IDE com ferramentas de design visual.

 

Guia de Seleção de EstruturaTo top of page

Como uma bos prática, você deve utilizar uma estrutura de aplicativo que esteja de acordo com a arquitetura MVC. Tanto Struts quanto JSF fazem isso, portanto, constituem boas opções. No entanto, ao compará-los, torna-se aparente que ambos possuem funcionalidade de substituição. Por exemplo, ambos fornecem suporte para a validação de entrada, processamento de pedido e navegação de página. Como escolher entre os dois? A tabela 1 lista importantes recursos de estrutura e compara como Struts e JSF os suportam. É possível utilizá-la como um guia para ajudar a tomar uma decisão com base nos recursos necessários e qual ferramenta os suporta melhor.

 

  Struts JavaServer Faces
Modelo de Programação
  • Estilo de Processamento de Formulário
  • Estilo Orientado ao Evento
Componentes de UI e Suporte
  • Componentes de UI simples fornecidos na biblioteca de tag Struts-HTML
  • Ligação de dados ao bean ActionForm fornecido
  • Componentes Rich UI
  • Componentes Personalizados Adicionais podem ser criados
  • Ligação de dados aos Beans de Suporte ou qualquer objeto Modelo suportado
  • Suporte de manipulação de evento suportado
Independência do Dispositivo Cliente
  • Não Suportada
  • Kits de Fornecimento fornecem independência do dispositivo
Manipulação de Erros e Validação
  • Estrutura de validação dirigida por um arquivo XML (validation.xml)
  • Estrutura de validação com muitos validadores predefinidos
  • Validadores personalizados podem ser criados
Gerando Scripts
  • Scripts gravados nas classes Java Action
  • Scripts têm acesso somente aos dados do formulário
  • Scripts gravados em beans de Suporte, classes de Modelo ou classes de Listener de Evento
  • Scripts podem ser anexados aos eventos
  • Scripts podem acessar componentes UI e seus dados
Fluxo da Página
  • Sofisticado, estrutura flexível
  • Com base em arquivo XML
  • Sofisticado, estrutura flexível
  • Configurado em um arquivo XML (faces-config.xml)
Gerenciamento de sessão e estado do objeto
  • Manual
  • Automática

Tabela 1: Comparação de Struts e Recursos JSF

Observe também que a decisão não tem que ser um opção ou/ou. Também é possível combinar as duas tecnologias utilizando uma biblioteca de integração Struts-Faces desenvolvida pelo projeto Apache (consulte #resources -- This hyperlink in not present in this generated websiteRecursos). Essa biblioteca permite utilizar componentes JSF na sua interface com o usuário da Web junto com componentes do controlador, ações e lógica de negócios de Struts.

Em geral, a recomendação é utilizar JSF para novos projetos e migrar os projetos Struts existentes para JSF. O raciocínio por trás disso pode ser resumido da seguinte maneira:

  • O JSF traz a riqueza para as interfaces com o usuário da Web que os usuários estão esperando há muito tempo e que o Struts não fornece.
  • O modelo de programação simples do JSF fornece um alto nível de abstração que aprimora a produtividade. Permite pensar em termos de componentes da interface com o usuário e eventos do cliente conforme o oposto do processamento de "formulário e campo" básico do Struts.
  • O JSF fornece uma solução completa para construir aplicativos da Web e integra facilmente novas tecnologias como os Objetos de Dados de Serviço (consulte #complementary -- This hyperlink in not present in this generated websiteTecnologias Complementares).
  • Poderosos IDEs (Integrated Development Environments), como o RAD 6.0, já suportam o JSF hoje.
  • A futura inclusão do JSF na especificação do J2EE resultará no amplo suporte de ferramentas de muitos fornecedores.

 

Tecnologias Complementares To top of page

Essa seção observa como as seguintes tecnologias podem ser integradas em uma estrutura Struts ou JSF para produzir uma solução de implementação ponto a ponto poderosa e completa: SDOs (Service Data Objects) e EJBs (Enterprise JavaBeans).

Para obter uma descrição da tecnologia EJB, consulte Diretrizes: EJB (Enterprise JavaBean)

 

Objetos de Dados de Serviço To top of page

Os Objetos de Dados de Serviço são uma especifição para um modelo de programação que permite acessar dados backend de uma maneira uniforme, independente da origem de dados e desconectada. O modelo permite que os dados sejam recuperados de qualquer tipo de origem de dados (Banco de Dados Relacional, Beans de Entidade EJB, Serviço da Web, origem de dados XML e assim por diante) e apresentados uniformemente como um gráfico de dados estruturado (DataGraph). O SDO fornece para operações desconectadas, permitindo a recuperação do DataGraph para ser independente de quaisquer conexões de backend ou transações. É ainda uma especificação proposta enviada pelo JCP como JSR (Java Specification Request) 235.

Arquitetura

A arquitetura SDO utiliza uma camada de acesso de dados uniformes (Serviço Mediador de Dados) para retornar DataGraphs para clientes a partir de origens de dados heterogêneas. A figura 4 mostra os componentes da arquitetura SDO.

Figura 4: Arquitetura SDO

DataObject

Um DataObject guarda dados verdadeiros (por exemplo, valores primitivos ou linha de dados de um banco de dados relacional) e possíveis referências a outros DataObjects. Pode ser introduzido para determinar seu tipo, relacionamentos e restrições.

DataGraph

Um DataGraph guarda um conjunto de DataObjects e normalmente representa a unidade de transferência entre componentes na arquitetura. Registra todas as mudanças para dados, incluindo Objetos de Dados novos, alterados ou excluídos.

Serviço Mediador de Dados

Um Serviço Mediador de Dados é responsável por interagir com uma Origem de Dados para produzir DataGraphs representando os dados. A representação de dados nativos é convertida para a representação gráfica SDO por este serviço conectável. O Mediador também é responsável por aplicar mudanças em um DataGraph novamente na Origem de Dados.

 

Aplicabilidade LFramework To top of page

A tecnologia SDO promete a fácil integração de ferramenta e estrutura. No contexto de JSF e outras estruturas MVC, as duas seguintes soluções podem ser consideradas:

Ligação do componente UI ao SDO (JSF)

Em uma estrutura JSF, os valores para os componentes da interface com o usuário da Web podem estar declaradamente ligados aos SDOs para finalidades de recuperação de dados. Por exemplo, um componente da Tabela de Dados poderia estar ligado a um SDO para recuperação de seus valores a partir de uma origem de dados backend. Essa combinação torna a conectividade de dados a partir de um componente UI fácil sem a necessidade de programação. A figura 5 mostra a arquitetura resultante da ligação de componentes JSF UI aos SDOs.

Figura 5: Utilizando SDOs com JSF

Objeto do modelo para SDO (qualquer estrutura MVC)

A camada do modelo de uma estrutura MVC poderia utilizar SDOs para acessar dados backend. A figura 6 mostra um exemplo de um cliente modelo utilizando SDOs para acessar dados persistentes utilizando EJBs da Entidade. O objeto de modelo utiliza DataGraphs retornados por uma fachada EJB de Sessão sem Preservação de Estado. Esta fachada de bean de Sessão, por sua vez, recupera os DataGraphs do Medidador, que atua como uma fachada de dados para o EJB de Entidade com base no mecanismo de persistência.

Figura 6: Utilizando SDOs com os Objetos de Modelo e EJBs

 

RecursosTo top of page

Os seguintes links fornecem informações adicionais relacionadas às estruturas de aplicativo e as tecnologias de componente discutidas neste documento:

Rational Unified Process   2003.06.15