• Nenhum resultado encontrado

Incluindo validação no cadastro de tarefas

No documento Java para Desenvolvimento Web (páginas 133-137)

Já conseguimos adicionar novas tarefas em nossa aplicação. Porém, o que impede de algum usuário de tentar incluir uma tarefa sem descrição? Até agora, nada. Nós queremos que um usuário não seja capaz de adicionar uma tarefa sem descrição, para isso precisamos incluir algum mecanismo de validação em nossa action de adicionar tarefas.

O Struts2 possui um poderoso framework de validações, e a maneira mais fácil de ter acesso a este fra- mework é fazendo nossa action estender a classeActionSupport. Esta classe implementa as principais interfa- ces do framework Struts2, como, por exemplo, aValidationAware. Por isso, existe uma recomendação de que as actions estendam a classeActionSupport.

public class AdicionaTarefasAction extends ActionSupport { ...

}

A partir de agora, já podemos fazer o uso do framework de validação do Struts2. As validações podem ser incluídas através de configuração no XML, anotações ou programaticamente.

XML é certamente a opção mais trabalhosa, e a forma mais interessante é utilizando anotações. A anotação principal se chama@Validations. Ela pode ser usada no nosso modelo (Tarefa) e também na action.

Por exemplo, podemos definir que desejamos validar aTarefa:

@Validations

public class Tarefa { ...

}

Mas qual seria a regra de validação? Falta definir as regras específicas, e isso também é feito através de anotações. A anotação@RequiredStringValidatorindica que o valor é obrigatório (não nulo ou vazio), com @StringLengthFieldValidatorpodemos definir o mínimo (minLength) e máximo (maxLength) de um String. Por exemplo, para definir a regra do atributodescricaoda classeTarefa:

@RequiredStringValidator(message="Valor obrigatório", shortCircuit=true)

@StringLengthFieldValidator(message="Mínimo 10 caracteres", minLength="10")

public void setDescricao(String descricao) {

this.descricao = descricao; }

O atributoshortCircuitsignifica que queremos parar com o processo de validação no caso daquela regra de validação falhar. O atributomessagedefine a mensagem de erro que poderá ser exibida na tela do usuário, desde que utilizemos a tag adequada em nosso JSP.

Existem várias outras anotações, como @RegexFieldValidator para aplicar uma expressão regular, @EmailValidator para validar um email ou @DateRangeFieldValidator que valida se a data está dentro de um range.

Mais informaões na documentação sobre as anotações do Struts2: http://struts.apache.org/2.0.14/ struts2-core/apidocs/com/opensymphony/xwork2/validator/annotations/package-summary.html

Para habilitar o framework também precisamos usar a mesma anotação@Validationsna action e indicar que queremos “visitar” o nosso modelo. Só assim as regras definidas no modelo serão verificadas:

@Validations

public class AdicionaTarefasAction extends ActionSupport {

private Tarefa tarefa;

@VisitorFieldValidator(key="tarefa")

public void setTarefa(Tarefa tarefa) {

this.tarefa = tarefa; }

//getter e método execute omitidos

}

Pronto, conseguimos definir as regras de validação para o modeloTarefa.

Existe uma maneira mais simples ainda de usar a validação com as mesmas anotações. As regras de validação podem ser definidas exclusivamente na action, ou seja, não o modeloTarefa que possui as regras, apenas a action. Veja o exemplo:

@Validations( requiredStrings={

@RequiredStringValidator(fieldName="tarefa.descricao",message="Valor obrigatório") },

stringLengthFields={

@StringLengthFieldValidator(fieldName="tarefa.descricao", minLength="5", message="Min. 5 car.")

})

public class AdicionaTarefasAction extends ActionSupport { }

Dessa maneira, apenas a action conhece as regras e, assim, a anotação @VisitorFieldValidator fi- cou desnecessária. Repare também que foi preciso avisar qual atributo no modelo deve ser validado (fieldName="tarefa.descricao

).

Como as regras de validação foram definidas, só falta informar ao struts qual é página que possui o nosso formulário para mostrar depois as mensagens. Assim quando um erro de validação acontecer, o struts irá redirecionar para essa página automaticamente. Isso é feito através da já conhecida anotação@Resultdentro da action.

@Action(value="adicionaTarefa", results = {

@Result(name="ok", location="tarefa-adicionada.jsp"),

@Result(name="input", location="/formulario-tarefas.jsp") })

public String execute() {

Material do Treinamento Java para Desenvolvimento Web

... }

É importante que o@Resultuse input comoname, só assim o Struts irá redirecionar.

Mostrando as mensagens de validação

Para exibir as mensagens de validação no JSP usamos um tag especial que o Struts oferece. O tag se chama s:fieldError:

<s:fielderror fieldName="tarefa.descricao" />

O atributo fieldName indica com que atributo essa mensagem está relacionada.

Abaixo está o código completo do formulário formulario-tarefas.jsp. Repare que é preciso importar o taglib do struts:

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

<html> <body>

<h3>Adicionar tarefas</h3>

<form action="adicionaTarefa" method="post">

Descrição:

<br/>

<textarea rows="5" cols="100" name="tarefa.descricao"></textarea> <br/>

<s:fielderror fieldName="tarefa.descricao"/> <br/>

<input type="submit" value="Adicionar"/> </form>

</body> </html>

Validando programaticamente

Quando estendemos a classeActionSupport, ganhamos também a possibilidade de realizar validações de maneira programática, ao invés da forma declarativa com XML ou anotações. Isso pode ser necessário para definir regras de validação mais customizadas, regras que não foram previstas pelas anotações já existentes no Struts.

Para realizar validações de forma programática, precisamos sobrescrever o métodovalidateque herdamos da classeActionSupport. Dentro deste método, realizaremos nossas verificações. Em nosso exemplo, vamos verificar se o texto de descricao da tarefa é nulo ou vazio. E, para incluir as mensagens de erro, utilizaremos um outro método deActionSupportchamadoaddFieldError.

public class AdicionaTarefasAction extends ActionSupport {

// ... outros metodos omitidos ...

@Override

public void validate() {

if (getTarefa().getDescricao() == null || getTarefa().getDescricao().isEmpty()){

super.addFieldError("tarefa.descricao", "Descrição não pode ser vazia" ); }

} }

Mensagens internacionalizadas

Para deixar as mensagens de validação mais fáceis de alterar, é comum criar um arquivo separado que pos- sui apenas mensagens. Este arquivo é normalmente chamado mensagens.properties ou messages.properties.

Na pasta src do projeto podemos então criar este arquivo com o seguinte conteúdo: tarefa.descricao.vazia=Descrição deve ser preenchida!

tarefa.adicionada.com.sucesso=Tarefa adicionada com sucesso!

Repare que definimos as mensagens em um estilo de: <chave>=<valor>.

O struts2 pode carregar automaticamente este arquivo, desde que a linha abaixo seja incluida no arquivo struts.xml:

<struts>

<constant name="struts.custom.i18n.resources" value="mensagens" /> </struts>

Podemos carregar mais do que um arquivo de mensagens:

<struts>

<constant name="struts.custom.i18n.resources" value="mensagens, erros" /> </struts>

O Struts2 então carrega o(s) arquivo(s) automaticamente. Dessa maneira podemos usar as chaves das mensagens dentro das anotações de validação pelo atributokey:

@RequiredFieldValidator(fieldName="tarefa.descricao", key="tarefa.descricao.vazia")

Também é possível definir a mensagem de erro programaticamente dentro do métodoexecuteda sua action. Para isso, a sua action deve estenderActionSupport:

super.addFieldError("tarefa.descricao", super.getText("tarefa.descricao.vazia")); Ou para definir uma mensagem informativa ou genérica:

super.addActionMessage(getText("tarefa.adicionada.com.sucesso"));

Material do Treinamento Java para Desenvolvimento Web

No documento Java para Desenvolvimento Web (páginas 133-137)

Documentos relacionados