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!