查看 org.codehaus.groovy.grails.web.plugins.support.WebMetaUtils,其中有一个方法,看完就明白了
/**
* This creates the difference dynamic methods and properties on the controllers. Most methods
* are implemented by looking up the current request from the RequestContextHolder (RCH)
*/
static registerCommonWebProperties(MetaClass mc, GrailsApplication application) {
def paramsObject = { -> RCH.currentRequestAttributes().params }
def flashObject = { -> RCH.currentRequestAttributes().flashScope }
def sessionObject = { -> RCH.currentRequestAttributes().session }
def requestObject = { -> RCH.currentRequestAttributes().currentRequest }
def responseObject = { -> RCH.currentRequestAttributes().currentResponse }
def servletContextObject = { -> RCH.currentRequestAttributes().servletContext }
def grailsAttrsObject = { -> RCH.currentRequestAttributes().attributes }
// the params object
mc.getParams = paramsObject
// the flash object
mc.getFlash = flashObject
// the session object
mc.getSession = sessionObject
// the request object
mc.getRequest = requestObject
// the servlet context
mc.getServletContext = servletContextObject
// the response object
mc.getResponse = responseObject
// The GrailsApplicationAttributes object
mc.getGrailsAttributes = grailsAttrsObject
// The GrailsApplication object
mc.getGrailsApplication = { -> RCH.currentRequestAttributes().attributes.grailsApplication }
mc.getActionName = { -> RCH.currentRequestAttributes().actionName }
mc.getControllerName = { -> RCH.currentRequestAttributes().controllerName }
mc.getWebRequest = { -> RCH.currentRequestAttributes() }
}