Struts2 es un marco de aplicación web popular y maduro basado en el patrón de diseño MVC. Struts2 no es solo la próxima versión de Struts 1, sino que es una reescritura completa de la arquitectura Struts.

Estas son algunas de las excelentes características que pueden obligarlo a considerar Struts2:

  • POJO forms and POJO actions- Struts2 ha eliminado los Action Forms que eran parte integral del marco de Struts. Con Struts2, puede usar cualquier POJO para recibir la entrada del formulario. Del mismo modo, ahora puede ver cualquier POJO como una clase de acción.

  • Tag support - Struts2 ha mejorado las etiquetas de formulario y las nuevas etiquetas permiten a los desarrolladores escribir menos código.

  • AJAX support - Struts2 ha reconocido la adopción de las tecnologías Web2.0 y ha integrado el soporte AJAX en el producto mediante la creación de etiquetas AJAX, que funcionan de manera muy similar a las etiquetas Struts2 estándar.

  • Easy Integration - La integración con otros marcos como Spring, Tiles y SiteMesh ahora es más fácil con una variedad de integración disponible con Struts2.

  • Template Support - Soporte para generar vistas usando plantillas.

  • Plugin Support- El comportamiento principal de Struts2 se puede mejorar y aumentar mediante el uso de complementos. Hay varios complementos disponibles para Struts2.

El patrón Modelo-Vista-Controlador en Struts2 se realiza con los siguientes cinco componentes principales:

  • Actions

  • Interceptors

  • Pila de valor / OGNL

  • Resultados / tipos de resultados

  • Ver tecnologías

A continuación se muestra el ciclo de vida de una solicitud en la aplicación Struct2:

  • El usuario envía una solicitud al servidor para solicitar algún recurso (es decir, páginas).

  • FilterDispatcher examina la solicitud y luego determina la acción adecuada.

  • Se aplican las funcionalidades de interceptores configurados, como validación, carga de archivos, etc.

  • Se ejecuta la acción seleccionada para realizar la operación solicitada.

  • Nuevamente, los interceptores configurados se aplican para realizar cualquier posprocesamiento si es necesario.

  • Finalmente, el resultado es preparado por la vista y devuelve el resultado al usuario.

El archivo struts.xml contiene la información de configuración que modificará a medida que se desarrollen las acciones. Este archivo se puede utilizar para anular la configuración predeterminada de una aplicación, por ejemplo struts.devMode = false y otras configuraciones que se definen en el archivo de propiedades. Este archivo se puede crear en la carpeta WEB-INF / classes.

La etiqueta constante junto con los atributos de nombre y valor se usará para anular cualquiera de las siguientes propiedades definidas en default.properties, como si acabamos de establecer la propiedad struts.devMode. Establecer la propiedad struts.devMode nos permite ver más mensajes de depuración en el archivo de registro.

Definimos etiquetas de acción que corresponden a cada URL a la que queremos acceder y definimos una clase con el método execute () a la que se accederá cada vez que accedamos a la URL correspondiente.

Los resultados determinan qué se devuelve al navegador después de que se ejecuta una acción. La cadena devuelta por la acción debe ser el nombre de un resultado. Los resultados se configuran por acción como antes, o como un resultado "global", disponible para cada acción en un paquete. Los resultados tienen atributos opcionales de nombre y tipo. El valor de nombre predeterminado es "éxito".

El archivo de configuración struts-config.xml es un vínculo entre los componentes de Vista y Modelo en el Cliente Web.

Aquí es donde asigna su subclase ActionForm a un nombre. Utiliza este nombre como un alias para su ActionForm en el resto del archivo struts-config.xml, e incluso en sus páginas JSP.

Esta sección asigna una página en su aplicación web a un nombre. Puede utilizar este nombre para hacer referencia a la página real. Esto evita la codificación de URL en sus páginas web.

Aquí es donde declaras los controladores de formulario y también se conocen como asignaciones de acciones.

Esta sección le dice a Struts dónde encontrar sus archivos de propiedades, que contienen indicaciones y mensajes de error.

Este archivo de configuración proporciona un mecanismo para cambiar el comportamiento predeterminado del marco. En realidad, todas las propiedades contenidas en el archivo de configuración struts.properties también se pueden configurar en web.xml usando init-param, así como usando la etiqueta constante en el archivo de configuración struts.xml. Pero si desea mantener las cosas separadas y más específicas, puede crear este archivo en la carpeta WEB-INF / classes. Los valores configurados en este archivo anularán los valores predeterminados configurados en default.properties que está contenido en la distribución struts2-core-xyzjar.

Los interceptores son conceptualmente los mismos que los filtros de servlets o la clase de proxy JDK. Los interceptores permiten que la funcionalidad transversal se implemente por separado de la acción y del marco. Puede lograr lo siguiente utilizando interceptores:

  • Proporcionar lógica de preprocesamiento antes de que se llame a la acción.

  • Proporcionar lógica de posprocesamiento después de llamar a la acción.

  • Captura de excepciones para que se pueda realizar un procesamiento alternativo.

Crear un interceptor personalizado es fácil; la interfaz que debe ampliarse es la interfaz Interceptor.

La acción real se ejecutará utilizando el interceptor mediante la llamada invocation.invoke (). Por lo tanto, puede realizar un procesamiento previo y un procesamiento posterior según sus requisitos.

El marco en sí mismo inicia el proceso haciendo la primera llamada al invoke () del objeto ActionInvocation. Cada vez que se llama a invoke (), ActionInvocation consulta su estado y ejecuta el interceptor que venga a continuación. Cuando se hayan invocado todos los interceptores configurados, el método invoke () hará que se ejecute la acción en sí.

La clase Acción gestiona el estado de la aplicación y el Tipo de resultado gestiona la vista.

El tipo de resultado predeterminado es dispatcher, que se utiliza para enviar a páginas JSP.

El tipo de resultado del despachador es el tipo predeterminado y se utiliza si no se especifica ningún otro tipo de resultado. Se utiliza para reenviar a un servlet, JSP, página HTML, etc., en el servidor. Utiliza el método RequestDispatcher.forward ().

El tipo de resultado de redireccionamiento llama al método response.sendRedirect () estándar, lo que hace que el navegador cree una nueva solicitud a la ubicación dada. Podemos proporcionar la ubicación en el cuerpo del elemento <result ...> o como un elemento <param name = "location">.

La pila de valores es un conjunto de varios objetos que mantiene los siguientes objetos en el orden proporcionado:

  • Temporary Objects- Hay varios objetos temporales que se crean durante la ejecución de una página. Por ejemplo, el valor de iteración actual para una colección que se repite en una etiqueta JSP.

  • The Model Object - Si está utilizando objetos de modelo en su aplicación de struts, el objeto de modelo actual se coloca antes de la acción en la pila de valores.

  • The Action Object - Este será el objeto de acción actual que se está ejecutando.

  • Named Objects - Estos objetos incluyen #application, #session, #request, #attr y #parameters y hacen referencia a los ámbitos de servlet correspondientes.

El lenguaje de navegación de gráficos de objetos (OGNL) es un poderoso lenguaje de expresión que se utiliza para hacer referencia y manipular datos en ValueStack. OGNL también ayuda en la transferencia de datos y conversión de tipos.

El mapa ActionContext consta de lo siguiente:

  • application - variables de ámbito de aplicación.

  • session - variables de ámbito de sesión.

  • root / value stack - todas sus variables de acción se almacenan aquí.

  • request - solicitar variables de ámbito.

  • parameters - solicitar parámetros.

  • atributes - los atributos almacenados en la página, la solicitud, la sesión y el alcance de la aplicación.

La carga de archivos en Struts es posible a través de un interceptor predefinido llamado interceptor FileUpload que está disponible a través de la clase org.apache.struts2.interceptor.FileUploadInterceptor e incluido como parte de defaultStack.

A continuación se muestran las propiedades de configuración de Struts2 que controlan el proceso de carga de archivos:

  • struts.multipart.maxSize- El tamaño máximo (en bytes) de un archivo que se aceptará como carga de archivo. El valor predeterminado es 250M.

  • struts.multipart.parser- La biblioteca utilizada para cargar el formulario de varias partes. Por defecto es jakarta.

  • struts.multipart.saveDir- La ubicación para almacenar el archivo temporal. Por defecto es javax.servlet.context.tempdir.

El interceptor fileUplaod utiliza varias claves de mensaje de error predeterminadas:

  • struts.messages.error.uploading - Un error general que ocurre cuando no se pudo cargar el archivo.

  • struts.messages.error.file.too.large - Ocurre cuando el archivo cargado es demasiado grande según lo especificado por maximumSize.

  • struts.messages.error.content.type.not.allowed - Ocurre cuando el archivo cargado no coincide con los tipos de contenido esperados especificados.

Puede invalidar el texto de estos mensajes en los archivos de recursos WebContent / WEB-INF / classes / messages.properties.

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 clase de acción debe extender la clase ActionSupport para que se ejecute el método de validación.

Cuando el usuario presiona el botón enviar, Struts 2 ejecutará automáticamente el método de validación y si alguna de las declaraciones if enumeradas dentro del método es verdadera, 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 devolverá la entrada como resultado de llamar a la acción.

Entonces, cuando la validación falla y Struts 2 devuelve la entrada, el marco de Struts 2 volverá a mostrar el archivo de vista. 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 el nombre del campo de formulario al que se aplica el error y el segundo es el mensaje de error que se muestra sobre ese campo de formulario.

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 llamarse '[clase de acción]' - validation.xml.

A continuación se muestra la lista de varios tipos de validación a nivel de campo y no a nivel de campo disponibles en Struts2:

  • validador de fecha

  • validador doble

  • validador de correo electrónico

  • validador de expresiones

  • validador int

  • validador de expresiones regulares

  • validador requerido

  • validador de cadena requerida

  • validador de longitud de cadena

  • validador de URL

La internacionalización (i18n) es el proceso de planificación e implementación de productos y servicios para que puedan adaptarse fácilmente a idiomas y culturas locales específicos, un proceso llamado localización. El proceso de internacionalización a veces se denomina habilitación de traducción o localización.

Struts2 proporciona localización, es decir. Soporte de internacionalización (i18n) a través de paquetes de recursos, interceptores y bibliotecas de etiquetas en los siguientes lugares:

  • Las etiquetas de la interfaz de usuario.

  • Mensajes y errores.

  • Dentro de las clases de acción.

El formato de nomenclatura más simple para un archivo de recursos es:

bundlename_language_country.properties

Aquí el nombre del paquete podría ser ActionClass, Interface, SuperClass, Model, Package, Global resource properties. La siguiente parte language_country representa la configuración regional del país, por ejemplo, la configuración regional en español (España) está representada por es_ES y la configuración regional en inglés (Estados Unidos) está representada por en_US, etc. Aquí puede omitir la parte del país, que es opcional.

Cuando hace referencia a un elemento de mensaje por su clave, el marco de Struts busca un paquete de mensajes correspondiente en el siguiente orden:

  • ActionClass.properties

  • Interface.properties

  • SuperClass.properties

  • model.properties

  • package.properties

  • struts.properties

  • global.properties

La clase StrutsTypeConverter le dice a Struts cómo convertir Environment a String y viceversa anulando dos métodos convertFromString () y convertToString ().

Struts 2 viene con tres temas integrados:

  • simple theme- Un tema minimalista sin "campanas y silbidos". Por ejemplo, la etiqueta de campo de texto muestra la etiqueta HTML <input /> sin etiqueta, validación, informe de errores o cualquier otro formato o funcionalidad.

  • xhtml theme - Este es el tema predeterminado utilizado por Struts 2 y proporciona todos los conceptos básicos que proporciona el tema simple y agrega varias características como el diseño de tabla estándar de dos columnas para el HTML, Etiquetas para cada uno de los HTML, Validación e informes de errores, etc.

  • css_xhtml theme - Este tema proporciona todos los conceptos básicos que proporciona el tema simple y agrega varias características como el diseño estándar basado en CSS de dos columnas, usando <div> para las etiquetas HTML Struts, etiquetas para cada una de las etiquetas HTML Struts, colocadas de acuerdo con el CSS hoja de estilo.

Struts facilita el manejo de excepciones mediante el uso del interceptor de "excepciones". El interceptor de "excepción" se incluye como parte de la pila predeterminada, por lo que no tiene que hacer nada más para configurarlo. Está disponible listo para usar y listo para usar.

Una anotación @Results es una colección de resultados. Bajo la anotación @Results, podemos tener varias anotaciones @Result.

@Results({
   @Result(name = "success", value = "/success.jsp"),
   @Result(name = "error", value = "/error.jsp")
})
public class Employee extends ActionSupport{
 ...
}

Las anotaciones @result tienen el nombre que corresponde al resultado del método de ejecución. También contienen una ubicación en cuanto a qué vista se debe servir correspondiente al valor de retorno de execute ().

@Result(name = "success", value = "/success.jsp")
public class Employee extends ActionSupport{
 ...
}

Esto se usa para decorar el método execute (). El método Action también toma un valor que es la URL en la que se invoca la acción.

public class Employee extends ActionSupport{
   private String name;
   private int age;
   @Action(value = "/empinfo")
   public String execute() {
      return SUCCESS;
   }
}

La anotación @After marca un método de acción que debe llamarse después de que se ejecutó el método de acción principal y el resultado. El valor de retorno se ignora.

public class Employee extends ActionSupport{
   @After
   public void isValid() throws ValidationException {
      // validate model object, throw exception if failed
   }
   public String execute() {
      // perform secure action
      return SUCCESS;
   }
}

La anotación @Before marca un método de acción que debe llamarse antes de que se ejecute el método de acción principal y el resultado. El valor de retorno se ignora.

public class Employee extends ActionSupport{
   @Before
   public void isAuthorized() throws AuthenticationException {
      // authorize request, throw exception if failed
   }
   public String execute() {
      // perform secure action
      return SUCCESS;
   }
}

La anotación @BeforeResult marca un método de acción que debe ejecutarse antes del resultado. El valor de retorno se ignora.

public class Employee extends ActionSupport{
   @BeforeResult
   public void isValid() throws ValidationException {
    // validate model object, throw exception if failed
   }
   public String execute() {
      // perform action
      return SUCCESS;
   }
}

Esta anotación de validación comprueba si hay errores de conversión para un campo y los aplica si existen.

public class Employee extends ActionSupport{
   @ConversionErrorFieldValidator(message = "Default message", 
                        key = "i18n.key", shortCircuit = true)
   public String getName() {
       return name;
   }
}

Esta anotación de validación verifica que un campo de fecha tenga un valor dentro de un rango especificado.

public class Employee extends ActionSupport{
   @DateRangeFieldValidator(message = "Default message", 
   key = "i18n.key", shortCircuit = true, 
   min = "2005/01/01", max = "2005/12/31")
   public String getDOB() {
       return dob;
   }
}

Esta anotación de validación verifica que un campo doble tenga un valor dentro de un rango especificado. Si no se establece ni mínimo ni máximo, no se hará nada.

public class Employee extends ActionSupport{
   @DoubleRangeFieldValidator(message = "Default message", 
   key = "i18n.key", shortCircuit = true, 
   minInclusive = "0.123", maxInclusive = "99.987")
   public String getIncome() {
       return income;
   }
}

Esta anotación de validación verifica que un campo sea una dirección de correo electrónico válida si contiene una Cadena no vacía.

public class Employee extends ActionSupport{
   @EmailValidator(message = "Default message", 
   key = "i18n.key", shortCircuit = true)
   public String getEmail() {
       return email;
   }
}

Este validador de nivel que no es de campo valida una expresión regular proporcionada.

@ExpressionValidator(message = "Default message", key = "i18n.key", 
shortCircuit = true, expression = "an OGNL expression" )

Esta anotación de validación verifica que un campo numérico tenga un valor dentro de un rango especificado. Si no se establece ni mínimo ni máximo, no se hará nada.

public class Employee extends ActionSupport{
   @IntRangeFieldValidator(message = "Default message", 
   key = "i18n.key", shortCircuit = true, 
   min = "0", max = "42")
   public String getAge() {
       return age;
   }
}

Esta anotación valida un campo de cadena usando una expresión regular.

@RegexFieldValidator( key = "regex.field", expression = "yourregexp")

Esta anotación de validación comprueba que un campo no sea nulo. La anotación debe aplicarse a nivel de método.

public class Employee extends ActionSupport{
   @RequiredFieldValidator(message = "Default message", 
   key = "i18n.key", shortCircuit = true)
   public String getAge() {
       return age;
   }
}

Esta anotación de validación comprueba que un campo de cadena no esté vacío (es decir, no nulo con una longitud> 0).

public class Employee extends ActionSupport{
   @RequiredStringValidator(message = "Default message", 
   key = "i18n.key", shortCircuit = true, trim = true)
   public String getName() {
       return name;
   }
}

Este validador comprueba que un campo de cadena tenga la longitud correcta. Asume que el campo es una Cadena. Si no se establece ni minLength ni maxLength, no se hará nada.

public class Employee extends ActionSupport{
   @StringLengthFieldValidator(message = "Default message", 
   key = "i18n.key", shortCircuit = true, 
   trim = true, minLength = "5",  maxLength = "12")
   public String getName() {
       return name;
   }
}

Este validador verifica que un campo sea una URL válida.

public class Employee extends ActionSupport{
   @UrlValidator(message = "Default message", 
   key = "i18n.key", shortCircuit = true)
   public String getURL() {
       return url;
   }
}

Si desea utilizar varias anotaciones del mismo tipo, estas anotaciones deben estar anidadas dentro de la anotación @Validations ().

public class Employee extends ActionSupport{
  @Validations(
   requiredFields =
      {@RequiredFieldValidator(type = ValidatorType.SIMPLE, 
      fieldName = "customfield", 
      message = "You must enter a value for field.")},
   requiredStrings =
      {@RequiredStringValidator(type = ValidatorType.SIMPLE, 
      fieldName = "stringisrequired", 
      message = "You must enter a value for string.")}
   )
   public String getName() {
       return name;
   }
}

Esta anotación se puede utilizar para validadores personalizados. Utilice la anotación ValidationParameter para proporcionar parámetros adicionales.

@CustomValidator(type ="customValidatorName", fieldName = "myField")

Esta es una anotación de marcador para conversiones de tipo a nivel de tipo. La anotación de conversión debe aplicarse a nivel de tipo.

@Conversion()
   public class ConversionAction implements Action {
}

Esta anotación establece CreateIfNull para la conversión de tipos. La anotación CreateIfNull debe aplicarse a nivel de campo o método.

@CreateIfNull( value = true )
private List<User> users;

Esta anotación establece el elemento para la conversión de tipos. La anotación de elemento debe aplicarse a nivel de campo o método.

@Element( value = com.acme.User )
private List<User> userList;

Esta anotación establece la clave para la conversión de tipos. La anotación clave debe aplicarse a nivel de campo o método.

@Key( value = java.lang.Long.class )
private Map<Long, User> userMap;

Esta anotación establece KeyProperty para la conversión de tipos. La anotación KeyProperty debe aplicarse a nivel de campo o método.

@KeyProperty( value = "userName" )
protected List<User> users = null;

Esta anotación de anotación se utiliza para las reglas de conversión de toda la aplicación y la clase. La anotación TypeConversion se puede aplicar a nivel de propiedad y método.

@TypeConversion(rule = ConversionRule.COLLECTION, 
converter = "java.util.String")
public void setUsers( List users ) {
   this.users = users;
}