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 框架中工作的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.0:问题测试 flash.message

如何让命中检测在 Flash 中工作?

如何使事务在 Grails 中工作

将 Grails 域对象映射到 JDBC 表/序列

Grails - Ionic - AngularJS - 在这个环境中工作是个好主意吗?

如何使用 Grails 4 JSON 视图呈现域对象的地图