Conceitos: Estruturas de Aplicativo da Web
Tópicos
Introdução
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-Controller
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:
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 
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 
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.
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).
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 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 
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 
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 
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.
Arquitetura
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ícios
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ções
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 Estrutura
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 |
|
- 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 |
|
|
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 Recursos). 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
Tecnologias
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 
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 
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 
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
Recursos
Os seguintes links fornecem informações adicionais relacionadas às estruturas de aplicativo
e as tecnologias de componente discutidas neste documento:
|