La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

CURSO STRUTS 2 CONVERSIÓN DE TIPOS

Presentaciones similares


Presentación del tema: "CURSO STRUTS 2 CONVERSIÓN DE TIPOS"— Transcripción de la presentación:

1 CURSO STRUTS 2 CONVERSIÓN DE TIPOS
En el siguiente apartado del curso se mostrará como gestiona Struts 2 la conversión de tipos entre los valores de una petición HTTP (Strings) a sus correspondientes atributos del Action, enumerando los conversores por defecto que dispone el framework. Además se mostrará como construir un conversor de tipos personalizado. La información que se estudiará en este apartado es: Funcionamiento de la Conversión de Tipos Conversión de tipos por defecto Conversión de tipos personalizados

2 FUNCIONAMIENTO DE LA CONVERSIÓN DE TIPOS
CURSO STRUTS 2 CONVERSIÓN DE TIPOS FUNCIONAMIENTO DE LA CONVERSIÓN DE TIPOS El Interceptor parameters El Interceptor parameters, uno de los Interceptors por defecto del package struts-default, es el responsable de la conversión de tipos entre los parámetros de la petición y los atributos del Action. Todas los parámetros de una petición son de tipo String, por este motivo todos aquellos atributos que no sean de tipo String se debe realizar una conversión de tipos. setValor(valor) request Navegador Web String Objeto Action OGNL response getValor() OGNL mediante su clase OgnlRuntime es la responsable de la conversión de tipos entre las peticiones Web y los atributos de los Actions. Si una conversión de tipos falla, por defecto, el framework no produce ningún error ni excepción, lo que hace es no asignar el valor de la petición al atributo, dejando a este con valor a null o 0 (caso de ser un atributo numérico primitivo). Para capturar es necesario que la clase Action implemente el interface ValidationAware.

3 CONVERSIÓN DE TIPOS POR DEFECTO
CURSO STRUTS 2 CONVERSIÓN DE TIPOS Ejemplo <s:label value=“Marca”/> <s:checkbox name=“marca” value=“A” checked /> <s:checkbox name=“marca” value=“B”/> <s:checkbox name=“marca” value=“C”/> Character marca = ‘A’; CONVERSIÓN DE TIPOS POR DEFECTO El motor OGNL soporta la conversión de ciertos tipos. Las conversiones de tipos que tiene implementado Struts 2 son: String boolean/Boolean char/Charater int/Integer, float/Float, long/Long y double/Double Date array List Map. Ejemplo <s:textfield name=“saludo” label=“Saludo” value=“HOLA”/> String saludo = “HOLA” Ejemplo El texto “true” y “false”, “1” y “0” puede convertirse a tipo boolean. <s:checkbox name=“activado” value=“true” label=“Activado” checked/> boolean activado = true; Ejemplo Realiza la conversión de String a java.util.Date, el formato de la fecha se basa en el idioma del usuario y utiliza el formato corto. Por ejemplo para el idioma español: dd/mm/aa <s:textfield name=“feNacimiento” label=“Fecha Nacimiento” value=“09/09/09”/> Date feNacimiento = new Date(“09/09/09”); Ejemplo Permite la conversión de tipos primitivos o de objetos de clase numérico. <s:hidden name=“id” value=“555”/> <s:textfield name=“temperatura” label=“Temperatura (ºC) value=“16.5”/> Long id=555; Float temperatura = 16.5; Ejemplo Cada elemento del array debe ser convertido al tipo del array. <s:label value=“Seleccione los elementos:”/> <s:checkbox name=“ids[0]” value=“100”/> <s:checkbox name=“ids[1]” value=“101”/> <s:checkbox name=“ids[2]” value=“102” checked/> <s:checkbox name=“ids[3]” value=“103” checked/> Long[] ids = new Long[] {102, 103}; Ejemplo Se rellena el atributo Map con objetos de tipo String por defecto, si no se especifica el tipo de los objetos. <s:textfield name=“traduccion[‘es’]” label=“Traducción Español” value=“Adiós”/> <s:textfield name=“traduccion[‘en’]” label=“Traducción Inglés” value=“Goodbye”/> <s:textfield name=“traduccion[‘it’]” label=“Traducción Italiano” value=“Ciao”/> Map<String, String> traduccion = new HashMap<String, String>(); traduccion.keys()  {“es”, “en”, “it”} traduccion.values()  {“Adiós”, “Goodbye”, “Ciao”} Ejemplo Se rellena la lista con objetos de tipo String por defecto, si no se especifica el tipo de los objetos. <s:textfield name=“telefono[0]” label=“Telefono 1” value=“ ”/> <s:textfield name=“telefono[1]” label=“Telefono 2” value=“ ”/> <s:textfield name=“telefono[2]” label=“Telefono 3” value=“ ”/> <s:textfield name=“telefono[3]” label=“Telefono 4” value=“ ”/> List<String> telefono = new ArrayList<String>(); telefono.toString()  {“ ”, “ ”, “ ”, “ ”}

4 CONVERSIÓN DE TIPOS PERSONALIZADOS
CURSO STRUTS 2 CONVERSIÓN DE TIPOS CONVERSIÓN DE TIPOS PERSONALIZADOS Struts 2 permite implementar a los desarrolladores sus propios conversores de tipos, para poder realizarlo es necesario declarar una clase que implemente el interface com.opensymphony.xwork2.conversion.TypeConverter, para que se pueda utilizar como clase convertidora de tipos personalizados. Interface TypeConverter El interface TypeConverter dispone de un único método responsable de la conversión de los tipos: java.lang.Object convertValue(java.util.Map context, java.lang.Object target, java.lang.reflect.Member member, java.lang.String propertyName, java.lang.Object value, java.lang.Class toType); Clase StrutsTypeConverter Como en la mayoría de las situaciones es necesario realizar la conversión de Objeto a String (Vista) y de String a Objeto (Modelo), Struts 2 desarrollo una clase que extiende de DefaultTypeConverter para simplificar el proceso de conversión de tipos para cualquier atributo. La clase abstracta org.apache.struts2.util.StrutsTypeConverter hereda de la clase DefaultTypeConverter, definiendo dos métodos abstract para que las clases que hereden de esta lo implementen. Estos métodos simplifican el proceso de conversión de tipos de String-Object y Object-String: abstract java.lang.Object convertFromString(java.util.Map context, java.lang.String[] values, java.lang.Class toClass) abstract java.lang.String convertToString(java.util.Map context, java.lang.Object o) La clase StrutsTypeConverter invoca a uno u otro método en función de la necesidad del tipo de conversión que necesite, la clase que herede de esta clase será la responsable de realizar las correspondientes conversiones de Objet-String y String-Object. Clase DefaultTypeConverter La clase com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter implementan el interface TypeConverter, pudiendo extender de la clase para simplificar la codificación de conversión de tipos: java.lang.Object convertValue(java.util.Map context, java.lang.Object value, java.lang.Class toType) java.lang.Object convertValue(java.lang.Object value, Aparte de estos métodos la clase DefaultTypeConverter, dispone de métodos útiles para realizar la conversión del objeto value, a distintos tipos: BigInteger, Boolean, BigDecimal, Long y String.

5 CONVERSIÓN DE TIPOS PERSONALIZADOS
CURSO STRUTS 2 CONVERSIÓN DE TIPOS CONVERSIÓN DE TIPOS PERSONALIZADOS Configuración de los Convertidores Personalizados Existen dos tipos de configuración de conversores de tipos: CONFIGURACIÓN CONVERSORES DE TIPOS DE CARÁCTER INDIVIDUAL CONFIGURACIÓN CONVERSORES DE TIPOS DE CARÁCTER GLOBAL Estructura de directorios de una aplicación Struts 2 con conversores de tipos configurados para los Actions Conversión Tipos Indivual Los pasos a seguir para configurar una conversión de tipo personalizada para un campo de un formulario son: 1. Crear un archivo de propiedades en el paquete Java donde se encuentre el Action, para definir la conversión de tipo que se le tiene que aplicar a uno o varios campos que recoge el Action. El nombre del archivo properties debe seguir el siguiente formato: ClaseAction-conversion.properties Donde la cadena “ClaseAction” representa el nombre de la clase Action a la que deseamos añadir la conversión de tipo para alguno de sus atributos. 2. Añadir una entrada en el archivo ClaseAction-conversion.properties, por cada campo del formulario que se desee realizar la conversión de tipo. La entrada tiene que seguir la siguiente sintaxis: campo1=nombreConvertidor campo2=nombreConvertidor Conversión Tipos Global Si deseamos que a un tipo determinado de atributo de la aplicación siempre se le aplique una conversión de tipo, independientemente del nombre del campo que tenga, lo que habrá que hacer es realizar una configuración global para conversión de tipos para la clase del atributo. Para realizar una configuración global de conversión de tipos para una determinada clase habrá que añadir una entrada clave-valor, en el archivo xwork-conversion.properties, que debe seguir la siguiente sintaxis: rutaClaseAtributo=rutaClaseConvertidorTipo Una vez definida esta entrada en archivo de configuración de las conversiones de tipos, se utilizará el convertidor definido para todos los atributos del tipo definido. ejemplo.capitulo2.NumeroComplejo=ejemplo.general.converter.NumeroComplejoConverter

6 numero_complejo = +/- parte_entera +/- i parte_imaginaria
CURSO STRUTS 2 CONVERSIÓN DE TIPOS CONVERSIÓN DE TIPOS PERSONALIZADOS Ejemplo Conversión de Tipos Personalizado: NumeroComplejoConverter A continuación se va a detalla la construcción del conversor de tipos de String al objeto NumeroComplejo, el conversor se llamará NumeroComplejoConverter.java. Los pasos se deben seguir para implementar la solución de conversión de tipos son: El término número complejo describe la suma de un número real y un número imaginario (que es un múltiplo real de la unidad imaginaria, que se indica con la letra i). numero_complejo = +/- parte_entera +/- i parte_imaginaria 2. Desarrollar la clase que responsable convertir de String al objeto NumeroComplejo, y viceversa. La clase debe implementar el interface TypeConverter. package ejemplo.capitulo2.converter; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; import com.opensymphony.xwork2.util.TypeConversionException; import ejercicio.capitulo2.NumeroComplejo; public class NumeroComplejoConverter extends StrutsTypeConverter { public Object convertFromString(Map context, String[] values, Class toClass) { try { String numero = values[0]; NumeroComplejo numeroComplejo = new NumeroComplejo(); numeroComplejo.setParteEntera(getParteEntera(numero)); numeroComplejo.setParteImaginaria(getParteImaginaria(numero)); return numeroComplejo; } catch (NumberFormatException e) { throw new TypeConversionException(“Formato número complejo incorrecto.”); } private Double getParteEntera(String numComplejo) throws NumberFormatException { ...... private Double getParteImaginaria(String numComplejo) throws NumberFormatException { public String convertToString(Map context, Object o) { return o.toString(); 3. Crear el archivo properties para definir la configuración de conversión de los objetos NumeroComplejo. Para este caso como es una conversión importante la definiremos como una conversión de tipos global, para toda la aplicación y no sólo para aquellos Actions, que hacen uso de ello. Creamos el archivo xwork-conversion.properties con la siguiente entrada: ejemplo.capitulo2.NumeroComplejo=ejemplo.capitulo2.converter.NumeroComplejoConverter Mediante esta solución todos aquellos Actions que tengan un atributo de tipo NumeroComplejo, automáticamente se aplicará la conversión de tipos. 1. Construir la clase NumeroComplejo.java, la cual gestionara la estructura de los números complejos. package ejemplo.capitulo2; public class NumeroComplejo { prívate Double parteEntera; private Double parteImaginaria; //métodos get y set public String toString() { String entera = “”; if (parteEntera != null) { entera = parteEntera.toString(); } String imaginaria = “”; if (parteImaginaria != null && parteImaginaria != 0) { String signo = parteImaginaria > 0 ? “ + ” : “ - “; imaginaria = signo +”i” + parteImaginaria.abs(); return entera + imaginaria;

7 CURSO STRUTS 2 CONVERSIÓN DE TIPOS RECUERDA QUE…
Una vez completado el apartado debes tener claro los siguientes conceptos relativos a la conversión de tipos: Funcionamiento de la Conversión de Tipos Todas los parámetros recibidos en una petición son de tipo String, por este motivo todos aquellos atributos que no sean de tipo String se debe realizar su correspondiente conversión de tipo. OGNL mediante su clase OgnlRuntime es la responsable de la conversión de tipos entre las peticiones Web y los atributos de los Actions. Funcionamiento Conversión Tipos por Defecto Conversores Personalizados request Navegador Web String Objeto Action OGNL Conversión de Tipos Personalizados Struts 2 permite implementar a los desarrolladores sus propios conversores de tipos, sólo es necesario un par de requisitos: una clase que implemente el interface TypeConverter, o más sencillo aún heredar de la clase StrutsTypeConverter para facilitar la implementación de los métodos de Objeto a String y de String a Objeto. public class MiConversor extends StrutsTypeConverter { public Object convertFromString(java.util.Map context, java.lang.String[] values, java.lang.Class toClass) { ... } public String convertToString(java.util.Map context, java.lang.Object o) { definir la configuración de la conversión, ya sea a nivel de Action, creando el archivo properties ClaseAction-conversion.properties, o bien de forma global creando en el directorio raíz del classpath (/WEB-INF/classes) el archivo xwork-conversion.properties. En ambos casos el contenido es el mismo definir la clase del Atributo a convertir, con su correspondiente clase Convertidora Tipos: rutaClaseDelAtribut=rutaClaseConvertidorTipos response getValor() Conversión de Tipos por Defecto El motor OGNL soporta la conversión de ciertos tipos por defecto, del valor de la petición a su correspondiente objeto: String boolean/Boolean char/Charater int/Integer, float/Float, long/Long y double/Double Date array List Map.


Descargar ppt "CURSO STRUTS 2 CONVERSIÓN DE TIPOS"

Presentaciones similares


Anuncios Google