Grails过滤器语法,或者,如何在Grails外部调用Grails过滤器
Grails提供在控制器之前运行的
filters.它们在类看起来像这样定义:
class SecurityFilters { def filters = { myFilter(controller:'*',action:'*') { // What are those weird colons?? print "I'm filtering!" // Code that does the filtering goes here } } } 这些工作很好,但我想更好地理解语法,因为它看起来不像我以前见过的任何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? 解决方法
以下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() 在这个例子中,filters是一个闭包,它调用一个名为myFilter的方法并传递一个map和一个闭包.您可以将myFilter视为: myFilter([controller:'*',action:'*'],closure) Map可以包含控制器,动作或uri等键.当Grails尝试确定要调用哪个闭包时,尝试匹配HTTP请求中的URI时使用通配符(*). 我对Grails如何处理过滤器的理解是使用了委托加载器类. loader类提供了methodMissing方法,并为filters关闭内的每个方法调用创建了一个FilterConfig.当发出HTTP请求时,Grails会查看所有FilterConfig对象并尝试查找匹配的范围(在地图中查找控制器,操作或uri并使用正则表达式匹配通配符).如果找到匹配,则调用传递给Filter类中的方法的闭包. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |