【发布时间】:2014-05-04 04:19:03
【问题描述】:
【问题讨论】:
-
这门课是你要找的吗?
org.codehaus.groovy.grails.web.servlet.GrailsFlashScope -
是否有任何可以接受的有用答案?
【问题讨论】:
org.codehaus.groovy.grails.web.servlet.GrailsFlashScope
Flash 实际上是当前请求和下一个请求的临时存储映射。它不会在下一个请求之后保留条目,除非在下一个请求中重新填充条目(这将是未来的当前请求)。以下是它在 Grails 中的工作方式:
FlashScope 扩展 Map 本身的接口有两个方法 next() 和 getNow() 由 GrailsFlashScope 实现。所有这些都可以在grails-web-mvc找到。
GrailsFlasScope主要维护两个并发HasMap(一个用于当前请求,第二个用于下一个请求)来保存条目。它从FlashScope 实现next() 来执行清理和“restricting-to-next-request-only”部分:
一个。清除当前
湾。将下一个设为当前
C。下一个清除
接下来要关注的是GrailsWebRequestFilter(实现OncePerRequestFilter),它确保每次分派始终执行一次请求。
所有 http servlet 请求都由GrailsWebRequestFilter 过滤。此过滤器将闪存范围设置为 next,以便每次检索到最新且有效的信息。
现在的问题是FlashScope 如何协调当前地图和下一张地图?嗯,这就是为什么FlashScope 是从Map 扩展而来的。 FlashScope 从映射中覆盖 get(key) 以协调两个映射,方法是确保从 next 映射中检索值,否则切换到当前映射。
flash 默认情况下如何对controllers 可用?所有控制器都继承ControllersApi,后者继承CommonWebApi。
【讨论】:
如果打印对象的类:
class MyController {
def index() {
println flash.getClass().name
}
}
你会看到那是org.codehaus.groovy.grails.web.servlet.GrailsFlashScope。如果你看代码,有两个 ConcurrentHashMap:一个用于当前请求,另一个用于下一个请求。
为了使其可用,实例存储在会话中(请参阅 registerWithSessionIfNecessary)。
【讨论】: