2011-06-17 13 views
9

Grailsではcross request data like messagesを保持するためにflash storage objectが使用されます。Grailsでは、フラッシュストレージオブジェクトはコントローラとビューからのみアクセスできますか?

ほとんどのビューとコントローラからアクセスできますが、Grails全体で普遍的に利用できるのかどうか、あるいは特定の従来のオブジェクトからのみアクセスできるのかどうかはわかりません。

flashオブジェクトには、たとえばServicesからアクセスできますか?

ライブウェブリクエスト中でもどこでもかまいませんか?

アクセスの正確な制限は何ですか?

答えて

17

flashにアクセスするには、Webリクエストにアクセスするたびに、さらに重要なことはどこでも可能です。一般にはGrailsWebRequestオブジェクトから取得できます。あなたがWeb要求のコンテキスト外retrieveGrailsWebRequest()を起動した場合

import org.codehaus.groovy.grails.web.util.WebUtils 

def grailsWebRequest = WebUtils.retrieveGrailsWebRequest() 
// request is the HttpServletRequest 
def flash = grailsWebRequest.attributes.getFlashScope(request) 

は、あなたがIllegalStateExceptionを取得します。 GrailsWebRequestは、サービスリクエストの早い段階で実行されるフィルタGrailsWebRequestFilterによって現在のスレッドにバインドされています。したがって、基本的には、リクエストのコンテキスト内でこのフィルタ実行の「内部」にいる限り、フラッシュにアクセスできる必要があります。

さらに、org.codehaus.groovy.grails.web.servlet.DefaultGrailsApplicationAttributesの情報源を見てください。フラッシュストレージはセッションに保存されるため、理論的にはセッションにアクセスした後で使用することができます。しかし、それはセッションの異なるリクエスト間で共有されるので注意してください。前述のフィルタは、2要素キューからConcurrentHashMapを本質的にポップする要求全体を通してフラッシュの状態を前進させる責任があります。

5

限り、あなたはリクエストのコンテキスト内だとしてあなたは

import org.codehaus.groovy.grails.web.util.WebUtils 

def flashScope = WebUtils.retrieveGrailsWebRequest().flashScope 

とフラッシュスコープにアクセスすることができます(GrailsのスクリプトとQuartzジョブがコンテキスト内にないGrailsのアプリで場所の例であり、要求の)

関連する問題