2014-03-26 70 views
4

Flash,它是一個請求的臨時存儲映射。Flash對象映射如何在Grails框架內工作

我想知道,一旦請求巧妙這是怎麼Grails的core framework

特別是我很感興趣的類(ES)負責將請求中的閃圖,然後把它實現出來處理。

+1

這個職業是你在找什麼? 'org.codehaus.groovy.grails.web.servlet。GrailsFlashScope' – Alidad

+0

有沒有可以接受的答案? – dmahapatro

回答

1

如果打印對象的類:

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

你會看到這是org.codehaus.groovy.grails.web.servlet.GrailsFlashScope。如果您查看代碼,則有兩個ConcurrentHashMap:一個用於當前請求,另一個用於下一個請求。

要使其可用,實例將存儲在會話中(請參閱registerWithSessionIfNecessary)。

10

Flash實際上只是當前請求和下一個請求的臨時存儲映射。它不會保留下一個請求後的條目,除非在下一個請求中重新填充條目(將來會是當前的條目)。下面是它如何工作的Grails的:

  • FlashScope接口延伸地圖本身有兩個方法next()getNow()GrailsFlashScope實現。所有這些都可以在grails-web-mvc中找到。

  • GrailsFlasScope主要維護兩個併發的HasMap(一個用於當前請求,另一個用於下一個請求)來保存條目。它執行next()FlashScope做清潔和「限制下一個請求」部分爲:

    a。清除電流
    b。下一步爲當前
    c。明確下一步

  • 接下來要關注的事項將是GrailsWebRequestFilter(執行OncePerRequestFilter),它確保每次調度總是有一次執行的請求。

  • 所有HTTP servlet請求都被GrailsWebRequestFilter過濾。該過濾器將閃存範圍設置爲next,以便每次檢索到最新的有效信息。

  • 現在的問題是FlashScope如何協調當前和下一個地圖?那麼,這就是爲什麼FlashScopeMap延伸。通過確保從next地圖中檢索值,FlashScope將覆蓋get(key)的地圖以協調兩個地圖,否則切換到當前地圖。

  • 默認情況下,flash如何提供給controllers?所有控制器繼承ControllersApi,繼承CommonWebApi

I hope you get what you were looking for.

+1

最後的好感覺:-) –