flash 对象映射如何在 grails 框架中工作
Posted
技术标签:
【中文标题】flash 对象映射如何在 grails 框架中工作【英文标题】:How does flash object map work inside grails framework 【发布时间】:2014-05-04 04:19:03 【问题描述】:Flash,它是一个请求的临时存储映射。
我想知道这是如何在 grails 上实现的 core framework
我特别感兴趣的是负责将闪存映射放入请求中的类,然后在请求经过精细处理后将其取出。
【问题讨论】:
这门课是你要找的吗?org.codehaus.groovy.grails.web.servlet.GrailsFlashScope
是否有任何可以接受的有用答案?
【参考方案1】:
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
。
I hope you get what you were looking for..
【讨论】:
最后的触感很好 :-)【参考方案2】:如果打印对象的类:
class MyController
def index()
println flash.getClass().name
你会看到那是org.codehaus.groovy.grails.web.servlet.GrailsFlashScope。如果你看代码,有两个 ConcurrentHashMap:一个用于当前请求,另一个用于下一个请求。
为了使其可用,实例存储在会话中(请参阅 registerWithSessionIfNecessary)。
【讨论】:
以上是关于flash 对象映射如何在 grails 框架中工作的主要内容,如果未能解决你的问题,请参考以下文章