【问题标题】:How does flash object map work inside grails frameworkflash 对象映射如何在 grails 框架中工作
【发布时间】:2014-05-04 04:19:03
【问题描述】:

Flash,它是一个请求的临时存储映射。

我想知道这是如何在 grails 上实现的 core framework

我特别感兴趣的是负责将闪存映射放入请求中的类,然后在请求经过精细处理后将其取出。

【问题讨论】:

  • 这门课是你要找的吗? org.codehaus.groovy.grails.web.servlet.GrailsFlashScope
  • 是否有任何可以接受的有用答案?

标签: grails grails-controller


【解决方案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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多