Struts 2 - Estrutura de validação

Neste capítulo, examinaremos mais profundamente a estrutura de validação do Struts. No núcleo do Struts, temos a estrutura de validação que auxilia o aplicativo a executar as regras para realizar a validação antes que o método de ação seja executado.

A validação do lado do cliente geralmente é obtida usando Javascript. No entanto, não se deve confiar apenas na validação do lado do cliente. As melhores práticas sugerem que a validação deve ser introduzida em todos os níveis de sua estrutura de aplicativo. Agora, vamos examinar duas maneiras de adicionar validação ao nosso projeto Struts.

Aqui, vamos dar um exemplo de um Employee cujo nome e idade devem ser capturados usando uma página simples, e colocaremos essas duas validações para garantir que o usuário sempre insira um nome e idade que deve estar em um intervalo entre 28 e 65.

Vamos começar com a página JSP principal do exemplo.

Criar página principal

Vamos escrever o arquivo JSP da página principal index.jsp, que será usado para coletar as informações relacionadas aos Funcionários mencionadas acima.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Employee Form</title>
   </head>

   <body>
      <s:form action = "empinfo" method = "post">
         <s:textfield name = "name" label = "Name" size = "20" />
         <s:textfield name = "age" label = "Age" size = "20" />
         <s:submit name = "submit" label = "Submit" align="center" />
      </s:form>
   </body>
</html>

O index.jsp faz uso da tag Struts, que ainda não cobrimos, mas vamos estudá-los em capítulos relacionados a tags. Mas, por enquanto, apenas suponha que a tag s: textfield imprima um campo de entrada e que s: submit imprima um botão de envio. Usamos a propriedade label para cada tag, que cria um rótulo para cada tag.

Criar Vistas

Usaremos o arquivo JSP success.jsp que será chamado caso a ação definida retorne SUCCESS.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Success</title>
   </head>
   
   <body>
      Employee Information is captured successfully.
   </body>
</html>

Criar ação

Então, vamos definir uma pequena classe de ação Employeee, em seguida, adicione um método chamado validate() como mostrado abaixo em Employee.javaArquivo. Certifique-se de que sua classe de ação estende oActionSupport classe, caso contrário, seu método de validação não será executado.

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport {
   private String name;
   private int age;
   
   public String execute() {
       return SUCCESS;
   }
   
   public String getName() {
       return name;
   }
   
   public void setName(String name) {
       this.name = name;
   }
   
   public int getAge() {
       return age;
   }
   
   public void setAge(int age) {
       this.age = age;
   }

   public void validate() {
      if (name == null || name.trim().equals("")) {
         addFieldError("name","The name is required");
      }
      
      if (age < 28 || age > 65) {
         addFieldError("age","Age must be in between 28 and 65");
      }
   }
}

Conforme mostrado no exemplo acima, o método de validação verifica se o campo 'Nome' tem um valor ou não. Se nenhum valor for fornecido, adicionamos um erro de campo para o campo 'Nome' com uma mensagem de erro personalizada. Em segundo lugar, verificamos se o valor inserido para o campo 'Idade' está entre 28 e 65 ou não, caso esta condição não se cumpra adicionamos um erro acima do campo validado.

Arquivos de configuração

Finalmente, vamos colocar tudo junto usando o struts.xml arquivo de configuração da seguinte forma -

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <action name = "empinfo" 
         class = "com.tutorialspoint.struts2.Employee"
         method = "execute">
         <result name = "input">/index.jsp</result>
         <result name = "success">/success.jsp</result>
      </action>

   </package>
</struts>

A seguir está o conteúdo de web.xml arquivo -

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee"
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">

   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Agora, clique com o botão direito no nome do projeto e clique em Export > WAR Filepara criar um arquivo War. Em seguida, implante esse WAR no diretório webapps do Tomcat. Finalmente, inicie o servidor Tomcat e tente acessar o URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Isso produzirá a seguinte tela -

Agora não insira nenhuma informação necessária, basta clicar em Submitbotão. Você verá o seguinte resultado -

Insira as informações necessárias, mas insira um campo De errado, digamos que o nome seja "teste" e a idade 30 e, por fim, clique em Submitbotão. Você verá o seguinte resultado -

Como funciona essa validação?

Quando o usuário pressiona o botão enviar, o Struts 2 executará automaticamente o método de validação e se algum dos “if”as declarações listadas dentro do método são verdadeiras, o Struts 2 chamará seu método addFieldError. Se algum erro tiver sido adicionado, o Struts 2 não continuará a chamar o método execute. Em vez disso, a estrutura do Struts 2 retornaráinput como resultado de chamar a ação.

Portanto, quando a validação falha e o Struts 2 retorna input, a estrutura do Struts 2 exibirá novamente o arquivo index.jsp. Como usamos tags de formulário do Struts 2, o Struts 2 adicionará automaticamente as mensagens de erro logo acima do formulário preenchido.

Essas mensagens de erro são as que especificamos na chamada do método addFieldError. O método addFieldError leva dois argumentos. O primeiro, é oform nome do campo ao qual o erro se aplica e o segundo, é a mensagem de erro a ser exibida acima desse campo de formulário.

addFieldError("name","The name is required");

Para lidar com o valor de retorno de input precisamos adicionar o seguinte resultado ao nosso nó de ação em struts.xml.

<result name = "input">/index.jsp</result>

Validação baseada em XML

O segundo método de fazer a validação é colocar um arquivo xml próximo à classe de ação. A validação baseada em XML Struts2 oferece mais opções de validação como validação de e-mail, validação de intervalo inteiro, campo de validação de formulário, validação de expressão, validação de regex, validação necessária, validação de string necessária, validação de comprimento de string e etc.

O arquivo xml precisa ser nomeado '[action-class]'-validation.xml. Então, no nosso caso, criamos um arquivo chamadoEmployee-validation.xml com os seguintes conteúdos -

<!DOCTYPE validators PUBLIC 
   "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
   "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
   <field name = "name">
      <field-validator type = "required">
         <message>
            The name is required.
         </message>
      </field-validator>
   </field>

   <field name = "age">
     <field-validator type = "int">
         <param name = "min">29</param>
         <param name = "max">64</param>
         <message>
            Age must be in between 28 and 65
         </message>
      </field-validator>
   </field>
</validators>

O arquivo XML acima seria mantido em seu CLASSPATH de preferência junto com o arquivo de classe. Deixe-nos ter nossa classe de ação do funcionário como segue, sem tervalidate() método -

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport{
   private String name;
   private int age;
   
   public String execute() {
       return SUCCESS;
   }
   
   public String getName() {
       return name;
   }
   
   public void setName(String name) {
       this.name = name;
   }
   
   public int getAge() {
       return age;
   }
   
   public void setAge(int age) {
       this.age = age;
   }
}

O resto da configuração permanecerá como no exemplo anterior, agora se você executar o aplicativo, ele produzirá o mesmo resultado que recebemos no exemplo anterior.

A vantagem de ter um arquivo xml para armazenar a configuração permite separar a validação do código da aplicação. Você pode fazer com que um desenvolvedor escreva o código e um analista de negócios para criar os arquivos xml de validação. Outra coisa a se observar são os tipos de validador disponíveis por padrão.

Existem muitos outros validadores que vêm por padrão com o Struts. Os validadores comuns incluem validador de data, validador Regex e validador de comprimento de string. Verifique o link a seguir para obter mais detalhes Struts - Validadores baseados em XML .