2011-06-17 7 views
9

En Grails, el flash storage object se usa para guardar cross request data like messages.En Grails, ¿solo se puede acceder al objeto de almacenamiento flash desde los controladores y las vistas?

Sé que se puede acceder desde la mayoría de las Vistas y Controladores, pero no estoy seguro si está disponible universalmente en Grails, o si solo se puede acceder desde ciertos objetos convencionales.

¿Se puede acceder al objeto flash desde Services, por ejemplo?

¿O incluso en cualquier lugar durante una solicitud web en vivo?

¿Cuáles son sus limitaciones precisas en términos de acceso?

Respuesta

17

Puede obtener acceso al flash donde sea, y más importante, siempre que tenga acceso a una solicitud web. En general, puede obtener el flash del objeto GrailsWebRequest.

import org.codehaus.groovy.grails.web.util.WebUtils 

def grailsWebRequest = WebUtils.retrieveGrailsWebRequest() 
// request is the HttpServletRequest 
def flash = grailsWebRequest.attributes.getFlashScope(request) 

Si se invoca retrieveGrailsWebRequest() fuera del contexto de una petición web, obtendrá un IllegalStateException. El GrailsWebRequest está vinculado al subproceso actual por un filtro, GrailsWebRequestFilter, que se ejecuta al principio de la solicitud de servicio. Entonces, básicamente, mientras esté en el contexto de una solicitud y "dentro" de la ejecución de este filtro, debería poder acceder al flash.

Más allá de eso, eche un vistazo a la fuente de org.codehaus.groovy.grails.web.servlet.DefaultGrailsApplicationAttributes. El almacenamiento flash se guarda en la sesión, por lo que teóricamente deberías poder utilizarlo una vez que tengas acceso a la sesión. Tenga cuidado, ya que se comparte entre las diferentes solicitudes de la sesión. El filtro mencionado es responsable de avanzar el estado del flash a lo largo de las solicitudes, esencialmente mostrando un ConcurrentHashMap desde una cola de 2 elementos.

5

Mientras estás dentro del contexto de una solicitud se puede acceder al alcance del flash con

import org.codehaus.groovy.grails.web.util.WebUtils 

def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope 

(guiones Grails y puestos de trabajo de cuarzo son ejemplos de lugares en una aplicación Grails que no están dentro del contexto de una solicitud)

Cuestiones relacionadas