grails提供了两种对请求的拦截机制,一是在Controller中定义beforeInterceptor和afterInterceptor两个方法,分别在执行action之前和之后调用,具体实现代码是在SimpleGrailsController和SimpleGrailsControllerHelper中,不再赘述。
还有一个是Filter,即在grails-app/conf目录下定义以Filters结尾的groovy文件既可,提供了三个拦截方法before,after,afterView,分别对应Spring MVC的HandlerInterceptor接口的preHandle(在处理请求前调用),postHandle(在处理请求后生成View之前调用,提供了修改Model的机会),afterCompletion(在请求处理完毕生成View之后调用)。
看看源码即可发现其实grails的MVC即是在Spring MVC框架上包装一层而成的,所以看来暂时不可能把核心框架修改为struts的可能。
下面看看grails是如何把Filters结尾的groovy文件变成Spring的HandlerInterceptor。
DefaultGrailsPlugin加载所有的plugin,当然也包含FiltersGrailsPlugin
DefaultGrailsPlugin.groovy
//加载plugin,调用plugin的doWithApplicationContext方法
public void doWithRuntimeConfiguration(
RuntimeSpringConfiguration springConfig) {
if(this.pluginBean.isReadableProperty(DO_WITH_SPRING)) {
if(LOG.isDebugEnabled()) {
LOG.debug("Plugin " + this + " is participating in Spring configuration...");
}
//调用plugin的doWithSpring方法,加载plugin到spring的ApplicationContext,使用Spring DSL方式的BeanBuilder
Closure c = (Closure)this.plugin.getProperty(DO_WITH_SPRING);
BeanBuilder bb = new BeanBuilder(getParentCtx(), application.getClassLoader());
bb.setSpringConfig(springConfig);
Binding b = new Binding();
b.setVariable("application", application);
b.setVariable("manager", getManager());
b.setVariable("plugin", this);
b.setVariable("parentCtx", getParentCtx());
b.setVariable("resolver", getResolver());
bb.setBinding(b);
c.setDelegate(bb);
bb.invokeMethod("beans", new Object[]{c});
}
}
//动态配置plugin,调用plugin的doWithApplicationContext方法
public void doWithApplicationContext(ApplicationContext applicationContext)
FiltersGrailsPlugin.groovy
def watchedResources = "file:./grails-app/conf/**/*Filters.groovy"
//Spring bean DSL
static final BEANS = { filter ->
"${filter.fullName}Class"(MethodInvokingFactoryBean) {
targetObject = ref("grailsApplication", true)
targetMethod = "getArtefact"
arguments = [TYPE, filter.fullName]
}
"${filter.fullName}"(filter.clazz) { bean ->
bean.singleton = true
bean.autowire = "byName"
}
}
//生成了实现spring HandlerInterceptor接口的filterInterceptor
def doWithSpring = {
filterInterceptor(org.codehaus.groovy.grails.plugins.web.filters.CompositeInterceptor) {
}
for(filter in application.getArtefacts(TYPE)) {
def callable = BEANS.curry(filter)
callable.delegate = delegate
callable.call()
}
}
def doWithApplicationContext = { applicationContext ->
reloadFilters(application, applicationContext)
}
// 把Filters groovy类变成CompositeInterceptor的handlers成员
// 用FilterToHandlerAdapter适配器把preHandle==before,postHandle==after,afterCompletion==afterView对应起来
private reloadFilters(GrailsApplication application, applicationContext) {
log.info "reloadFilters"
def filterConfigs = application.getArtefacts(TYPE)
def handlers = []
for(c in filterConfigs) {
def filterClass = applicationContext.getBean("${c.fullName}Class")
def bean = applicationContext.getBean(c.fullName)
for(filterConfig in filterClass.getConfigs(bean)) {
handlers << new FilterToHandlerAdapter(filterConfig:filterConfig, configClass:bean)
}
}
if (log.isDebugEnabled()) log.debug("resulting handlers: ${handlers}")
applicationContext.getBean('filterInterceptor').handlers = handlers
}
分享到:
相关推荐
标题中的"grails-fck-editor-0.3.zip_grails_grails-fck-editor"表明这是一个与Grails框架相关的插件,具体来说是FCKeditor的一个版本。FCKeditor是一款广泛使用的开源富文本编辑器,它允许用户在网页上创建和编辑...
总之,"grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip"提供了一个宝贵的资源,让开发者有机会学习和实践Grails的ORM功能和Android的MVC设计模式。无论是对Grails框架的探索,还是对Android开发的深化,这...
Grails入门指南书籍和源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺 getting started with grails chinese Grails入门指南书籍和源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺 getting started with ...
`grails-doc-CN-1.0.rar` 文件包含的是 Grails 1.0 版本的中文参考文档,对于那些不熟悉英文文档或者想要深入了解 Grails 的中文用户来说,这是一个极其宝贵的资源。 文档主要涵盖以下几个关键知识点: 1. **...
groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2 共两个包,解压后需要将扩展名.zip.bak改名为.zip重新解压。 http://dist.springsource.com/release/STS/3.8.1.RELEASE/dist/ e4.6/spring-tool-...
本文将深入探讨Grails的中文文档以及“grails-fckeditor-0.9.5”插件的相关知识点。 一、Grails框架基础 1. Groovy语言:Grails的基础是Groovy,这是一种面向对象、动态类型的编程语言,语法简洁且与Java高度兼容...
groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1 共两个压缩包,解压后将扩展名.zip.bak改为.zip再次解压。
《Grails Web URL Mappings 2.5.4:开源项目的URL路由艺术》 在Web开发领域,路由是连接用户请求与服务器响应的核心机制...而"grails-web-url-mappings-2.5.4.zip"的解压,为我们提供了研究和学习这一机制的宝贵资源。
grails-doc-1.0-beta1-中文.rar。Grails 1.0 学习资料。
2. **创建新项目**:通过`grails create-app`命令创建项目,理解`grails-app`目录结构。 3. **编写Domain Class**:学习如何定义领域类,包括关系映射和验证规则。 4. **创建Controller**:了解如何创建控制器,处理...
`grails-docs-2.0.0`是Grails 2.0.0版本的官方文档,包含了丰富的指南、API参考以及国际化资源,对于学习和掌握Grails 2.0.0至关重要。 首先,`index.html`是文档的主页,通常会包含目录、介绍性内容以及如何开始的...
以下是关于"grails-3.0.5-ga (2/2)"的详细知识点: 1. **Groovy语言**: Grails框架是用Groovy语言编写的,这是一种动态、面向对象的编程语言,与Java高度兼容,但语法更加简洁和灵活。 2. **MVC架构**: Grails遵循...
《Grails框架API文档详解——基于grails-docs-1.0》 Grails是一种基于Groovy语言的开源Web应用框架,它简化了Java开发,提供了丰富的功能和强大的工具,深受开发者喜爱。本文将深入探讨grails-docs-1.0版本的API...
### Grails入门指南知识点 #### 一、Grails框架简介 - **背景**: Grails是一个基于Groovy语言的开源Web应用框架,适用于Java平台。它旨在简化开发过程,提高开发效率,尤其受到那些希望保留Java环境同时寻求更高效...
Grails是一个高效的Web开发框架,它基于Groovy编程语言并构建在Spring、Hibernate和其他Java框架之上。这使得Grails成为一个一站式的解决方案,极大地提高了开发者的生产力。本文将详细介绍Grails的基本概念、核心...
4. `docs`、`grails-app`、`src`、`scripts`和`lib`目录则分别包含了插件的文档、应用代码、源代码、脚本以及依赖的库文件。 Grails Acegi 0.5插件提供了以下主要功能: - **用户认证**:支持多种认证机制,如...
Spring Websocket Grails插件 ... implementation "org.grails.plugins:grails-spring-websocket:2.5.0.RC1" 该插件已发布到bintray,并链接到grails/plugins以及jcenter 。 用法 该插件还可以在Grai
标题 "grails-datastore-gorm-tck-1.0.9.RELEASE.zip" 提供的信息表明,这是一个与Grails框架相关的数据存储(Datastore)和GORM(Grails Object Relational Mapping)测试兼容性工具包(Test Compatibility Kit,...
Grails开源框架 - 使用指南,版本1.0,中文文档。 Grails开源框架 - 使用指南 作者: Graeme Rocher, Marc Palmer 版本: 1.0 Copies of this document may be made for your own use and for distribution to ...
总的来说,“grails-acegi-0.2.1.zip”是一个研究Grails安全机制的良好起点,尤其是对于那些希望深入了解Grails权限管理和Spring Security集成的开发者来说,这个插件的源代码和配置文件提供了丰富的学习资源。