Grails(Java笨狗)系列--Configuration

阅读更多

首先,Grails是一个信奉“规约重于配置”的框架,这一点是来自现在流行的Rails.使用Grails的默认设置进行开发,你不需要任何的配置。Grilas装备有一个内置的容器和一个HSQLDB物理内存数据库。

不过有时,你也需要在实际的项目中使用相应的数据库,下面介绍Grails的一些配置(很简单的,这里我用自己的一些项目来说明):

对于普通的配置 Grails 提供了一个路径为 grails-app/conf/Config.groovy的配置文件。

注意看Config.groovy

// locations to search for config files that get merged into the main config
// config files can either be Java properties files or ConfigSlurper scripts

// grails.config.locations = [ "classpath:${appName}-config.properties",
//                             "classpath:${appName}-config.groovy",
//                             "file:${userHome}/.grails/${appName}-config.properties",
//                             "file:${userHome}/.grails/${appName}-config.groovy"]

// if(System.properties["${appName}.config.location"]) {
//    grails.config.locations << "file:" + System.properties["${appName}.config.location"]
// }
grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format
grails.mime.types = [ html: ['text/html','application/xhtml+xml'],
                      xml: ['text/xml', 'application/xml'],
                      text: 'text-plain',
                      js: 'text/javascript',
                      rss: 'application/rss+xml',
                      atom: 'application/atom+xml',
                      css: 'text/css',
                      csv: 'text/csv',
                      all: '*/*',
                      json: ['application/json','text/json'],
                      form: 'application/x-www-form-urlencoded',
                      multipartForm: 'multipart/form-data'
                    ]
// The default codec used to encode data with ${}
grails.views.default.codec="none" // none, html, base64

// enabled native2ascii conversion of i18n properties files
grails.enable.native2ascii = true

// log4j configuration
log4j {
    appender.stdout = "org.apache.log4j.ConsoleAppender"
    appender.'stdout.layout'="org.apache.log4j.PatternLayout"
    appender.'stdout.layout.ConversionPattern'='[%r] %c{2} %m%n'
    appender.errors = "org.apache.log4j.FileAppender"
    appender.'errors.layout'="org.apache.log4j.PatternLayout"
    appender.'errors.layout.ConversionPattern'='[%r] %c{2} %m%n'
    appender.'errors.File'="stacktrace.log"
    rootLogger="error,stdout"
    logger {
        grails="error"
        StackTrace="error,errors"
        org {
            codehaus.groovy.grails.web.servlet="error"  //  controllers
            codehaus.groovy.grails.web.pages="error" //  GSP
            codehaus.groovy.grails.web.sitemesh="error" //  layouts
            codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping
            codehaus.groovy.grails."web.mapping"="error" // URL mapping
            codehaus.groovy.grails.commons="info" // core / classloading
            codehaus.groovy.grails.plugins="error" // plugins
            codehaus.groovy.grails.orm.hibernate="error" // hibernate integration
            springframework="off"
            hibernate="off"
        }
    }
    additivity.StackTrace=false
}

// WAR dependency config
grails.war.dependencies = [
    "ant.jar",
    "ant-launcher.jar",
    "hibernate3.jar",
    "jdbc2_0-stdext.jar",
    "jta.jar",
    "groovy-all-*.jar",
    "springmodules-sandbox.jar",
    "standard-${servletVersion}.jar",
    "jstl-${servletVersion}.jar",
    "antlr-*.jar",
    "cglib-*.jar",
    "dom4j-*.jar",
    "ehcache-*.jar",
    "junit-*.jar",
    "commons-logging-*.jar",
    "sitemesh-*.jar",
    "spring-*.jar",
    "log4j-*.jar",
    "ognl-*.jar",
    "hsqldb-*.jar",
    "commons-lang-*.jar",
    "commons-collections-*.jar",
    "commons-beanutils-*.jar",
    "commons-pool-*.jar",
    "commons-dbcp-*.jar",
    "commons-cli-*.jar",
    "commons-validator-*.jar",
    "commons-fileupload-*.jar",
    "commons-io-*.jar",
    "commons-io-*.jar",
    "*oro-*.jar",
    "jaxen-*.jar",
    "xercesImpl.jar",
    "xstream-1.2.1.jar",
    "xpp3_min-1.1.3.4.O.jar"
]

grails.war.java5.dependencies = [
    "hibernate-annotations.jar",
    "ejb3-persistence.jar",
]


 上面是源代码.它使用了Groovy's ConfigSlurper,类似于Java的属性文件,只不过他是使用纯粹的Groovy文件,你可以重复使用变量和正确的Java类型。

 

你可以在这里添加你自己的配置, for example:

foo.bar.hello = "world"
 稍后你可以在你的应用项目中访问这些设置。在大多数情况下你可以通过 GrailsApplication (在controllers and tag中的可用变量)对象来访问:
assert "world" == grailsApplication.config.foo.bar.hello

 

 

Grails也提供下面这些配置选项:

  1. grails.enable.native2ascii - 设置为false 你将不要求 native2ascii 转换Grails i18n 属性文件。
    grails.enable.native2ascii = true
     默认为true.
  2. grails.views.default.codec - 设置GSP的默认编码方式 - 可以为这些中的其中一个( 'none', 'html',  'base64' (default: 'none')). 为了 减少XSS攻击的风险, 设置为 'html'.
    grails.views.default.codec="none"
     默认为none。


Grails 使用普通的配置机制去配置潜在的  Log4j log system。配置 logging你必须修改 Config.groovy文件 ,位于 grails-app/conf 路径下,它允许你指定单独的logging配置(如: development, test,  production environments.)。Grails 执行 Config.groovy 文件 并在web-app/WEB-INF/classes目录下产生适当的 log4j.properties 文件 。
log4j {
    appender.stdout = "org.apache.log4j.ConsoleAppender"
    appender.'stdout.layout'="org.apache.log4j.PatternLayout"
    appender.'stdout.layout.ConversionPattern'='[%r] %c{2} %m%n'
    appender.errors = "org.apache.log4j.FileAppender"
    appender.'errors.layout'="org.apache.log4j.PatternLayout"
    appender.'errors.layout.ConversionPattern'='[%r] %c{2} %m%n'
    appender.'errors.File'="stacktrace.log"
    rootLogger="error,stdout"
    logger {
        grails="error"
        StackTrace="error,errors"
        org {
            codehaus.groovy.grails.web.servlet="error"  //  controllers
            codehaus.groovy.grails.web.pages="error" //  GSP
            codehaus.groovy.grails.web.sitemesh="error" //  layouts
            codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping
            codehaus.groovy.grails."web.mapping"="error" // URL mapping
            codehaus.groovy.grails.commons="info" // core / classloading
            codehaus.groovy.grails.plugins="error" // plugins
            codehaus.groovy.grails.orm.hibernate="error" // hibernate integration
            springframework="off"
            hibernate="off"
        }
    }
 如果你更喜欢标准的 Log4j 属性文件样式配置 你可以使用Groovy的多行String替代:
log4j = '''
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# ...remaining configuration
'''

 注意:Groovy的多行String是

 '''  '''

的形式。

一些有用的 loggers:

  • org.codehaus.groovy.grails.commons - 核心工件( artefact)信息 比如 class loading 等等.
  • org.codehaus.groovy.grails.web - Grails web 请求处理
  • org.codehaus.groovy.grails.web.mapping - URL mapping调试
  • org.codehaus.groovy.grails.plugins - 记录插件行为
  • org.springframework - 观察spring正在干什么。
  • org.hibernate -观察Hibernate正在干什么。

 

 

当有异常抛出,full trace 总是会写入 StackTrace logger,文件名叫做 stacktrace.log--当然你可以做任何你喜欢的改变通过grails-app/conf/Config.groovy文件,例如:

StackTrace="error,errors"

 你可以改变成:

StackTrace="error,stdout"

 可以完全废除stacktrace filtering 通过设置 grails.full.stacktrace VM 属性为 true:

grails -Dgrails.full.stacktrace=true run-app

 

 

Logging通过规约:

所用的应用程序工件( artefacts)可以动态的添加 log 属性. 包括 domain classes, controllers, tag libraries 等等. 例如:

def foo = "bar"
log.debug "The value of foo is $foo"

 Logs命名 使用 规约 grails.app..ClassName,例如:

# Set level for all application artefacts
log4j.logger.grails.app="info, stdout"

# Set for a specific controller log4j.logger.grails.app.controller.YourController="debug, stdout"

# Set for a specific domain class log4j.logger.grails.app.domain.Book="debug, stdout"

# Set for a specific taglib log4j.logger.grails.app.tagLib.FancyAjax="debug, stdout"

# Set for all taglibs log4j.logger.grails.app.tagLib="info, stdout"

 工件(artefacts) 名字通过规约来规定:

  • bootstrap - For bootstrap classes
  • dataSource - For data sources
  • tagLib - For tag libraries
  • service - For service classes
  • controller - For controllers
  • domain - For domain entities

 

 因为Grails 是构建在Java 技术 之上,配置data source 要求一些JDBC知识(并不是替代  Java Database Connectivity).

 

本质上, 如果你使用除HSQLDB以外的database , 你需要其对应的JDBC driver 。这里我们使用MySql。

首先你的下载JDBC driver,并把他放在项目中的lib目录下。

其次你得修改位于项目中的grails-app/conf/DataSource.groovy文件。

主要包括一下设置:

  • driverClassName -  JDBC driver的class name.
  • username - username 为你的数据库用户名
  • password - password 为你的数据库密码
  • url -  数据库的JDBC URL
  • dbCreate - 是否从domain model 自动生成数据库。
  • pooling - 是否使用连接池 (默认为true)
  • logSql - SQL logging

附上源代码:

dataSource {
	pooled = false
	driverClassName = "org.hsqldb.jdbcDriver"
	username = "sa"
	password = ""
}
hibernate {
    cache.use_second_level_cache=true
    cache.use_query_cache=true
    cache.provider_class='org.hibernate.cache.EhCacheProvider'
}
// environment specific settings
environments {
	development {
		dataSource {
			dbCreate = "create-drop" // one of 'create', 'create-drop','update'
			url = "jdbc:hsqldb:mem:devDB"
		}
	}
	test {
		dataSource {
			dbCreate = "update"
			url = "jdbc:hsqldb:mem:testDb"
		}
	}
	production {
		dataSource {
			dbCreate = "update"
			url = "jdbc:hsqldb:file:prodDb;shutdown=true"
		}
	}
}
 

 

 

 

典型的MySQ配置:

dataSource {
	pooling = true
	dbCreate = "update"
	url = "jdbc:mysql://localhost/yourDB"
	driverClassName = "com.mysql.jdbc.Driver"
	username = "yourUser"
	password = "yourPassword"	
}
 

 

JNDI DataSources

有时你需要使用JNDI,Grails支持JNDI:

dataSource {
    jndiName = "java:comp/env/myDataSource"
}

 

 

 

 DataSource 的dbCreate 属性定义是非常重要的 ,因为他规定了Grails 在运行时怎样尝试数据库表格 ,可选的操作:

  • create-drop - 当Grails运行时自动销毁和产生数据库表格。
  • create - 假如不存在就创建它,但不是修改它。
  • update -假如不存在就创建它, 假如存在就修改它。

 

 

 

dataSource {
	dbCreate = "create-drop" // one of 'create', 'create-drop','update'
}

 当然,假如你不想使用上面所说的配置,你可以删除

dataSource {
	dbCreate = "create-drop" // one of 'create', 'create-drop','update'
}

 

就可以了。

 

你可能感兴趣的:(Grails,Java,Groovy,log4j,Hibernate)