使用grails开发已经有一段时间,中间遇到不少问题,由于grails本身提供的文档有点简单,某些功能实现还须参考其源码。在分析过程中逐渐了解其运行构架,稍做介绍。
grails框架是根据约定优于配置这条原则搭建,MVC部分是基于Spring MVC,持久层是基于hibernate。查看打包后的文件目录,找到WEB-INF/web.xml,可以发现核心的几个配置
<filter>
<filter-name>urlMapping</filter-name>
<filter-class>org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>urlMapping</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>grails</servlet-name>
<servlet-class>org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>grails</servlet-name>
<url-pattern>*.dispatch</url-pattern>
</servlet-mapping>
urlMapping filter的作用是根据request uri查找到相应的grails controller的处理路径,然后forward到/grails/controller/action.dispatch,这样就
把请求转到了GrailsDispatcherServlet来处理,调用controller的各种拦截器,处理逻辑,并返回view。
在看看WEB-INF目录下还有两个重要的配置文件,applicationContext.xml和grails.xml
applicationContext.xml,加载grails各种工件(Artefact)和插件(plugin)
<bean id="grailsApplication" class="org.codehaus.groovy.grails.commons.GrailsApplicationFactoryBean">
<description>Grails application factory bean</description>
<property name="grailsDescriptor" value="/WEB-INF/grails.xml" />
<property name="grailsResourceLoader" ref="grailsResourceLoader" />
</bean>
grails.xml:又grails命令生成,包含grails工件和插件
<grails>
<resources>
<resource>ApplicationFilters</resource>
<resource>BootStrap</resource>
<resource>Config</resource>
<resource>DataSource</resource>
<resource>resources</resource>
<resource>UrlMappings</resource>
<resource>MagazineBusinessController</resource>
<resource>BusinessSmsLog</resource>
<resource>MonthBusinessChargeJob</resource>
<resource>SmsChargeService</resource>
<resource>MagazineBusinessService</resource>
<resource>XMLCodec</resource>
<resource>DefaultQuartzConfig</resource>
<resource>QuartzBootStrap</resource>
<resource>JobManagerController</resource>
<resource>JobManagerService</resource>
</resources>
<plugins>
<plugin>QuartzGrailsPlugin</plugin>
<plugin>RemotingGrailsPlugin</plugin>
</plugins>
grails中包含以下几种工件
DomainClass Artefact(Domain模型工件),Controller Artefact(Controller工件),Service Artefact(Service工件),TagLib Artefact(工件),Bootstrap ArtefactHandler(初始化启动工件),
Codec Artefact(Codec工件),UrlMappings Artefact(UrlMapping工件),Filters Artefact(过滤拦截工件)
GrailsApplicationFactoryBean的代码
public void afterPropertiesSet() throws Exception {
if(descriptor != null && descriptor.exists()) {
// Enforce UTF-8 on source code for reloads
CompilerConfiguration config = CompilerConfiguration.DEFAULT;
config.setSourceEncoding("UTF-8");
GroovyClassLoader classLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config);
List classes = new ArrayList();
SAXReader reader = new SAXReader();
InputStream inputStream = null;
try {
inputStream = descriptor.getInputStream();
Document doc = reader.read(inputStream);
List grailsClasses = doc.selectNodes("/grails/resources/resource");
for (Iterator i = grailsClasses.iterator(); i.hasNext();) {
Node node = (Node) i.next();
try {
classes.add(classLoader.loadClass(node.getText()));
} catch (ClassNotFoundException e) {
LOG.warn("Class with name ["+node.getText()+"] was not found, and hence not loaded. Possible empty class or script definition?");
}
}
} finally {
if(inputStream!=null)
inputStream.close();
}
Class[] loadedClasses = (Class[])classes.toArray(new Class[classes.size()]);
this.grailsApplication = new DefaultGrailsApplication(loadedClasses, classLoader);
}
else {
Assert.notNull(resourceLoader, "Property [resourceLoader] must be set!");
this.grailsApplication = new DefaultGrailsApplication(this.resourceLoader);
}
ApplicationHolder.setApplication(this.grailsApplication);
}
GrailsApplicationFactoryBean已经把grails.xml中所有的grails工件类加载了进来,保存在DefaultGrailsApplication中
DefaultGrailsApplication的代码
public DefaultGrailsApplication(final Class[] classes, GroovyClassLoader classLoader) {
...
this.allClasses = classes;
this.cl = classLoader;
this.applicationMeta = loadMetadata();//读取WEB-INF/classes下application.properties配置
}
private void initArtefactHandlers() {
registerArtefactHandler(new DomainClassArtefactHandler());
registerArtefactHandler(new ControllerArtefactHandler());
registerArtefactHandler(new ServiceArtefactHandler());
registerArtefactHandler(new TagLibArtefactHandler());
registerArtefactHandler(new BootstrapArtefactHandler());
registerArtefactHandler(new CodecArtefactHandler());
registerArtefactHandler(new UrlMappingsArtefactHandler());
// Cache the list as an array
this.artefactHandlers = ((ArtefactHandler[]) this.artefactHandlersByName.values().toArray(
new ArtefactHandler[artefactHandlersByName.size()]));
}
public boolean isArtefact(Class theClazz) {
String className = theClazz.getName();
for (Iterator i = allArtefactClasses.iterator(); i.hasNext();) {
Class artefactClass = (Class) i.next();
if (className.equals(artefactClass.getName())) {
return true;
}
}
return false;
}
就此分析GrailsApplication接口代表是应用中所有的工件,而ArtefactHandler是工件接口
public interface GrailsApplication extends ApplicationContextAware {
public Class[] getAllClasses();
public Class[] getAllArtefacts();
public boolean isArtefact(Class theClazz);
}
public interface ArtefactHandler {
boolean isArtefact(Class aClass);
GrailsClass newArtefactClass(Class artefactClass);
}
待续,后面准备就UrlMapping机制看看grails是如何处理工件再做分析
分享到:
相关推荐
实际上,一个grails插件和一个grails应用基本是完全一样的,同样可以使用grails run-app命令来运行。区别仅在于一个插件的根目录下需要提供一个fooplugin.groovy文件,提供插件的一些描述信息。
**Grails框架数据查询** Grails是一个基于Java平台的开源Web应用框架,它采用Groovy语言,提供了MVC(Model-View-Controller)架构模式,旨在简化开发过程,提高开发效率。在Grails中,数据查询是核心功能之一,...
GORM是Grails框架的核心部分,它为开发者提供了简单、强大的数据持久化功能,支持Hibernate和MongoDB等数据库。尽管我们不会直接使用Grails框架,但我们可以将GORM集成到Spring Boot应用中,利用其便利的ORM能力。 ...
《Grails1.1中文文档》是Grails 1.1版本的官方中文指南,包含了框架的详细介绍、安装指南、基本概念、MVC模式的应用、GORM的使用、服务层、控制器、视图、国际化、测试等方面的内容。通过阅读这份文档,开发者可以...
### Grails 开发笔记 #### Grails 概述 ...通过上述内容的总结与扩展,我们不仅了解了 Grails 的基本概念及其开发实践,还深入探讨了 Groovy 的特性以及如何利用这些特性来优化 Grails 应用的开发过程。
Grails提供了一个默认的"Hello World"示例,帮助新手快速理解框架的基本结构。 Grails框架的配置通常通过内置选项和外部文件来完成。例如,数据源的配置既可以在环境配置中直接设置,也可以通过JNDI数据源来管理。...
"grails-core"是Grails框架的核心模块,包含了构建、运行和管理Grails应用程序所需的基本组件和服务。这个框架的主要目标是提高开发效率,通过简化开发流程和提供丰富的内置功能来实现快速的Web应用开发。 **Groovy...
Grails是一个高效的Web开发框架,它基于Groovy编程语言并构建在Spring、Hibernate和其他Java框架之上。这使得Grails成为一个一站式的解决方案,极大地提高了开发者的生产力。本文将详细介绍Grails的基本概念、核心...
1. 学习入口:对于中文开发者来说,中文文档降低了学习Grails的门槛,帮助理解和掌握Grails的基本概念、框架结构、开发工具以及最佳实践。 2. 快速上手:文档通常包含安装指南、教程、API参考等,为开发者提供从零...
Eclipse会自动为你的项目生成基本的Grails结构,包括`grails-app`目录,其中包含了`controllers`, `domains`, `services`, `views`等子目录。 在Grails项目中,控制器(Controllers)负责处理HTTP请求,领域类...
《Grails 入门指南》是一本专门为初学者设计的教程,旨在帮助新手快速掌握Grails框架的基础知识和实际应用。Grails是一个基于Groovy语言的全栈式、开源的Web应用框架,它以简化开发流程和提高生产力为目标,特别适合...
通过本教程,读者将掌握Grails的基本开发技术,包括Groovy语言基础、MVC模式的理解以及Grails框架的核心组件使用。同时,也将具备进一步探索Grails高级特性的基础,如插件系统、国际化、安全性和测试等。对于熟悉...
- **创建一个Grails应用**:使用`grails create-app`命令可以快速创建一个新的Grails应用,这将生成基本的项目结构。 - **Hello World示例**:在新创建的应用中,你可以通过创建一个简单的控制器和视图来实现经典...
#### 一、Grails框架简介 - **背景**: Grails是一个基于Groovy语言的开源Web应用框架,适用于Java平台。它旨在简化开发过程,提高开发效率,尤其受到那些希望保留Java环境同时寻求更高效开发方式的开发者的欢迎。 ...
通过这个项目,初学者可以深入理解Grails的基本概念,包括MVC模式、GORM、数据库交互以及IntelliJ IDEA的使用。实践中遇到问题时,可以查阅Grails官方文档或在线社区寻求帮助。随着熟练度的提高,可以尝试自定义更多...
通过上述步骤,我们已经完成了Groovy和Grails的基本安装和配置工作。Groovy和Grails的结合使用为开发者提供了一个高效且功能强大的开发平台,尤其是在Java平台上进行Web应用开发时更是如此。希望本教程能够帮助初学...