1. Varios valores predeterminados en la configuración de Acción
<nombre del paquete="csdn" namespace="/test" extends="struts-default">
<nombre de acción="holamundo" método="ejecutar" >
<resultado nombre="éxito">/WEB-INF/page/hello.jsp</result>
</acción>
</paquete>
1>Si no se especifica ninguna clase para la acción, el valor predeterminado es ActionSupport.
2>Si no se especifica ningún método para la acción, el método ejecutar () en la acción se ejecutará de forma predeterminada.
3>Si no se especifica el atributo de nombre del resultado, el valor predeterminado es éxito.
2. Varios tipos de reenvío de resultados en Acción
<nombre de acción="holamundo">
<resultado nombre="éxito">/WEB-INF/page/hello.jsp</result>
</acción>
La configuración de resultados es similar a la de reenvío en struts1, pero struts2 proporciona varios tipos de resultados. Los tipos más utilizados son: despachador (valor predeterminado), redirección, redirecciónAcción, texto sin formato.
El siguiente es un ejemplo del tipo de resultado de redirecciónAcción, si la acción redirigida está en el mismo paquete:
<resultado tipo="redirectAction">holamundo</result>
Si la acción redirigida está en otro espacio de nombres:
<tipo de resultado="redirectAction">
<param name="actionName">holamundo</param>
<param nombre="espacio de nombres">/prueba</param>
</resultado>
texto sin formato: muestra el contenido del archivo original. Por ejemplo, cuando necesitamos mostrar el código fuente del archivo jsp tal como está, podemos usar este tipo.
<resultado nombre="fuente" tipo="texto simple ">
<param nombre="ubicación">/xxx.jsp</param>
<param name="charSet">UTF-8</param><!-- Especifique la codificación para leer archivos -->
</resultado>
En el resultado, también puede utilizar la expresión ${attribute name} para acceder a los atributos de la acción. Los nombres de los atributos de la expresión corresponden a los atributos de la acción. como sigue:
<resultado tipo="redirect">view.jsp?id=${id}</result>
3. Varias acciones comparten una vista: configuración de resultados globales
Cuando se utiliza la misma vista en múltiples acciones, debemos definir el resultado como una vista global. El avance global se proporciona en struts1 y funciones similares también se proporcionan en struts2:
<paquete....>
<resultados-globales>
<resultado nombre="mensaje">/message.jsp</resultado>
</resultados-globales>
</paquete>
4. Inyecte valores en las propiedades de Acción
Struts2 proporciona una función de inyección de dependencia para las propiedades en Action. En el archivo de configuración de struts2, podemos inyectar valores fácilmente en las propiedades en Action. Nota: Las propiedades deben proporcionar métodos de establecimiento.
clase pública HolaMundoAcción{
ruta de guardado de cadena privada;
cadena pública getSavePath() {
devolver rutaguardada;
}
setSavePath vacío público (String savePath) {
this.savePath = savePath;
}
...
}
<nombre del paquete="csdn" namespace="/test" extends="struts-default">
<nombre de acción="holamundo" >
<param nombre="savePath">/imagenes</param>
<resultado nombre="éxito">/WEB-INF/page/hello.jsp</result>
</acción>
</paquete>
Lo anterior inyecta "/images" en el atributo savePath de la acción a través del nodo <param>.
5. Especifique el sufijo de solicitud que Struts 2 debe procesar
Anteriormente usábamos el sufijo .action de forma predeterminada para acceder a Action. De hecho, el sufijo predeterminado se puede modificar a través de la constante "struts.action.extension". Por ejemplo, podemos configurar Struts 2 para que solo procese rutas de solicitud con .do como sufijo:
<?xml versión="1.0" codificación="UTF-8"?>
<!DOCTYPE puntales PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//ES"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<puntales>
<nombre constante="struts.action.extension" valor="hacer"/>
</struts>
Si el usuario necesita especificar varios sufijos de solicitud, sepárelos con comas (,). como:
<nombre constante="struts.action.extension" valor="hacer,ir"/>
6. Describe en detalle la definición de constantes.
Las constantes se pueden configurar en struts.xml o struts.properties. Se recomienda configurarlas en struts.xml. Los dos métodos de configuración son los siguientes.
Configurar constantes en el archivo struts.xml
<puntales>
<nombre constante="struts.action.extension" valor="hacer"/>
</struts>
Configurar constantes en struts.properties
struts.action.extension=hacer
Debido a que las constantes se pueden definir en varios archivos de configuración a continuación, debemos comprender el orden de búsqueda en el que struts2 carga las constantes:
struts-default.xml
struts-plugin.xml
puntales.xml
puntales.properties
web.xml
Si la misma constante se configura en varios archivos, el valor constante configurado en el último archivo sobrescribirá el valor constante configurado en el archivo anterior.
7. Introducción a las constantes de uso común.
<!-- Especifique el conjunto de codificación predeterminado, que actúa sobre el método setCharacterEncoding de HttpServletRequest y la salida de freemarker y speed -->
<nombre constante="struts.i18n.encoding" valor="UTF-8"/>
<!-- Este atributo especifica el sufijo de solicitud que debe ser procesado por Struts 2. El valor predeterminado de este atributo es acción, es decir, todas las solicitudes que coinciden con *.action son procesadas por Struts2.
Si el usuario necesita especificar varios sufijos de solicitud, sepárelos con comas (,). -->
<nombre constante="struts.action.extension" valor="hacer"/>
<!-- Establezca si el navegador almacena en caché el contenido estático. El valor predeterminado es verdadero (se utiliza en el entorno de producción. Es mejor desactivarlo durante la etapa de desarrollo).
<nombre constante="struts.serve.static.browserCache" valor="false"/>
<!-- Cuando se modifica el archivo de configuración de struts, si el sistema recargará automáticamente el archivo, el valor predeterminado es falso (usado en el entorno de producción), es mejor activarlo durante la etapa de desarrollo -->
<nombre constante="struts.configuration.xml.reload" valor="true"/>
<!-- Se utiliza en modo de desarrollo, para que se puedan imprimir mensajes de error más detallados -->
<nombre constante="struts.devMode" valor="true" />
<!--Tema de vista predeterminado-->
<nombre constante="struts.ui.theme" valor="simple" />
<! Al integrar con Spring, especifique que Spring es responsable de la creación del objeto de acción -->
<nombre constante="struts.objectFactory" valor="primavera" />
<!Esta propiedad establece si Struts 2 admite llamadas a métodos dinámicos. El valor predeterminado de esta propiedad es verdadero. Si necesita desactivar las llamadas a métodos dinámicos, puede establecer esta propiedad en falso. -->
<constante nombre="struts.enable.DynamicMethodInvocation" valor="false"/>
<!--Límite de tamaño para archivos cargados-->
<nombre constante="struts.multipart.maxSize" valor="10701096"/>
8. Especifique varios archivos de configuración de struts para la aplicación.
En la mayoría de las aplicaciones, a medida que aumenta la escala de la aplicación, la cantidad de acciones en el sistema también aumentará significativamente, lo que provocará que el archivo de configuración struts.xml se hinche mucho. Para evitar que el archivo struts.xml sea demasiado grande e inflado y mejorar la legibilidad del archivo struts.xml, podemos descomponer un archivo de configuración struts.xml en múltiples archivos de configuración y luego incluir otros archivos de configuración en struts.xml. archivo. El siguiente struts.xml especifica múltiples archivos de configuración a través del elemento <include>:
<?xml versión="1.0" codificación="UTF-8"?>
<!DOCTYPE puntales PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//ES"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<puntales>
<incluir archivo="struts-user.xml"/>
<incluir archivo="struts-order.xml"/>
</struts>
De esta manera, podemos agregar Struts 2 Action a múltiples archivos de configuración por módulo.
9. Llamada a método dinámico
Si hay varios métodos en la Acción, podemos usar! + nombre del método para llamar al método especificado. como sigue:
clase pública HolaMundoAcción{
mensaje de cadena privado;
....
La ejecución de cadena pública () arroja una excepción {
this.message = "Mi primera aplicación de struts2";
devolver "éxito";
}
cadena pública otra () lanza una excepción {
this.message = "Segundo método";
devolver "éxito";
}
}
Supongamos que la ruta URL para acceder a la acción anterior es: /struts/test/helloworld.action
Para acceder al método other() de la acción, podemos llamarlo así:
/struts/test/helloworld!other.action
Si no queremos utilizar la invocación de métodos dinámicos, podemos desactivar la invocación de métodos dinámicos mediante la constante struts.enable.DynamicMethodInvocation.
<nombre constante="struts.enable.DynamicMethodInvocation" valor="false"/>
10. Utilice comodines para definir acciones.
<nombre del paquete="csdn" namespace="/test" extends="struts-default">
<nombre de acción="holamundo_*" método="{1}">
<resultado nombre="éxito">/WEB-INF/page/hello.jsp</result>
</acción>
</paquete>
clase pública HolaMundoAcción{
mensaje de cadena privado;
....
La ejecución de cadena pública () arroja una excepción {
this.message = "Mi primera aplicación de struts2";
devolver "éxito";
}
cadena pública otra () lanza una excepción {
this.message = "Segundo método";
devolver "éxito";
}
}
Para acceder al método other(), puede acceder a él a través de una URL como esta: /test/helloworld_other.action
11. Recibir parámetros de solicitud
Utilice tipos básicos para recibir parámetros de solicitud (obtener/publicar)
Defina un atributo con el mismo nombre que el parámetro de solicitud en la clase Acción, y struts2 puede recibir automáticamente el parámetro de solicitud y asignarlo al atributo con el mismo nombre.
Ruta de solicitud: http://localhost:8080/test/view.action?id=78
clase pública AcciónProducto {
identificación entera privada;
public void setId (Integer id) {// struts2 usa tecnología de reflexión para llamar al método de establecimiento de la propiedad con el mismo nombre que el parámetro de solicitud para obtener el valor del parámetro de solicitud
this.id = identificación;
}
entero público getId() {id de retorno;}
}
Utilice el tipo compuesto para recibir la ruta de solicitud de los parámetros de solicitud: http://localhost:8080/test/view.action?product.id=78
clase pública AcciónProducto {
producto privado Producto;
public void setProduct(Producto producto) { this.product = producto }
Producto público getProduct() {devolver producto;}
}
Struts2 primero crea el objeto del producto llamando al constructor predeterminado del Producto mediante tecnología de reflexión, y luego llama al método de establecimiento de la propiedad con el mismo nombre que el parámetro de solicitud en el producto mediante tecnología de reflexión para obtener el valor del parámetro de solicitud.
12. 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.
13. Procesamiento de datos de la capa de presentación.
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.
Para datos de entrada: debe 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.
Para datos de salida: tanto java como jsp admiten la salida directa de múltiples tipos de datos.
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.
14. Conversión de tipo
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;
15. 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 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
16. 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 (Mapa <Cadena, Objeto> contexto, Valor del objeto, Clase a Tipo) {
}
……//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()