Struts 2 - Conversión de tipo

Todo en una solicitud HTTP se trata como un Stringpor el protocolo. Esto incluye números, valores booleanos, enteros, fechas, decimales y todo lo demás. Sin embargo, en la clase Struts, podría tener propiedades de cualquier tipo de datos.

¿Cómo realiza Struts el cableado automático de las propiedades?

Struts utiliza una variedad de convertidores de tipo debajo de las cubiertas para hacer el trabajo pesado.

Por ejemplo, si tiene un atributo entero en su clase Action, Struts convierte automáticamente el parámetro de solicitud en el atributo entero sin que usted haga nada. De forma predeterminada, Struts viene con varios convertidores de tipo

Si está utilizando alguno de los convertidores enumerados a continuación, entonces no tiene nada de qué preocuparse:

  • Entero, Flotante, Doble, Decimal
  • Fecha y fecha y hora
  • Matrices y colecciones
  • Enumerations
  • Boolean
  • BigDecimal

En ocasiones, cuando utiliza su propio tipo de datos, es necesario agregar sus propios convertidores para que Struts sepa cómo convertir esos valores antes de mostrarlos. Considere la siguiente clase POJOEnvironment.java.

package com.tutorialspoint.struts2;

public class Environment {
   private String name;
   
   public  Environment(String name) {
      this.name = name;
   }
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
}

Esta es una clase muy simple que tiene un atributo llamado name, así que no hay nada especial en esta clase. Creemos otra clase que contenga información sobre el sistema:SystemDetails.java.

A los efectos de este ejercicio, he codificado el entorno en "Desarrollo" y el sistema operativo en "Windows XP SP3".

En un proyecto en tiempo real, obtendría esta información de la configuración del sistema.

Tengamos la siguiente clase de acción:

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;

public class SystemDetails extends ActionSupport {
   private Environment environment = new Environment("Development");
   private String operatingSystem = "Windows XP SP3";

   public String execute() {
      return SUCCESS;
   }
   
   public Environment getEnvironment() {
      return environment;
   }
   
   public void setEnvironment(Environment environment) {
      this.environment = environment;
   }
   
   public String getOperatingSystem() {
      return operatingSystem;
   }
   
   public void setOperatingSystem(String operatingSystem) {
      this.operatingSystem = operatingSystem;
   }
}

A continuación, creemos un archivo JSP simple System.jsp para mostrar la información del entorno y del sistema operativo.

<%@ 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>System Details</title>
   </head>
   
   <body>
      Environment: <s:property value = "environment"/><br/>
      Operating System:<s:property value = "operatingSystem"/>
   </body>
</html>

Cableemos el system.jsp y el SystemDetails.java clase juntos usando struts.xml.

La clase SystemDetails tiene un método simple execute () que devuelve la cadena "SUCCESS".

<?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 = "system" 
            class = "com.tutorialspoint.struts2.SystemDetails" 
            method = "execute">
         <result name = "success">/System.jsp</result>
      </action>
   </package>
</struts>
  • Haga clic derecho en el nombre del proyecto y haga clic en Export > WAR File para 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 URL http://localhost:8080/HelloWorldStruts2/system.action. Esto producirá la siguiente pantalla:

¿Qué hay de malo en la salida anterior? Struts sabe cómo mostrar y convertir la cadena "Windows XP SP3" y otros tipos de datos integrados, pero no sabe qué hacer con la propiedad deEnvironmenttipo. Simplemente se llamatoString() método en la clase

Para resolver este problema, creemos y registremos un simple TypeConverter para la clase de Medio Ambiente.

Crea una clase llamada EnvironmentConverter.java con lo siguiente.

package com.tutorialspoint.struts2;

import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;

public class EnvironmentConverter extends StrutsTypeConverter {
   @Override
   public Object convertFromString(Map context, String[] values, Class clazz) {
      Environment env = new Environment(values[0]);
      return env;
   }

   @Override
   public String convertToString(Map context, Object value) {
      Environment env  = (Environment) value;
      return env == null ? null : env.getName();
   }	
}

los EnvironmentConverter extiende el StrutsTypeConverter class y le dice a Struts cómo convertir Environment a String y viceversa anulando dos métodos que son convertFromString() y convertToString().

Registremos ahora este convertidor antes de usarlo en nuestra aplicación. Hay dos formas de registrar un convertidor.

Si el convertidor se usará solo en una acción en particular, entonces tendrá que crear un archivo de propiedades que debe nombrarse como '[action-class]'converstion.properties.

En nuestro caso, creamos un archivo llamado SystemDetails-converstion.properties con la siguiente entrada de registro -

environment = com.tutorialspoint.struts2.EnvironmentConverter

En el ejemplo anterior, "entorno" es el nombre de la propiedad en el SystemDetails.java clase y le estamos diciendo a Struts que use la EnvironmentConverter para convertir desde y hacia esta propiedad.

Sin embargo, no vamos a hacer esto, sino que vamos a registrar este convertidor globalmente, para que pueda usarse en toda la aplicación. Para hacer esto, cree un archivo de propiedades llamadoxwork-conversion.properties en el WEBINF/classes carpeta con la siguiente línea

com.tutorialspoint.struts2.Environment = \
   com.tutorialspoint.struts2.EnvironmentConverter

Esto simplemente registra el convertidor globalmente, de modo que Strutspuede realizar la conversión automáticamente cada vez que encuentre un objeto del tipo Entorno. Ahora, si vuelve a compilar y ejecutar el programa, obtendrá un mejor resultado de la siguiente manera:

Obviamente, ahora el resultado será mejor, lo que significa que nuestro convertidor Struts está funcionando bien.

Así es como puede crear varios convertidores y registrarlos para usarlos según sus requisitos.