Dou*_*rel 7 grails groovy filter
Grails提供在控制器之前运行的过滤器.它们在类似于以下的类中定义:
class SecurityFilters {
def filters = {
myFilter(controller:'*', action:'*') { // What are those weird colons??
print "I'm filtering!"
// Code that does the filtering goes here
}
}
}
Run Code Online (Sandbox Code Playgroud)
这些工作很好,但我想更好地理解语法,因为它看起来不像我以前见过的任何Groovy代码.特别是,上面的那行开头myFilter似乎很奇怪.这是一个名为方法的方法定义myFilter吗?如果是这样,:'*'每个参数后的含义是什么?我认为这可能是一个默认参数值,但那可能是='*'.我之前在方法调用中看过使用冒号的命名参数,但这不是方法调用,因为我没有myFilter()在其他任何地方定义.
如果有人能告诉我如何从普通的Groovy类执行过滤代码,我想我会理解得更好.换句话说,如果我有一个文件MyFilters.groovy包含上面的行,我怎么能完成这个Groovy代码,所以它打印"我正在过滤"?
import MyFilters
def mf = new MyFilters()
mf.filters.somethingGoesHere // Help! How do I finish this line so it calls my filtering code?
Run Code Online (Sandbox Code Playgroud)
以下Groovy代码将打印"我正在过滤!":
class SecurityFilters {
def filters = {
myFilter(controller:'*', action:'*') { // What are those weird colons??
print "I'm filtering!"
// Code that does the filtering goes here
}
}
}
class FilterDelegate {
def methodMissing(String methodName, args) {
// methodName == myFilter
// args[0] == [controller:*, action:*]
// args[1] == {print "I'm filtering!"}
args[1].call()
}
}
def sf = new SecurityFilters()
def filtersClosure = sf.filters
filtersClosure.delegate = new FilterDelegate()
filtersClosure.call()
Run Code Online (Sandbox Code Playgroud)
在这个例子中,filters是一个闭包,它调用一个名为myFilter的方法并传递一个map和一个闭包.您可以将myFilter视为:
myFilter([controller:'*', action:'*'], closure)
Run Code Online (Sandbox Code Playgroud)
Map可以包含控制器,动作或uri等键.当Grails尝试确定要调用哪个闭包时,尝试匹配HTTP请求中的URI时使用通配符(*).
我对Grails如何处理过滤器的理解是使用了委托加载器类.loader类提供了methodMissing方法,并为filters关闭内的每个方法调用创建了一个FilterConfig.当发出HTTP请求时,Grails会查看所有FilterConfig对象并尝试查找匹配的范围(在地图中查找控制器,操作或uri并使用正则表达式匹配通配符).如果找到匹配,则调用传递给Filter类中的方法的闭包.
| 归档时间: |
|
| 查看次数: |
7018 次 |
| 最近记录: |