O problema
Quando trabalhamos com o Struts em aplicações web que possuem formulários de postagem de dados, temos a necessidade de criar classes Java que representem esses formulários (com seus atributos) para que possamos manipular os seus conteúdos nas camadas controller e view da aplicação web (classes de ações e páginas JSP).

Criar essas classes Java, chamadas form-beans, é um trabalho bastante simples, uma vez que são simples POJOs (Plain Old Java Objects) que estendem de ActionForm ou de ValidatorForm (para formulários com suporte a validação de conteúdo) e contém os atributos necessários aos respectivos formulários com seus métodos getters/setters. Ótimo! Ou não...

Ou não, porque criar um form-bean para um formulário web, tudo bem, tranqüilo; mas criar setenta form-beans, por exemplo, seria um trabalho um tanto quanto maçante – sem contar que, além do fato de que existiriam setenta classes Java para representar formulários web, também seria necessário configurar setenta form-beans no struts-config.

1. A implementação de um form-bean com suporte a validação de conteúdo:

public class LogonForm extends ValidatorForm {
    private String login;
    private String password;
    private long roleId;

    public String getLogin() {
    return login;
    }

    public void setLogin(String login) {
    this.login = login;
    }

    public String getPassword() {
    return password;
    }

    public void setPassword(String password) {
    this.password = password;
    }

    public long getRoleId() {
    return roleId;
    }

    public void setRoleId(long roleId) {
    this.roleId = roleId;
    }
}

2. A configuração de um form-bean no struts-config:

<form-beans>
     <form-bean
        name="clienteForm" type="ClienteForm"/>
</form-beans>

A solução
Dentro desse contexto de problema que foi descrito, DynaActionForm e DynaValidatorActionForm são uma boa solução para o nosso problema.

DynaActionForm e DynaValidatorActionForm são form-beans dinâmicos criados a partir, única e exclusivamente, da sua descrição no struts-config, eliminando então, a necessidade de implementá-los em classes Java”.

O DynaValidatorActionForm
O mais comum quando trabalhamos com formulários web é aplicarmos validação ao seu conteúdo postado. Sendo assim, os exemplos apresentados nesse artigo trabalharão apenas com DynaValidatorActionForm, uma vez que a diferença entre DynaActionForm e DynaValidatorActionForm é muito pequena.

1. A descrição de um form-bean dinâmico com suporte a validação de conteúdo:

<form-beans>
     <form-bean
         name="logonForm"
         type="org.apache.struts.validator.DynaValidatorActionForm">
         <form-property
            name="login"
            type="java.lang.String"/>
         <form-property
            name="password"
            type="java.lang.String"/>
         <form-property
            name="roleId"
            type="java.lang.Long"
            initial="10"/>
         </form-bean>
</form-beans>

Obs.: Você não precisa validar o conteúdo postado pelo formulário web? Tudo bem, então você pode usar o tipo base “org.apache.struts.action.DynaActionForm”.

As propriedades dos form-beans dinâmicos suportam muitos tipos de dados, sendo eles:
• java.lang.BigDecimal
• java.lang.BigInteger
double e java.lang.Double
float e java.lang.Float
int e java.lang.Integer
long e java.lang.Long
short e java.lang.Short
• java.lang.Class
• java.lang.String
• java.sql.Date
• java.sql.Time
• java.sql.Timestamp
• java.util.ArrayList
• java.util.HashMap


2. A configuração de validação de um form-bean dinâmico com Struts Validator (validation.xml):

<form name="logonForm">
     <field
         property="login"
         depends="required">
         <arg key="logonForm.login"/>
     </field>
     <field
         property="password"
         depends="required">
         <arg key="logonForm.password"/>
     </field>
</form>

3. A utilização de um form-bean dinâmico na camada controller:

public ActionForward execute (ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
      throws Exception {

      // DynaActionForm é ancestral de DynaValidatorActionForm
      DynaActionForm logonForm = (DynaActionForm)form;

...

      User user = userBusiness.getByLoginAndPasswordAndRole(
         logonForm.getString("login"),
         logonForm.getString("password"),
         ((Long)logonForm.get("roleId")).longValue()
);

...
}

Obs.: Você também pode, se desejar, copiar o conteúdo do form-bean dinâmico para um JavaBean utilizando BeanUtils (Jakarta Commons): BeanUtils.copyProperties(user, logonForm).

4. A utilização de um form-bean dinâmico na camada view:

<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>

...

<jsp:useBean
     id="logonForm"
     scope="request"
     type="org.apache.struts.validator.DynaValidatorActionForm"/>

...

<html:javascript formName="logonForm"/>

<body>

...

<form name="logonForm" method="post" action="ProcessLogon.do" onSubmit="return validateLogonForm(this);">

...

    Usuário: <input type="text" name="login" value="<bean:write name="logonForm" property="login"/>"><br>
    Senha: <input type="text" name="password" value="<bean:write name="logonForm" property="password"/>"><br>
<input type="submit" name="btnSubmit" value="OK">

...

</body>
</html>

Obs.: Se você estiver utilizando JSTL também poderá acessar as propriedades do form-bean dinâmico normalmente: ${logonForm.map.roleId}.

Conclusão
Form-beans dinâmicos é uma boa opção para acelerar e simplificar o desenvolvimento de aplicações web que possuem formulários. “Com form-beans podemos eliminar completamente a necessidade de implementarmos classes Java que representem formulários web e obtenham o seu conteúdo para manipulação na camada controller e view da nossa aplicação web”.

A documentação dessa feature do Struts é bem escassa, mas se você quiser conhecer: <STRUTS_HOME>\webapps\struts-documentation\userGuide\building_controller.html.

Até o próximo artigo...

Yeshua HaMashiach!