答案 0 :(得分:10)
Flash实际上是当前请求和下一个请求的临时存储映射。它不会在下一个请求之后保留条目,除非在下一个请求中重新填充条目(将来会是当前的)。以下是它在Grails中的工作原理:
FlashScope
接口有两个方法next()
和getNow()
由GrailsFlashScope
实现。所有这些都可以在grails-web-mvc
。
GrailsFlasScope
主要维护两个并发的HasMap(一个用于当前请求,另一个用于下一个请求)来保存条目。它从FlashScope
实施next()
来执行清理工作,然后限制“仅限于下一个请求”#34;部分为:
一个。清除当前
湾将下一个作为当前的
C。明确下一步
要关注的下一件事是GrailsWebRequestFilter
(实现OncePerRequestFilter
),这样可确保每次调度始终只执行一次请求。
所有http servlet请求都由GrailsWebRequestFilter
过滤。此过滤器将闪存范围设置为next
,以便每次检索到最新且有效的信息时。
现在问题是FlashScope
如何协调当前和下一张地图?那就是FlashScope
从Map
扩展的原因。 FlashScope会从地图覆盖get(key)
,以确保从next
地图检索值,然后切换到当前地图,以协调这两个地图。
默认情况下flash
如何controllers
可用?所有控制器都继承ControllersApi
继承CommonWebApi
。
答案 1 :(得分:1)
如果您打印对象的类:
class MyController {
def index() {
println flash.getClass().name
}
}
你会看到org.codehaus.groovy.grails.web.servlet.GrailsFlashScope。如果查看代码,有两个ConcurrentHashMap:一个用于当前请求,另一个用于下一个请求。
要使其可用,实例将存储在会话中(请参阅registerWithSessionIfNecessary)。