java - Struts 2: entender el funcionamiento entre OGNL y el interceptor de params
struts2 file (3)
Soy nuevo en Struts 2. Lo estoy estudiando en el libro Struts2 In Action. Tengo dificultades para entender algunos conceptos en OGNL que son los siguientes-
Sabemos que el interceptor de
params
mueve los datos de los parámetros de solicitud al objeto de acción enValueStack
. Ahora, mientras leía, encontré una línea que dice: "La parte difícil del trabajo es asignar el nombre del parámetro a una propiedad real enValueStack
. Aquí es donde entraValueStack
. El interceptor deparams
interpreta el nombre del parámetro de solicitud como una expresión OGNL para ubicar la propiedad de destino correcta en ValueStack ".Pregunta 1) Aquí, ¿qué significa "interpreta"? ¿Es que params interceptor traduce el parámetro de solicitud en alguna expresión OGNL y luego la expresión OGNL proporciona un mapeo de las propiedades en ValueStack O significa algo más?
Cuando el resultado comienza su proceso de renderizado, las etiquetas de Struts 2 recuperan datos de ValueStack al hacer referencia a valores específicos con expresiones OGNL.
Pregunta 2) Entonces las etiquetas toman expresiones OGNL, pero ¿cómo se mueven los datos? Anteriormente, el interceptor de
params
fue el que movió los datos pero ahora no hay un interceptor deparams
. Entonces, ¿cómo se mueven los datos?
Digamos que escribe la página de inicio de sesión y la Acción de inicio de sesión correspondiente. En la página tiene un cuadro de texto que tiene un nombre que dice que es un campo de nombre del objeto Usuario. También tiene un campo de contraseña en la página que dice que se asigna al campo pwd en el objeto Usuario.
Ahora el gráfico Objeto aquí significa que tiene que decirle al interceptor de params que el campo de nombre es realmente un campo de nombre de objeto de usuario en la acción de inicio de sesión. El contexto de acción, valgueck y OGNL juntos tendrán el conocimiento de que: Bueno, tal vez haya otras acciones también, como FileUploadAction. Y estas otras acciones también pueden tener una referencia de objeto de usuario. Pero para el contexto de acción actual, el campo de nombre de la página de inicio de sesión en realidad no se asigna a nada más que el campo de nombre del objeto de usuario de Acción de inicio de sesión. No pertenece al campo de nombre del objeto de usuario de FileUploadAction. Tienen este conocimiento y también se comportan como si el campo en sí (en realidad, el gráfico de objetos completo) se ubicara en la pila de valores y fuera directamente accesible. (Un poco de experiencia en ThreadLocal será mejor para entender esto.)
Los interceptores están encadenados y se convierte en una cadena de responsabilidad en el camino hacia adelante y hacia atrás. Un interceptor puede realizar alguna acción es la dirección hacia adelante o la dirección de retorno o ambas. Entonces digamos que el flujo es como a continuación:
Page 1-->Interceptor_1--> Interceptor_2 --> Interceptor_3 -->Action_1
Entonces el flujo de retorno sería como a continuación:
Action_1 --> Interceptor_3 --> Interceptor_2 --> Interceptor_1 --> The result Page
Por lo tanto, para responder a su pregunta, también se llamará al interceptor de parámetros en el flujo de retorno.
En realidad, el nombre del parámetro se evalúa como expresión ValueStack
usando el contexto ValueStack
donde ValueStack
es el objeto raíz. Aquí puede encontrar información útil sobre OGNL en XWork. Para su pregunta: mapeo significa que no existe una referencia nula en el contexto devuelto por OGNL después de evaluar la expresión. Entonces, la expresión en sí misma es una clave en el mapa abstracto que es el contexto OGNL.
Los JSP se representan en el lado del servidor, por lo que no es necesario mover los datos al cliente. Pero las expresiones OGNL son evaluadas por las etiquetas de struts y los valores se copian como cadenas si los valores se escriben en la respuesta o usan la misma referencia al objeto mediante la clave utilizada como expresión OGNL. También puede crear una nueva clave o empujar el objeto a la parte superior de la pila de valores.
Respuesta 1
Los nombres de los parámetros SON expresiones OGNL. Es un caso de ConventionOverConfiguration. Si acordamos hacer que los nombres de los parámetros sean expresiones válidas de OGNL que puedan acceder a una propiedad javabeans, entonces es fácil simplemente pasar ese nombre a OGNL como una expresión. Esto se hace internamente, por supuesto; realmente no necesita saber cómo funciona a menos que esté pirateando esa parte del código de Struts 2.
Respuesta n. ° 2
El objeto de acción está sobre la ValueStack. ValueStack está disponible, a través de su existencia como parte de ThreadLocal ActionContext, desde cualquier código que se ejecute en el mismo hilo. Dado que una aplicación web utiliza un único hilo para gestionar el procesamiento de una solicitud, sabemos que la capa de resultados podrá acceder a ValueStack para recuperar los datos, y que volverá a utilizar el nombre en la etiqueta como expresión OGNL.
Nota:
La parte clave de todo esto es el hecho de que ValueStack está disponible para cualquier código que se ejecute en el mismo hilo. Esto permite que todo el procesamiento de código de una sola solicitud tenga acceso a ValueStack, que puede obtener a través de ThreadLocal ActionContext (lea sobre la clase ThreadLocal de Java si no comprende).
El interceptor de params puede entonces tratar de usar el nombre param como una expresión OGNL para escribir datos en ValueStack (qué servidores son el contexto OGNL; de nuevo, lee sobre la API OGNL si no entiendes). Luego, el código en las clases de resultados que maneja la representación de la respuesta puede interpretar los diversos nombres y valores de las bibliotecas de etiquetas como expresiones OGNL para LEER datos de ValueStack.