2011-08-04 9 views
5

He encontrado algún código que está accediendo a un valor que está almacenado en la pila de valores de struts simplemente llamando a getAttribute() en el objeto HttpServletRequest. No pensé que esto fuera posible y ¿dónde está documentado?¿Cómo acceder a la pila de valores de Struts desde el objeto HttpServletRequest?

Código de la clase de la acción (que no lo agrega a clase sólo a la pila de valor):

private PaginatedChunk searchResults; 


public PaginatedChunk getSearchResults() { 
    return searchResults; 
} 

public void setSearchResults(PaginatedChunk searchResults) { 
    this.searchResults = searchResults; 
} 

Este es el código en una etiqueta personalizada que extrae el valor de la solicitud (y funciona !?):

HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); 
PaginatedChunk searchResults = (PaginatedChunk) request.getAttribute("searchResults"); 

¿Alguien me puede explicar cómo funciona esto? Pensé que el valor Stack no era accesible directamente a través de la solicitud.

Estamos funcionando struts2 v2.1.8.1

Respuesta

5

A primera vista, sin duda estaría de acuerdo. Lo que muestra no parece intuitivo. Pero lo que realmente está sucediendo es obtener acceso al objeto de solicitud desde la pila de valores, no al revés. Empiezas con pageContext en la pila de valores y sigues trabajando con algo al final que todavía tiene acceso a la pila de valores (también tiene acceso a la solicitud). Aquí es cómo sucede:

Mirando aquí (http://www.docjar.com/html/api/org/apache/struts2/ServletActionContext.java.html) vemos donde "pageContext" viene de:.

93  public static PageContext getPageContext() { 
    94   return (PageContext) ActionContext.getContext().get(PAGE_CONTEXT); 
    95  } 

getContext get()() devuelve un objeto, que sabemos que es una especie de PageContext . Pero, ¿cuál es la clase implementadora?

Creación de una acción simple:

package com.quaternion.action.test; 

import com.opensymphony.xwork2.ActionSupport; 

public class RequestAccessTest extends ActionSupport{ 
    public String getGreeting(){ 
     return "Hello from Request AccessTest"; 
    } 
} 

Luego, en la JSP:

<%@taglib prefix="s" uri="/struts-tags"%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
    <body> 
     <h1>Request Access Test</h1> 
     <% 
      HttpServletRequest r = (HttpServletRequest) pageContext.getRequest(); 
      String aGreeting = (String) r.getAttribute("greeting"); 
      System.out.println(aGreeting); 
      System.out.println("R's class is:" + r.getClass().getCanonicalName()); 
     %> 
    </body> 
</html> 

En mi consola veo impresa:

INFO: Hello from Request AccessTest 
INFO: R's class is:org.apache.struts2.dispatcher.StrutsRequestWrapper 

por lo que estamos realmente tratando con un StrutsRequestWrapper (Ahora que sabemos de lo que estamos hablando en realidad es fácil) ...

http://massapi.com/source/struts-2.2.1/src/core/src/main/java/org/apache/struts2/dispatcher/StrutsRequestWrapper.java.html

Mirando el enlace anterior vemos que getAttribute es, en efecto anulado.

A partir de la línea 65, vemos que trató de obtener el valor de la solicitud, y luego, si eso falla, continúa para sacarlo de la pila de valores.

¿Dónde está esto documentado? Supongo que está documentado aquí, a partir de ahora;)

+0

Oh, como seguimiento, esto puede ser útil y disipar algunos struts2 magic: http://struts.apache.org/2.0.14/docs/what-is- the-actioncontext.html – Quaternion

Cuestiones relacionadas