Padrões JEE – Parte 2

Olá a todos!

Neste post, estou publicando a segunda parte da série de artigos sobre padrões JEE.  Dando prosseguimento à camada de apresentação, vamos analisar os padrões View Helper, Composite View, Service to Worker e Dispatcher View.

View Helper

Problema: Separar uma view da sua lógica de processamento.

Solução: Usar views para encapsular código de formatação e helpers para encapsular a lógica de processamento relacionada à view.  Uma view delega suas responsabilidades de processamento para classes auxiliares (helpers), que podem ser POJOs (Plain Old Java Objects, tags customizadas ou arquivos de tag.  Assim, os helpers atuam como adaptadores entre a view e o modelo, e executam processamento relacionado com a lógica de formatação, por exemplo, geração de código HTML.

Estrutura:

Diagrama de sequência:

Participantes e responsabilidades:

  • Client: cliente que despacha para a view.
  • View: representa e exibe informações para o cliente.  A informação por sua vez que é usada em uma view dinâmica é recuperada e convertida de um modelo de apresentação por helpers.
  • Helpers:  um helper encapsula lógica de processamento para gerar e formatar uma view.  Adapta um modelo de apresentação para uma view ou fornece acesso aos dados do modelo.  Helpers são tipicamente implementados como Java Beans ou tags.
  • Presentation Model (Modelo de apresentação):  armazena os dados recuperados dos serviços de negócio que serão usados para gerar a view.

Exemplos de aplicabilidade:

O trecho de código abaixo, adaptado do livro Core J2EE Patterns, mostra um exemplo de helpers implementados como tags JSP definidas pelo desenvolvedor, no caso <corepatterns:employeelist/> e <corepatterns:employee/>.  Trata-se de uma página JSP que exibe uma tabela de funcionários.  No exemplo, a classe Java associada à tag employeelist encarrega-se de gerar uma linha na tabela para cada elemento da lista employeelist_key, definida em algum escopo visível pela página JSP (request, sessão, etc.), ao passo que a classe associada a employee é responsável por renderizar um campo específico de cada elemento (FirstName, LastName, etc.)

Neste cenário, a página JSP desempenha o papel da view, enquanto as tags atuam como helpers.

Composite View

Problema: Deseja-se construir uma view a partir de componentes modulares e atômicos que são combinados para criar o todo, ao mesmo tempo gerenciando o conteúdo de cada componente e o layout da view de forma independente.

Solução: Utilizar Composite Views que são compostas dinamicamente de múltiplas subviews atômicas.  O layout da página pode ser alterado independentemente do conteúdo de cada subview.

Estrutura:

Diagrama de sequência:

Participantes e responsabilidades:

  • Client: Cliente que despacha para a view.
  • View: Representa a interface (UI) retornada para o cliente (ex.: página HTML/JSP).
  • SimpleView: Representa uma porção atômica da view.  Também chamada de subview.
  • CompositeView:  Composta de múltiplas views.  Cada uma dessas views pode ser uma subview ou uma CompositeView.
  • Template: Representa o layout da view.

Exemplos de aplicabilidade:

Um exemplo prático da implementação deste padrão de projeto é o esquema de Tiles do framework Struts.  Abaixo, são mostrados trechos de código auto-explicativos adaptados de um exemplo introdutório do framework que pode ser encontrado na Internet [3].  O exemplo mostra a definição do layout de um portal de forma independente do conteúdo de cada um dos componentes de sua página.

Definição do layout:

Associando os componentes do layout às subviews correspondentes:

Service to Worker

Problema: Deseja-se tratar uma requisição e invocar lógica de negócio antes que o controle seja repassado para a view.

Solução: Usar o padrão Service to Worker para centralizar o controle e o tratamento de requisições, recuperando um modelo de apresentação antes de repassar o controle para a view.  A view, por sua vez, gera uma resposta dinâmica com base no modelo de apresentação.

Estrutura:

Diagrama de Sequência:

Participantes e responsabilidades:

  • FrontController:  Ponto de tratamento inicial da requisição (ver padrão Front Controller).
  • ApplicationController:  Responsável pelo gerenciamento de ações e visões (ver padrão Application Controller).
  • View: Representa a interface (UI) retornada para o cliente (ex.: página HTML/JSP).
  • BusinessHelper, ViewHelper:  Responsáveis por ajudar uma view ou controlador a realizar processamento específico.
  • Presentation Model (Modelo de apresentação):  armazena os dados recuperados dos serviços de negócio que serão usados para gerar a view.
  • BusinessService:  Encapsula a lógica de negócio.

Exemplos de aplicabilidade:

O exemplo mais comum de aplicabilidade do padrão Service to Worker são os frameworks MVC mais comumente usados no mercado, a exemplo do Struts.  Como pôde ser visto, este padrão é composto pela combinação de vários outros padrões

Dispatcher View

Problema: Deseja-se que uma view trate uma requisição e gere a resposta, em cenários onde um processamento limitado de negócio deve ser executado.

Solução: Utilizar o padrão Dispatcher View com views atuando como o ponto inicial de acesso para as requisições.  Caso seja necessário executar um processamento de negócio, este deve ser feito de forma limitada e gerenciada pelas views.

Estrutura:

Diagrama de Sequência:

Participantes e responsabilidades:

  • FrontController:  Pode ser usado para tratar inicialmente a requisição, embora suas responsabilidades sejam limitadas.
  • ApplicationController:  Pode ser usado para um gerenciamento limitado de visões, mas não de ações.  Suas responsabilidades podem ser atribuídas diretamente ao Web container (ex.: Tomcat, JBoss, etc.).
  • View: Representa a interface (UI) retornada para o cliente (ex.: página HTML/JSP).
  • BusinessHelper, ViewHelper:  Responsáveis por ajudar uma view ou controlador a realizar processamento específico.
  • Presentation Model (Modelo de apresentação):  armazena os dados recuperados dos serviços de negócio que serão usados para gerar a view.
  • BusinessService:  Encapsula a lógica de negócio.

Exemplos de aplicabilidade:

O exemplo prático possivelmente mais conhecido da implementação deste padrão é o framework Java Server Faces (JSF) [4].  Em geral, as páginas no JSF são invocadas diretamente, ao passo que seu conteúdo dinâmico é recuperado a partir de backing beans que nada mais são do que objetos – POJOs – que geram os dados a serem exibidos e executam posteriormente a lógica associada ao processamento da submissão de formulários, por exemplo.

A diferença básica entre o padrão Dispatcher View e o Service Worker é que, enquanto o primeiro posterga o processamento de negócio até depois que o controle é passado para a view, o segundo executa tal processamento antes que o controle chegue à view.

Chegamos ao fim da série de padrões da camada de apresentação.  Na próxima parte, daremos início aos padrões da camada de negócio.

Referências:

[1] Core J2EE Patterns – Best Practices and Design Strategies, 2nd Edition.  Depak Alur, John Crupi e Dan Malks.  2003.

[2] Catálogo online de padrões: http://java.sun.com/blueprints/patterns/catalog.html

[3] Introduction to struts and tiles with a working example. Sascha Wolski.  http://www.laliluna.de/download/first_struts_tiles_tutorial.pdf

[4]  Java Server Faces Technology.  http://java.sun.com/javaee/javaserverfaces/

»crosslinked«

Monique Monteiro

Sou Arquiteta de Software (embora já tenha atuado também como Gerente de Projetos), MSc em Ciência da Computação e sou de Recife, mas moro atualmente em Brasília. Estou envolvida na área de TI (mais especificamente desenvolvimento de software) há cerca de 10 anos (contando o período da faculdade, é claro :)), e de lá pra cá sempre gostei de aprender coisas novas relacionadas ao estado da arte em desenvolvimento e Engenharia de Software em geral! Desde dezembro de 2009 estou trabalhando no Tribunal de Contas da União (TCU), como Auditora Federal de Controle Externo.

Você pode gostar...

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *