ActionContext
ActionContext es el contexto de la acción, donde Struts2 guarda automáticamente algunos objetos requeridos durante la ejecución de la acción, como sesión, parámetros, locales, etc. Struts2 creará el ActionContext correspondiente basado en cada subproceso que ejecuta la solicitud HTTP, es decir, un hilo tiene un ActionContext único. Por lo tanto, los usuarios pueden usar el método estático ActionContext.getContext () para obtener el ActionContext del subproceso actual. Es precisamente por esta razón que los usuarios no tienen que preocuparse por hacer que la acción sea segura de hilo.
En cualquier caso, ActionContext se utiliza para almacenar datos. Struts2 en sí pondrá muchos datos, y los usuarios también pueden poner los datos que desean. La estructura de datos de ActionContext en sí es una estructura de mapeo, es decir, un mapa, que utiliza una clave para el valor del mapa. Por lo tanto, los usuarios pueden usarlo como usar MAP o usar directamente el método Action.getContextMap () para operar en el mapa.
Los datos colocados en STRUTS2 incluyen ActionInvocation, Aplicación (es decir, ServletContext), conversiones, localización, nombre de acción, parámetros de solicitud, sesión HTTP y valor de valor, etc. Para una lista completa, consulte su javadoc (el apéndice de este artículo analiza lo que contiene).
Debido a las características que se pueden obtener mediante métodos de hilo y estáticos de acción de acción, se puede obtener directamente en clases de no acción sin esperar a que sean o inyectar acciones. Cabe señalar que solo es válido en los subprocesos creados debido a la solicitud (porque el ActionContext correspondiente se crea al solicitar), pero no es válido en los subprocesos iniciados por el servidor (como el método de inicio de Fliter). Debido a la comodidad de acceder a él en clases de no acción, ActionContext también se puede usar para pasar datos a JSP en clases de no acción (porque JSP también puede acceder fácilmente a él).
La conexión y la diferencia entre ValueStack y ActionContext:
Similitudes: todos se usan dentro del alcance de una solicitud HTTP, es decir, su vida útil es una solicitud.
Diferencias: La pila de valor es la estructura de la pila, y ActionContext es la estructura del mapa (mapa).
Contacto: El mapa obtenido por el método valueStack.getContext () es en realidad el mapa de ActionContext. Mirando el código fuente de Struts2, podemos ver (línea 79 de org.apache.struts2.dispatcher.ng.prepareOperations en Struts2.3.1.2, Método CreateCactionContext). Al crear ActionContext, valueStack.getContext () se usa como un parámetro del constructor de ActionContext. Entonces, ValueStack y ActionContext se pueden obtener esencialmente el uno del otro.
Nota: En algunos documentos, aparecerá la palabra "contexto de pila", que en realidad es el valor guardado en ActionContext. Entonces, al leer estos documentos, debe ver claramente si la estructura de la pila (es decir, la pila de valor) se coloca o la estructura de mapeo (el contexto de la pila de valor, es decir, ActionContext).
Cómo obtener ActionContext:
En un interceptor personalizado: use ActionInVocation.getInVocationContext () o use ActionContext.getContext ().
En clase de acción: deje que el interceptor inyecte o use ActionContext.getContext ().
En las clases de no acción: deje que la clase de acción pase los parámetros, inyecte utilizando el mecanismo de inyección o use ActionContext.getContext (). Nota: ActionContext.getContext () solo se puede llamar por código que se ejecuta en el hilo de solicitud, de lo contrario se devuelve nulo.
En JSP: En general, no hay necesidad de obtener el ActionContext en sí.
Cómo guardar un valor en un ActionContext:
En clases de Java como Interceptor, Class de Acción, Clase de no acción, etc.: Use ActionContext.put (clave de objeto, valor de objeto).
En JSP: la etiqueta <s: set value = "..."/> almacenará el valor en ActionContext de forma predeterminada (por supuesto, la etiqueta <S: set> también puede almacenar el valor en otros lugares). Además, muchas etiquetas tienen atributos VAR (el atributo de identificación se usó antes, pero ahora el atributo de identificación se ha desaprobado). Este atributo puede almacenar un valor en el ActionContext, la clave es el valor del atributo var y el valor es el valor del atributo de valor de la etiqueta. (Algunos documentos escriben sobre el almacenamiento de valores en el contexto de ValueStack, que en realidad es el mismo)
Cómo leer un valor de un ActionContext:
En clases de Java como Interceptor, Clase de Acción, Clase de no acción, etc.: Use el método ActionContext.get (Key de objeto).
En JSP: use una expresión de OGNL que comience con #, por ejemplo, se llamará al método ActionContext.get ("Nombre"). Nota: Si los atributos de una determinada etiqueta no se analizan como expresiones OGNL de forma predeterminada, debe usar %{} para encerrar la expresión, y aparecerá una expresión similar a " %{#name}". (Ver más para "#" aquí)
En resumen, usar ActionContext en JSP es porque es una estructura de mapeo, y por otro lado, puede leer algunas configuraciones de acción. Cuando necesita proporcionar valores comunes para muchas acciones, puede hacer que cada acción proporcione el método getxxx (), pero una mejor manera es almacenar estos valores comunes en el ActionContext en el interceptor o la plantilla JSP (porque la plantilla de interceptor o JSP a menudo se usa para múltiples acciones).
Algunos ejemplos:
Código Java
// Esta clase demostrará la operación en ActionContext en el Interceptor publicClass MyInterceptor extiende AbstractInterceptor {public String Intercept (ActionInVocation Invocation) lanza la excepción {// Get ActionContext ActionContext ActionContext = Invocation.getInVocationContext (); // Guardar el valor persona persona = nueva persona (); ActionContext.put ("persona", persona); // Obtener el valor de valor valor = actionContext.get ("persona"); // Obtener httpservletrequest httpservletRequest request = (httpservletRequest) ActionContext.get (StrutsStatics.http_request); // Obtenga el mapa de la solicitud, es decir, el valor operado por httpservletRequest.getAttribute (...) y httpservletRequest.setAttribute (...) map requitMap = (map) ActionContext.get ("request"); // otros códigos // ...... return invocation.invoke (); }} Código Java
// Esta clase demostrará la operación de ActionContext en Action publicClass MyAction extiende ActionSupport {@Override public String Execute () lanza Exception {// Obtener el valor de la pila Value ActionContext ActionContext = ActionContext.getContext (); // Guardar el valor persona persona = nueva persona (); // Esta es la clase definida en el ejemplo anterior ActionContext.put ("persona", persona); // Obtener el objeto de valor de valor = ActionContext.get ("Persona"); // otros códigos // ...... return éxito; }} Código HTML
<! Doctype html> <html> <fead> <metahttp-equiv = "content-type" content = "text/html; charset = utf-8"> <title> jsp página </title> </head> <body> <!-Este jsp demostrará el uso de ActionContext en jsp-> <!-este JSP es el JSP que es el que es el Jsp Corcesing to MyACTI El ActionContext se ha almacenado en ActionContext, puede usar "#Person" para obtenerlo, de la siguiente manera-> <s: PropertyValue = "#Person"/> <!-Obtenga el atributo de nombre de la persona, como sigue-> <S: PropertyValue = "#Person.nameName"/> <!-Obtenga el valor almacenado por struts2 en ActionConteTontext, como el Map de la solicitud, como Sigue, como sigue ". <S: PropertyValue = "#request"/> <!-Obtenga el valor almacenado por Struts2 en ActionContext, como el mapa de la sesión, como sigue-> <s: PropertyValue = "#Session"/> <!-Obtener el valor almacenado por Struts2 en ActionContex Demuestra guardar el valor en ActionContext en jsp-> <!-Guardar una cadena "myname", la clave es "mykey", como sigue-> <s: setValue = "%{'myname'}" var = "mykey"/> <!-Use la etiqueta S: bean para crear un objeto y guardarlo en acción, la clave es myobject, como sigue->>>> <s: beanName = "com.example.person" var = "myObject"/> <!-Después de eso, puede usar "#" para leerlos, como sigue-> <s: PropertyValue = "#mykey"/> <s: PropertyValue = "#myobject"/> </body> </html> 3. HttpservletRequest clase o mapa de solicitudes
STRUTS2 proporciona dos operaciones a pedido: una es la clase HttpServletRequest proporcionada por el servidor web, que es la misma que la operación de solicitudes en proyectos web de Java tradicionales; El otro es un "mapa de solicitud", que es una clase de mapeo que encapsula los atributos de httpservletRequest. Operar el mapa es equivalente a operar los atributos de httpservletRequest. La razón por la cual se proporciona MAP es que es conveniente operar, y la otra es que puede usar OGNL para leer solicitudes en etiquetas JSP. En cualquier caso, estas dos solicitudes son interoperables. En cuanto a los conceptos como el ciclo de solicitud de vida, no es diferente de otros proyectos web de Java, y este artículo no se describirá en detalle.
Use la clase HttpservletRequest o el mapa de solicitudes
Aunque los dos son interoperables, en términos de atributos de solicitud de lectura, el uso de mapas de solicitud es mucho más conveniente y no expone interfaces innecesarias. Por supuesto, HttpservletRequest tiene algunos métodos que el mapa de solicitudes no tiene. Por supuesto, el primero debe usarse al usar estos métodos.
Usando el mapa de la solicitud o ActionContext:
Ambos son mapas, y ambos ciclos de vida son una solicitud.
En los proyectos web tradicionales de Java, el valor a menudo se pasa a JSP a través de los atributos de la solicitud: First setAttribute () en el servlet, y luego getAttribute () en el JSP. Por supuesto, en el proyecto Struts2, aún puede usar este método, pero no vale la pena abandonar la función de entrega proporcionada por Struts2. Aunque el autor no encontró el documento oficial que decía que debe reemplazar el mapa de la solicitud con ActionContext, y no encontró que hay un mapa en el programa que puede obtener ActionContext pero que no puede obtener la solicitud, en el marco Struts2, operando ActionContext es más conveniente que operar el mapa de la solicitud. Por lo tanto, el autor recomienda: intente usar ActionContext en lugar del mapa de la solicitud para pasar el valor.
El mapa de la solicitud a veces contiene valores establecidos por otros marcos, como Spring Frameworks. Al obtener estos valores, debe usar el mapa de solicitudes porque no hay en el ActionContext.
A través de ActionContext, puede obtener la clase httpservletRequest: "httpservletRequest request = (httpservletRequest) ActionContext.get (strutsStatics.http_request);".
También puede obtener el mapa de la solicitud a través de ActionContext: "Map requestMap = (map) ActionContext.get (" Solicitud ");". Por lo tanto, en la etiqueta JSP, puede obtener los datos del mapa de la solicitud utilizando la expresión "#Request".
Cómo obtener httpservletrequest:
Si ya hay un ActionContext, use "ActionContext.get (StrutsStatics.http_request)" para obtener el httpservletRequest.
En un interceptor personalizado, primero obtenga el ActionContext y luego obténlo a través del ActionContext.
En acción, primero obtenga el ActionContext y luego obténlo a través del ActionContext. O permita que la acción implementa la interfaz ServletRequestaware y use el Interceptor ServletConfigInterceptor, de modo que el interceptor inyecte HTTPServletRequest.
En JSP, generalmente no necesita obtener httpservletRequest.
Cómo obtener el mapa de la solicitud:
Si ya hay un ActionContext, use "ActionContext.get (" Solicitar ")" para obtener.
En un interceptor personalizado, primero obtenga el ActionContext y luego obténlo a través del ActionContext.
En acción, primero obtenga el ActionContext y luego obténlo a través del ActionContext. O permita que Action implementa la interfaz de request AWare y use el Interceptor ServletConfigInterceptor, para que el interceptor inyecte una solicitud de mapa.
En JSP, use "#Request" para obtener el mapa de la solicitud y use "#request.key" o "#request ['key']" para leer el valor en el mapa.
En resumen, la solicitud aún se ajusta a las reglas generales de los sitios web de Java. Sin embargo, el autor recomienda que los usuarios intenten evitar usar la solicitud para aprobar valores.
Algunos ejemplos:
// Esta clase demostrará el funcionamiento del mapa de httpservletRequest y solicitará en el interceptor publicClass myInterceptor extiende abstractInterceptor {public string intercept (ActionVocation Invocation) lanza la excepción {// Get ActionContext ActionContext ActionContext = Invocation.getInVocationContext ();; // Obtener httpservletRequest httpservletRequest httpservletRequest = (httpservletRequest) ActionContext.get (strutsStatics.http_request); // Obtener el mapa mapa requestmap = (map) ActionContext.get ("Solicitar"); // Crear una clase como persona persona persona = nueva persona (); // Las siguientes dos líneas de declaraciones tienen la misma función httpservletRequest.setAttribute ("persona", persona); requestMap.put ("persona", persona); // otros códigos // ...... return invocation.invoke (); }} // Esta clase demostrará el funcionamiento del mapa de httpservletRequest y solicitará en acción (el método estático obtiene actionContext) publicClass myAction extiende ActionSupport {@Override public String Execute () lanza la excepción {// obtener ActionContext ActionContext ActionContext = ActionContext.getContext (); // Obtener httpservletRequest httpservletRequest httpservletRequest = (httpservletRequest) actionContext.get (strutsstatics.http_request); // Obtener el mapa mapa requestmap = (map) ActionContext.get ("Solicitar"); // Crear una clase como persona persona persona = nueva persona (); // Las siguientes dos líneas de declaraciones tienen la misma función httpservletRequest.setAttribute ("persona", persona); requestMap.put ("persona", persona); // otros códigos // ...... return éxito; }} // Esta clase demostrará usar ServletRequestaware en acción para obtener httpservletRequest (nota: debe usar servletconfiginterceptor interceptor) publicClass myAction extiende las acciones de acciones implementos servletRequestaWare {solicitud privada httpservletRequest; // Este método es un método de la interfaz ServletRequestaware publicvoid setServletRequest (solicitud httpservletRequest) {this.request = request; } @Override public String Execute () lanza la excepción {// httpservletRequest está listo en el campo de esta clase, y puede usarse directamente // ...... return éxito; }} // Esta clase demostrará usar ServLetRequestaware en acción para obtener el mapa de la solicitud (Nota: Desea usar ServletConfigInterceptor Interceptor) publicClass MyAction extiende ActionSupport implementa requestaWare {map <string, object> solicitud; // Este método es un método de la interfaz request de publicvoid setRequest (map <string, objeto> request) {this.request = request; } @Override public String Execute () lanza la excepción {// El mapa de la solicitud está listo en el campo de la clase y puede usarse directamente // ...... return éxito; }}<! DocType html> <html> <fead> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <title> jsp página </title> </head> <body> <!-este jsp demuestrará el uso de los mapas de solicitud en jsp-> <!-este jsp es el jsp que es la myation-< es el valor almacenado automáticamente en ActionContext por Struts2 (la clave es solicitud), así que use "#" para acceder al ActionContext y leer la solicitud desde él-> <s: Valor de propiedad = "#Solicitud"/> <!-Las siguientes dos líneas son el valor del nombre de la clave "Nombre" en el mapa que accede a la solicitud-> <S: Valor de propiedad = "#Solicitud.name"/> <S: Valor de propiedad = "#Solicitud"#Solicitud ". </body> </html>
3. Parámetros, es decir, parámetros de solicitud o solicitud posterior
Los parámetros son parámetros pasados por el navegador al servidor cuando solicitan Get o Post. En los proyectos web de Java tradicionales, use métodos como httpservletRequest.getParameter () para obtener parámetros, y puede usar directamente httpservletRequest.getParametermap () para obtener un mapa con parámetros encapsulados. En Struts2, Struts2 almacena directamente el mapa anterior en ActionContext, con la clave "Parámetros". Además, ActionContext también proporciona directamente el método ActionContext.getParameters () para obtener este mapa. Por lo tanto, el método de operación de parámetros en cada componente de Struts2 es muy similar al método de operación del mapa de solicitud, y este párrafo no se describirá en detalle.
4. Mapa de la clase y sesión de httpservletsession
La sesión en proyectos web tradicionales de Java está familiarizado, y la usamos para registrar el estado de la sesión de un usuario. Struts2 encapsula la httpservletsession en un mapa, es decir, el "mapa de sesión", que es similar al procesamiento de la solicitud. Sin embargo, para ahorrar recursos del sistema, no crearemos sesiones cuando no necesitemos sesiones. Puede ser por esto que la httpservletsession no se coloque en el ActionContext en Struts2. Si su programa necesita usar httpservletsession, primero debe obtener el httpservletRequest, y luego usar getsession () o getsession (boolean b) para obtenerlo, y decidir si necesita crear una sesión. Para el mapa de la sesión, Struts2 todavía lo coloca en el ActionContext (la clave es "Sesión"), pero no se preocupe, el mecanismo de este mapa hace sesiones solo cuando se crean nuevos valores. En resumen, la operación de HttpServletsession en Struts2 primero debe obtenerla a través de HttpServletRequest, y la operación del mapa de la sesión es exactamente la misma que la operación del mapa de solicitudes, que no se describirá en detalle en este párrafo.
5. Mapa de ServletContext and Application
En los proyectos web tradicionales de Java, ServletContext se utiliza para almacenar variables globales, y cada máquina virtual Java solo tiene un ServletContext por proyecto web. Este servletContext es creado por un servidor web para garantizar su singularidad. ServletContext tiene algunos métodos que pueden operar sus atributos, y estas operaciones son similares a operar un mapa. Entonces, Struts2 encapsula nuevamente: encapsula los atributos de ServletContext en un mapa, es decir, "Mapa de aplicaciones", y también lo coloca en el ActionContext (la clave es la aplicación). Por lo tanto, si la operación del mapa de la aplicación es en el mapa de la solicitud, este párrafo no se describirá en detalle.
En cuanto a la operación en servletContext, es similar a la operación en httpservletRequest: Struts2 coloca el servletContext en el ActionContext, y ServletConfigInterceptor proporciona la interfaz de inyección ServletContextware para servletContext. Por lo tanto, este párrafo no se describirá en detalle.
Nota: Usar "#Application" en expresiones OGNL puede obtener el mapa de la aplicación, no el ServletContext. Sin embargo, en el código Java integrado en JSP (como "< % Application.getAttribute (" "); %>"), la aplicación es un servletContext, no un mapa.