Struts: Dominando Tiles e DynaForms – Parte 04


DynaForms

DynaForms são nada mais que ActionForms, porém ao invés de você ter que escrever código java criando atributos e seus respectivos métodos getters/setters, você somente precisa declarar seu novo form diretamente no struts-config em XML. Com isso conseguimos simplificar, organizar e centralizar o uso de seus forms, os quais podem ainda ser validados assim como os ActionForms que você teria implementado em classes Java. Um ActionForm nada mais é que uma superclasse que precisa ser herdada em seus Beans, para que o struts reconheça-a como uma classe válida, para os processamentos que ele for fazer sobre elas. A funcionalidade de um DynaActionForm será a mesma de seus ActionForms, porém quem cuidará de toda a implementação será o próprio Struts.

Um ActionForm nada mais é que, uma classe base para a construção de seus objetos de negócio, que deve ser herdada para que o Struts a reconheça como uma classe válida para ele trabalhar (gets/sets de seus atributos).

A utilização de DynaForms fica difícil, ou impossível, quando você possui objetos de negócio muito complexos, pela não possibilidade de possuir métodos mais complexos internamente que façam, por exemplo, uma validação mais complexa de seus atributos. Porém, os DynaForms são extremamente úteis quando:

·               seu objeto de negócio for simples, apenas com seus respectivos getters e setters, o que acontece na maioria dos casos;

·               você precisa fazer uso de um objeto de negócio já definido, porém sem que ele precise estender de classes específicas do struts.

 

Utilizando-se de DynaForms você consegue reduzir seu tempo de implementação, pois eles são simplesmente declarados em um XML (o nosso famoso struts-config.xml). Como você já deve ter percebido, falamos as palavrinhas mágicas: “Menos esforço e mais produtividade”. E não é disso que corremos atrás todos os dias? Então vamos conhecer um pouco mais sobre os DynaForms.

Suponhamos que você tenha uma aplicação, e como toda maioria das aplicações você terá um login. Aproveitando o código feito (Listagens 2 a 8), agora implementaremos o que diz respeito ao DynaForm.

No código da Listagem 9 definimos o nosso DynaForm de login, o qual chamamos de LoginForm. O struts lê essa declaração na inicialização e cria um Map (java.util.Map) para armazenar esses atributos (form-property), usando como Key o nome do atributo declarado e seta seus valores para os valores iniciais declarados, ou para os valores default. Pode-se notar também que declaramos que nosso form herdará da classe DynaActionForm, ou alguma especialização dessa classe. Isso se faz extremamente necessário para que o struts reconheça esta classe como válida.

Para esse nosso form (LoginForm), serão criados três atributos: login, senha e id. Cada atributo pode ser acessado através dos métodos da interface Map do Java, a saber: get(Object key) e  put(Object key, Object value). Mais adiante veremos como recuperar e guardar dados em nosso DynaForm, de uma JSP ou de uma action.


net-22-04-2008pic01.JPG

Listagem 9. Definição de nosso DynaActionForm.

 

Depois de declarado nosso novo form, criaremos uma página JSP, que conterá um formulário que será associado ao nosso form criado. Na Listagem 11, vemos como associar este nosso form a uma action, o que fará com que o formulário declarado na página JSP, em conjunto com TagLibs, seja associado ao nosso DynaForm dinamicamente, tanto para leitura quanto para escrita. Caso nosso Form já contenha valores iniciais, estes valores serão automaticamente setados em nosso formulário jsp, sem que seja preciso que você fique abrindo tags (scriptlets).

A única coisa que precisamos fazer para que os forms sejam associados, é colocarmos os mesmos nomes de nossos campos e de nossos atributos no DynaForm, ou seja, se tivermos um atributo chamado “login” em nosso DynaForm basta declararmos um campo com o nome de login em nossa JSP, assim como mostra a Listagem 10 que é a nossa página contendo um formulário de Login.


net-22-04-2008pic02.JPG 

Listagem 10. Página JSP de login.

 

No código apresentado na Listagem 10 utilizamos TagLibs. Caso queiramos que as propriedades de nosso DynaForm inicie com um valor default, o que precisamos fazer é simplesmente colocar a opção initial em cada uma das properties do DynaForm, conforme o exemplo abaixo:

 

Mas agora, como é que o struts vai saber qual form ele deve usar para aquela página JSP específica? Bom, o struts é inteligente, mas também não faz mágica. A única coisa que você precisa fazer é definir na declaração de seu Action que o form usado será o nosso DynaForm. Para essa definição não há segredos, pois deve-se declarar ele na action como se fosse uma classe normal que você mesmo tivesse criado (ver Listagem 11).


net-22-04-2008pic03.JPG
Listagem 11.
Action declarando o uso de um DynaForm.

 

Você deve ter notado que definimos nosso form como tendo um escopo de sessão, ou seja, todas as informações guardadas uma vez ficarão na sessão, de onde podemos requisitá-las mais tarde, até que a sessão do usuário expire. É importante ressaltar que informações gravadas na sessão só são realmente necessárias quando você realmente for reutilizá-las mais tarde, ou caso você queira manter o estado de uma tela, como a seleção de um filtro para pesquisa.

Assim que um post (submit) for feito, nosso formulário será repassado para a action declarada no formulário html. Dentro de nossa action fazemos um Cast para DynaActionForm para que possamos recuperar os dados gravados dentro desse form. Lembando que um DynaForm é nada mais que um Map, e por isso recuperamos os valores por ele guardados conforme a Listagem 12.

 

DynaActionForm dynaForm = (DynaActionForm) form;

String login = (String) dynaForm.get("login");

String senha = (String) dynaForm.get("senha");

Listagem 12. Recuperando valores salvos em nosso DynaForm.

 

Aproveitando o código da Listagem 12, temos o código abaixo que mostra como podemos salvar novos valores nos atributos de nosso DynaForm, que na verdade é nada mais que um Map. Em nosso caso, após termos feito o login e termos feito toda a validação do usuário, iremos guardar o ID desse usuário, para que mais tarde ele possa ser requisitado para alguma outra ação que queiramos fazer.

 

dynaForm.set("id", "1"); //colocamos um valor fixo como exemplo

 

No código acima, a String passada será o nome do atributo de nosso form. O segundo parâmetro será o objeto a ser gravado nesse atributo, que no caso seria o ID do usuário na sua base de autenticação, seja ela em banco de dados, LDAP, etc.

É importante ressaltar que ao declararmos um DynaForm, todos os seus atributos serão definidos (set) para os valores default do Java, caso não o tenhamos inicializado com algum valor, ou seja, serão atribuídos 0 para numéricos e null para objetos, lembrando que String é um objeto, embora, muitas vezes seja tratado como tipo primitivo.

Caso a validação deste formulário seja necessária, seja para verificar se o usuário preencheu todos os campos, ou se o valor digitado é um valor válido, o que temos que fazer é dizer que nosso form será do tipo DynaValidatorForm e também dizermos que quando a action for chamada, ele vai requerer uma validação dos campos (validate=”true”) (Listagem 13). E é claro que temos que definir os campos de nosso form no arquivo validation.xml. Entretanto, o plug-in Validator do struts não será tratado neste artigo, mas na Nota 3 você pode conferir uma breve descrição de mais essa facilidade.

 

Nota 3. Validator.

Este plug-in possui diversas funções escritas em JavaScript para as mais corriqueiras validações. Sendo as validações escritas em JavaScript, estas serão feitas diretamente no lado do cliente sem que seja preciso postar todos os dados até seu servidor. Isto diminui o tráfego de dados e processamento de seu servidor, dando um retorno mais rápido para o usuário de algum erro no preenchimento dos dados. Além de todas as funções já prontas que ele traz, é ainda facilmente extensível e reaproveitável.

 

net-22-04-2008pic04.JPG

Listagem 13. DynaValidatorForm e sua respectiva Action requerendo sua validação.

 

Com isso conseguimos ter uma simples aplicação que engloba aspectos básicos do struts, tiles e DynaForms.

Conclusão

O objetivo desse artigo foi demonstrar o uso dos tiles e dos DynaForms, sem se estender por características básicas do struts e nem outros plug-ins. Os tiles, por exemplo, podem ser usados com outros frameworks “concorrentes”, por isso torna-se muito importante conhecê-los, visto que é uma ferramenta de simples uso e simples manutenção, sendo porém muito poderosa. Já os DynaForms ficam presos ao struts especificamente.

Uma dica interessante para empresas que desenvolvem ERP’s ou CRM’s onde o layout é sempre o mesmo, ou extremamente modular, e o fluxo de telas e menus é parecido: tiles são um prato cheio para o reaproveitamento dessa estrutura. Definindo-se a estrutura da aplicação, você só necessitará implementar as customizações para seus clientes. Temos também que a definição de DynaForms básicos como login, cadastro de cliente, e outras tarefas básicas fazem-se extremamente úteis para que sejam reutilizados entre projetos.

Seja inteligente e criativo, defina layouts e forms fáceis de serem reutilizáveis, extenda suas funcionalidades, poupe tempo e seja feliz.

Se quiser saber mais sobre o como usar o struts ou como usar o plug-in validator ou as TagLibs, veja as edições 6, 7 e 19 da revista Java Magazine, respectivamente.

Links e livros interessantes

http://struts.apache.org/: Site oficial do struts

 

http://jguru.com/faq/Struts: Ótima FAQ sobre struts.

 

http://www.portaljava.com/home/modules.php?name=Content&pa=list_pages_categories&cid=7: Tutoriais de struts.

 

http://javaboutique.internet.com/tutorials/Struts/: Tutoriais diversos de struts.

 

Dois ótimos livros são: Struts In Action de Ted Husted, Cedric Dumoulin, George Franciscus e David Winterfeldt, e The Struts Framework (The Practical Guide Series) de Sue Spielman.