1. El significado de la conversión de tipos.
Para un marco MVC inteligente, es inevitable implementar la conversión de tipos. Debido a que los parámetros de solicitud de las aplicaciones de estructura B/S (navegador/servidor) se envían al servidor a través del navegador, estos parámetros no pueden tener tipos de datos ricos, por lo que los tipos de datos. la conversión debe completarse en el lado del servidor
El marco MVC es una solución de capa de presentación y debería proporcionar soporte de conversión de tipos. Struts2 proporciona un soporte de conversión de tipos muy potente.
2. Procesamiento de datos de la capa de presentación.
1. Para las aplicaciones web, la capa de presentación se utiliza principalmente para interactuar con los usuarios, incluida la recopilación de datos de entrada del usuario y la presentación del estado del servidor a los usuarios. Por lo tanto, el flujo de datos en la capa de presentación tiene principalmente dos direcciones: datos de entrada y datos de salida.
2. Para datos de entrada: es necesario completar la conversión de datos de cadena a múltiples tipos de datos. Por lo general, el programa no se puede completar automáticamente y debe convertirse manualmente en el código.
3. Para datos de salida: tanto java como jsp admiten la salida directa de múltiples tipos de datos.
4. Otro procesamiento de datos en la capa de presentación es: verificación de datos, que se divide en verificación del cliente y verificación del lado del servidor. Esto se explicará en detalle más adelante.
3. Conversión de tipo
1. Los parámetros HTTP son todos tipos de cadenas. Los datos guardados pueden ser cadenas, números, booleanos, fecha y hora, etc. o tipo JavaBean. Conversión de tipo manual, como convertir una cadena en una fecha: obteniendo la cadena mediante el método request.getParameter; verificando si está vacía; convirtiendo la cadena en un objeto Date mediante el método DateFormat.parse;
2. Conversión de tipo Struts2
Conversión de tipo incorporada de Struts2
String y boolean completan la conversión entre string y valores booleanos
Conversión de cadenas y caracteres entre cadenas y caracteres ordinarios
String, int e Integer completan la conversión entre cadenas y enteros.
String y Long completan la conversión entre cadenas y valores enteros largos
String, double y Double completan la conversión de cadenas y valores de punto flotante de doble precisión.
String y Float completan la conversión entre cadenas y punto flotante de precisión simple
Cadena y Fecha completan la conversión entre tipos de cadena y fecha. El formato de fecha utiliza el formato CORTO de la configuración regional donde el usuario solicita el formato.
Cadena y matriz En el caso predeterminado, el elemento de la matriz es una cadena. Si el usuario define un convertidor de tipos, también pueden ser otros tipos de datos compuestos.
Cadena y mapa y lista
Conversión de tipo incorporada de Struts2
String y boolean completan la conversión entre string y valores booleanos
Conversión de cadenas y caracteres entre cadenas y caracteres ordinarios
String, int e Integer completan la conversión entre cadenas y enteros.
String y Long completan la conversión entre cadenas y valores enteros largos
String, double y Double completan la conversión de cadenas y valores de coma flotante de doble precisión.
String y Float completan la conversión entre cadenas y punto flotante de precisión simple
Cadena y Fecha completan la conversión entre tipos de cadena y fecha. El formato de fecha utiliza el formato CORTO de la configuración regional donde el usuario solicita el formato.
Cadena y matriz En el caso predeterminado, el elemento de la matriz es una cadena. Si el usuario define un convertidor de tipos, también pueden ser otros tipos de datos compuestos.
Cadena y mapa y lista
3. Conversión de tipo incorporada
4. API de conversión de tipo Struts
El convertidor de tipos de Struts2 en realidad se implementa en base a OGNL. Hay una interfaz ognl.TypeConverter en el proyecto OGNL. Esta interfaz es la interfaz que debe implementarse para implementar el convertidor de tipos. La interfaz se define de la siguiente manera:
interfaz pública TypeConverter {
Objeto público convertValue (Mapa arg0, Objeto arg1, Miembro arg2, Cadena arg3,
Objeto arg4, Clase arg5) {
devolver nulo;
}
Para implementar un convertidor de tipos, debe implementar el TypeConverter anterior. Sin embargo, los métodos en la interfaz anterior son demasiado complicados, por lo que el proyecto OGNL también proporciona una clase de implementación de esta interfaz: ognl.DefaultTypeConverter. Puede implementar su propio convertidor de tipos. heredando esta clase. La clase se define de la siguiente manera:
la clase pública DefaultTypeConverter extiende el objeto implementa TypeConverter {
Objeto público convertValue (Map<String,Object>context, Objectvalue, ClasstoType) {
}
……//Otros métodos
}
La función del método ConvertValue es completar la conversión de tipo, pero esta conversión de tipo es bidireccional. Cuando una cadena necesita convertirse en una instancia de objeto, este método también se utiliza cuando una instancia de objeto se convierte en una cadena. usado. Esta conversión se realiza a través del tipo de parámetro toType, que es el tipo de destino que debe convertirse. Por lo tanto, la dirección de conversión se puede determinar en función del parámetro toType.
Parámetros del método ConvertValue y significado de retorno El primer parámetro: contexto es el contexto del entorno de conversión de tipo. El segundo parámetro: valor es el parámetro que debe convertirse. El valor del parámetro de valor también es diferente según la dirección de conversión.
El tercer parámetro: toType es el tipo de destino convertido. El valor de retorno de este método es el valor después de la conversión de tipo. El tipo de valor también cambia con la dirección de la conversión. Se puede ver que el método convertValue convertido acepta el valor que debe convertirse, el tipo de destino que debe convertirse es un parámetro y luego devuelve el valor objetivo convertido.
¿Por qué Value es una matriz de cadenas?
Para el convertidor DefaultTypeConverter, debe tener en cuenta la situación más común, por lo que trata todos los parámetros de solicitud como matrices de cadenas en lugar de cadenas. Equivalente a los valores de los parámetros obtenidos por getParameterValues()
4. Implementación del convertidor de tipos.
1. Página de registro del primer paso
2. El segundo paso: implementar la clase de encapsulación de usuario
3. El tercer paso: implementar la clase Acción
5. Paso 5: Registre el convertidor de tipos. Hay tres métodos de registro:
1. Registre un convertidor de tipo local: el convertidor de tipo local solo funciona con las propiedades de una determinada acción
2. Registre un convertidor de tipo global: el convertidor de tipo global tendrá efecto en todos los atributos específicos de Acción.
3. Utilice anotaciones JDK1.5 para registrar el convertidor de tipo: genere el convertidor de tipo mediante el registro.
6. Formato de nombre de archivo de registro de registro de convertidor de tipo parcial: ActionName-conversion.properties: ActionName es el nombre de clase de la acción que necesita que el convertidor surta efecto, y la siguiente cadena -conversion.properties es un archivo de propiedades típico al reparar parte o más del archivo. Consta de pares clave-valor. El contenido del archivo es: propertyName = clase de convertidor de tipo. El siguiente es el contenido del archivo UserAction-conversion.properties.
#Especifique que el atributo de usuario en UserAction debe usar la clase redarmy.user.UserConverter para completar la conversión de tipos.
usuario=ejército rojo.usuario.UserConverter
Nota: El archivo de propiedades anterior debe estar en el mismo paquete que UserAction. Es decir, en el caso anterior, el método anterior se puede utilizar para lograr la conversión de tipo local.
7. El formato de archivo del nombre de registro del convertidor de tipo global: archivo xwork-conversion.properties. Este archivo también es un archivo de propiedades y su contenido también se compone del elemento "tipo compuesto = clase de convertidor de tipo correspondiente".
El siguiente es el contenido del archivo xwork-conversion.properties:
#Especifique el convertidor de tipos de todas las clases redarmy.user.User como redarmy.user.UserConverter
redarmy.user.User=redarmy.user.UserConverter
Nota: El archivo xwork-conversion.properties debe crearse en la carpeta de clase, es decir, en src.
5. Conversión de tipo personalizado de Struts2
La clase StrutsTypeConverter se proporciona en Struts2 para simplificar el diseño de conversión de tipos personalizados. Esta clase tiene dos métodos abstractos que deben implementarse:
(1) objeto público convertFromString (contexto del mapa, valores de cadena [], clase a clase);
Parámetros del método de procesamiento utilizados para convertir datos de tipo Cadena en tipos personalizados:
contexto --- información contextual relacionada con la acción
valores --- valores de parámetros obtenidos de la solicitud
toClass --- el tipo de destino a convertir
(2) cadena pública convertToString (contexto del mapa, objeto obj);
Se utiliza para convertir tipos personalizados en cadenas.
parámetro:
contexto --- información contextual relacionada con la acción
obj --- objeto de tipo personalizado
Análisis de ejemplo: Diseño y configuración de una conversión de tipo de fecha.
(1) Diseñe MyDateTypeConverter, herede StrutsTypeConverter y cubra dos de sus métodos. El código de referencia es el siguiente:
Objeto público convertFromString (contexto del mapa, valores de cadena [], clase a clase) {
SimpleDateFormat sdf = new SimpleDateFormat("aaaa-MM-dd");
intentar{
Fecha v = sdf.parse(valores[0]);
volver v;
}catch(Excepción e){
e.printStackTrace();
devolver nueva fecha();
}
}
Continuado
cadena pública convertToString (contexto del mapa, objeto obj) {
SimpleDateFormat sdf = new SimpleDateFormat("aaaa año MM mes dd día");
Fecha v = (Fecha)obj;
devolver sdf.format(v);
}
Aunque Struts2 admite la conversión de cadenas y fechas de forma predeterminada, solo admite la conversión de formatos cortos y de fechas localizadas, lo que puede no satisfacer sus necesidades. Necesitamos implementar nuestra propia conversión de tipos.
(2) Agregue un atributo de cumpleaños a la clase UserInfo, cuyo tipo es java.util.Date
información de usuario de clase pública {
identificación entera privada;
nombre de cadena privada;
contraseña de cadena privada;
privado Fecha de cumpleaños;
...
}
(3) Configure el convertidor de tipos para el componente UserInfo Primero, cree un archivo de propiedades basado en el nombre de clase del componente UserInfo. El formato de nombre del archivo es nombre de clase-conversión.properties.
Por ejemplo UserInfo-conversion.properties
Este archivo debe estar en el mismo paquete que el componente UserInfo.
El formato de contenido de este archivo de características es el siguiente:
cumpleaños=demo.converter.MyDateTypeConverter
ilustrar:
cumpleaños es el nombre del atributo del tipo java.util.Date en el componente UserInfo
demo.converter.MyDateTypeConverter es una clase de implementación de conversión personalizada
El marco Strus2 tiene esto en cuenta y proporciona una forma sencilla de manejarlo.
Para configurar el conversor de tipos a nivel global basta con escribir un archivo de propiedades llamado xwork-conversion.properties, el cual debe estar ubicado en el directorio /WEB-INF/classes, con el siguiente contenido:
java.util.Date=demo.converter.MyDateTypeConverter
6. Convertidor de tipo personalizado
Las propiedades de tipo java.util.Date pueden recibir valores de parámetros de solicitud en el formato 2009-07-20. Pero si necesitamos recibir parámetros de solicitud en el formato 20091221, debemos definir un convertidor de tipo; de lo contrario, struts2 no puede completar automáticamente la conversión de tipo.
importar java.util.Fecha;
clase pública HolaMundoAcción {
fecha privada createtime;
fecha pública getCreatetime() {
devolver tiempo de creación;
}
setCreatetime público vacío (Fecha hora de creación) {
this.createtime = creartiempo;
}
}
clase pública DateConverter extiende DefaultTypeConverter {
@Override objeto público convertValue (contexto del mapa, valor del objeto, clase a tipo) {
SimpleDateFormat dateFormat = new SimpleDateFormat("aaaaMMdd");
intentar {
if(toType == Date.class){//Cuando la cadena se convierte al tipo de fecha
String[] params = (String[]) valor;// Request.getParameterValues()
fecha de retornoFormat.parse(params[0]);
}else if(toType == String.class){//Cuando la fecha se convierte en una cadena
Fecha fecha = valor (Fecha);
formato de fecha de retorno.formato (fecha);
}
} captura (ParseException e) {}
devolver nulo;
}
}
Registre el convertidor de tipo anterior como convertidor de tipo local:
Coloque el archivo ActionClassName-conversion.properties debajo del paquete donde se encuentra la clase Action. ActionClassName es el nombre de clase de Action y el siguiente -conversion.properties es un método de escritura fijo. Para este ejemplo, el nombre del archivo debe ser. HelloWorldAction-conversión.properties. El contenido del archivo de propiedades es:
Nombre de propiedad = Nombre de clase completo del convertidor de tipos. Para este ejemplo, el contenido del archivo HelloWorldAction-conversion.properties es:
createtime=cn.csdn.conversion.DateConverter
Registre el convertidor de tipo anterior como convertidor de tipo global:
Coloque el archivo xwork-conversion.properties en WEB-INF/classes. El contenido del archivo de propiedades es:
El tipo a convertir = el nombre de clase completo del convertidor de tipos. Para este ejemplo, el contenido del archivo xwork-conversion.properties es:
java.util.Date=cn.csdn.conversion.DateConverter
Las propiedades de tipo java.util.Date pueden recibir valores de parámetros de solicitud en el formato 2009-07-20. Pero si necesitamos recibir parámetros de solicitud en el formato 20091221, debemos definir un convertidor de tipo; de lo contrario, struts2 no puede completar automáticamente la conversión de tipo.
importar java.util.Fecha;
clase pública HolaMundoAcción {
fecha privada createtime;
fecha pública getCreatetime() {
devolver tiempo de creación;
}
setCreatetime público vacío (Fecha hora de creación) {
this.createtime = creartiempo;
}
}
clase pública DateConverter extiende DefaultTypeConverter {
@Override objeto público convertValue (contexto del mapa, valor del objeto, clase a tipo) {
SimpleDateFormat dateFormat = new SimpleDateFormat("aaaaMMdd");
intentar {
if(toType == Date.class){//Cuando la cadena se convierte al tipo de fecha
String[] params = (String[]) valor;// Request.getParameterValues()
fecha de retornoFormat.parse(params[0]);
}else if(toType == String.class){//Cuando la fecha se convierte en una cadena
Fecha fecha = valor (Fecha);
formato de fecha de retorno.formato (fecha);
}
} captura (ParseException e) {}
devolver nulo;
}
}
Registre el convertidor de tipo anterior como convertidor de tipo local:
Coloque el archivo ActionClassName-conversion.properties debajo del paquete donde se encuentra la clase Action. ActionClassName es el nombre de clase de Action y el siguiente -conversion.properties es un método de escritura fijo. Para este ejemplo, el nombre del archivo debe ser. HelloWorldAction-conversión.properties. El contenido del archivo de propiedades es:
Nombre de propiedad = Nombre de clase completo del convertidor de tipos. Para este ejemplo, el contenido del archivo HelloWorldAction-conversion.properties es:
createtime=cn.csdn.conversion.DateConverter
Registre el convertidor de tipo anterior como convertidor de tipo global:
Coloque el archivo xwork-conversion.properties en WEB-INF/classes. El contenido del archivo de propiedades es:
El tipo a convertir = el nombre de clase completo del convertidor de tipos. Para este ejemplo, el contenido del archivo xwork-conversion.properties es:
java.util.Date=cn.csdnconversion.DateConverter