flash对象映射如何在grails框架内工作

时间:2014-03-26 01:07:30

标签: grails grails-controller

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

我想知道如何在grails core framework

上实现这一点

特别是我对负责将flash地图放入请求中的类感兴趣,然后在请求处理完成后将其取出。

2 个答案:

答案 0 :(得分:10)

Flash实际上是当前请求和下一个请求的临时存储映射。它不会在下一个请求之后保留条目,除非在下一个请求中重新填充条目(将来会是当前的)。以下是它在Grails中的工作原理:

    扩展了Map本身的
  • FlashScope接口有两个方法next()getNow()GrailsFlashScope实现。所有这些都可以在grails-web-mvc

  • 中找到
  • GrailsFlasScope主要维护两个并发的HasMap(一个用于当前请求,另一个用于下一个请求)来保存条目。它从FlashScope实施next()来执行清理工作,然后限制“仅限于下一个请求”#34;部分为:

    一个。清除当前
    湾将下一个作为当前的 C。明确下一步

  • 要关注的下一件事是GrailsWebRequestFilter(实现OncePerRequestFilter),这样可确保每次调度始终只执行一次请求。

  • 所有http servlet请求都由GrailsWebRequestFilter过滤。此过滤器将闪存范围设置为next,以便每次检索到最新且有效的信息时。

  • 现在问题是FlashScope如何协调当前和下一张地图?那就是FlashScopeMap扩展的原因。 FlashScope会从地图覆盖get(key),以确保从next地图检索值,然后切换到当前地图,以协调这两个地图。

  • 默认情况下flash如何controllers可用?所有控制器都继承ControllersApi继承CommonWebApi

I hope you get what you were looking for.

答案 1 :(得分:1)

如果您打印对象的类:

class MyController {
  def index() {
    println flash.getClass().name
  }
}

你会看到org.codehaus.groovy.grails.web.servlet.GrailsFlashScope。如果查看代码,有两个ConcurrentHashMap:一个用于当前请求,另一个用于下一个请求。

要使其可用,实例将存储在会话中(请参阅registerWithSessionIfNecessary)。