Struts 2 - Marco de validaciones

En este capítulo, profundizaremos en el marco de validación de Struts. En el núcleo de Struts, tenemos el marco de validación que ayuda a la aplicación a ejecutar las reglas para realizar la validación antes de que se ejecute el método de acción.

La validación del lado del cliente generalmente se logra mediante Javascript. Sin embargo, no se debe confiar únicamente en la validación del lado del cliente. Las mejores prácticas sugieren que la validación debe introducirse en todos los niveles del marco de su aplicación. Ahora veamos dos formas de agregar validación a nuestro proyecto Struts.

Aquí, tomaremos un ejemplo de Employee cuyo nombre y edad deben ser capturados usando una simple página, y colocaremos estas dos validaciones para asegurarnos de que el usuario ingrese siempre un nombre y edad que debe estar en un rango entre 28 y 65.

Comencemos con la página JSP principal del ejemplo.

Crear página principal

Escribamos el archivo JSP de la página principal index.jsp, que se utilizará para recopilar la información relacionada con los empleados mencionada anteriormente.

<%@ 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>

El index.jsp hace uso de la etiqueta Struts, que aún no hemos cubierto, pero las estudiaremos en los capítulos relacionados con las etiquetas. Pero por ahora, suponga que la etiqueta s: textfield imprime un campo de entrada y s: submit imprime un botón de envío. Hemos utilizado la propiedad de etiqueta para cada etiqueta que crea una etiqueta para cada etiqueta.

Crear vistas

Usaremos el archivo JSP success.jsp que se invocará en caso de que la acción definida devuelva 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>

Crear acción

Así que definamos una pequeña clase de acción. Employeey luego agregue un método llamado validate() como se muestra a continuación en Employee.javaarchivo. Asegúrese de que su clase de acción amplíe elActionSupport class, de lo contrario, su método de validación no se ejecutará.

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");
      }
   }
}

Como se muestra en el ejemplo anterior, el método de validación verifica si el campo 'Nombre' tiene un valor o no. Si no se ha proporcionado ningún valor, agregamos un error de campo para el campo 'Nombre' con un mensaje de error personalizado. En segundo lugar, verificamos si el valor ingresado para el campo 'Edad' está entre 28 y 65 o no, si esta condición no se cumple agregamos un error sobre el campo validado.

Archivos de configuración

Finalmente, juntemos todo usando el struts.xml archivo de configuración de la siguiente manera:

<?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 continuación se muestra el contenido de web.xml archivo -

<?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>

Ahora, haga clic derecho en el nombre del proyecto y haga clic en Export > WAR Filepara crear un archivo War. Luego, implemente este WAR en el directorio de aplicaciones web de Tomcat. Finalmente, inicie el servidor Tomcat e intente acceder a la URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Esto producirá la siguiente pantalla:

Ahora no ingrese ninguna información requerida, simplemente haga clic en Submitbotón. Verá el siguiente resultado:

Ingrese la información requerida pero ingrese un campo De incorrecto, digamos el nombre como "prueba" y la edad como 30, y finalmente haga clic en Submitbotón. Verá el siguiente resultado:

¿Cómo funciona esta validación?

Cuando el usuario presiona el botón enviar, Struts 2 ejecutará automáticamente el método de validación y, si alguno de los “if”Las declaraciones enumeradas dentro del método son verdaderas, Struts 2 llamará a su método addFieldError. Si se han agregado errores, Struts 2 no procederá a llamar al método de ejecución. Más bien, el marco de Struts 2 volveráinput como resultado de llamar a la acción.

Por lo tanto, cuando la validación falla y Struts 2 regresa input, el marco de Struts 2 volverá a mostrar el archivo index.jsp. Dado que usamos etiquetas de formulario de Struts 2, Struts 2 agregará automáticamente los mensajes de error justo encima del formulario presentado.

Estos mensajes de error son los que especificamos en la llamada al método addFieldError. El método addFieldError toma dos argumentos. El primero es elform el nombre del campo al que se aplica el error y el segundo, es el mensaje de error que se mostrará sobre ese campo de formulario.

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

Para manejar el valor de retorno de input necesitamos agregar el siguiente resultado a nuestro nodo de acción en struts.xml.

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

Validación basada en XML

El segundo método para realizar la validación es colocar un archivo xml junto a la clase de acción. La validación basada en XML de Struts2 proporciona más opciones de validación como validación de correo electrónico, validación de rango entero, campo de validación de formulario, validación de expresión, validación de expresiones regulares, validación requerida, validación de cadena requerida, validación de longitud de cadena, etc.

El archivo xml debe tener un nombre '[action-class]'-validation.xml. Entonces, en nuestro caso creamos un archivo llamadoEmployee-validation.xml con los siguientes contenidos -

<!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>

El archivo XML anterior se mantendría en su CLASSPATH idealmente junto con el archivo de clase. Tengamos nuestra clase de acción para empleados de la siguiente manera sin tenervalidate() 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;
   }
}

El resto de la configuración permanecerá como está en el ejemplo anterior, ahora si ejecuta la aplicación, producirá el mismo resultado que recibimos en el ejemplo anterior.

La ventaja de tener un archivo xml para almacenar la configuración permite separar la validación del código de la aplicación. Puede conseguir que un desarrollador escriba el código y un analista de negocios para crear los archivos xml de validación. Otra cosa a tener en cuenta son los tipos de validadores que están disponibles de forma predeterminada.

Hay muchos más validadores que vienen con Struts por defecto. Los validadores comunes incluyen el validador de fecha, el validador de expresiones regulares y el validador de longitud de cadena. Consulte el siguiente enlace para obtener más detalles Struts - Validadores basados ​​en XML .