Play 2.0 中文资料 - 应用程序全局对象
应用全局设置
全局对象
在你的项目中定义一个
要说呢,不带 package 声明的写法确实不是什么好习惯,因为其他带 package 声明的类无法使用它。见:为何Java的有包名的类不能引用默认包中的类。这就对了,本来这个全局对象就不是给别的类用的 - Don't call me, I'll call you。
勾住应用启动和停止事件
你可以覆盖方法
Unmi 注: Play 1.x 时代要实现这样的 Bootstrap,必须实现自己的 Job,@OnApplicationStart 标注类,它的 doJob() 方法就会在应用启动时执行,@OnApplicationStop 标注的 Job 会在应用停止时执行。参考:http://www.playframework.org/documentation/1.2.5/jobs。但是 Play 1.x 这样做可以让你用 @OnApplicationStart 或 @OnApplicationStop 标注多个类或启动多个 Job。
不管是原来的 @OnApplicationStart,还是现在的 onStart,其实是在第一个请求进来时执行的。
提供应用的错误页面
当你的应用出现一个异常时,
处理找不到 Action 和绑定错误
If the framework doesn’t find an
在找到了 Route 但现代派定请求参数时出现问题时,
拦截请求
覆盖 onRouteRequest 方法
使用 Action 组合 还可以去拦截特定的 Action 方法。
永久链接 https://yanbin.blog/play2-0-tutorials-cn-application-global-object/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
全局对象
在你的项目中定义一个
Global 对象,它为你处理应用的全局设置. 这个对象必须定义在默认包中(即不带 package 声明的包).1import play.api._
2
3object Global extends GlobalSettings {
4
5}小贴士: 你也可使用Unmi 注: GlobalSettings.scala 放在 app 目录比较合适,Scala 的 package 层次与目录并不存在严格的对应关系。application.globalkey 值在在配置中指定自己的GlobalSettings实现类名称.
要说呢,不带 package 声明的写法确实不是什么好习惯,因为其他带 package 声明的类无法使用它。见:为何Java的有包名的类不能引用默认包中的类。这就对了,本来这个全局对象就不是给别的类用的 - Don't call me, I'll call you。
勾住应用启动和停止事件
你可以覆盖方法
onStart 和 onStop,它们会在应用的生命周期启动,停止时得到通知: 1import play.api._
2
3object Global extends GlobalSettings {
4
5 override def onStart(app: Application) {
6 Logger.info("Application has started")
7 }
8
9 override def onStop(app: Application) {
10 Logger.info("Application shutdown...")
11 }
12
13}不管是原来的 @OnApplicationStart,还是现在的 onStart,其实是在第一个请求进来时执行的。
提供应用的错误页面
当你的应用出现一个异常时,
onError 方法将会得到执行. 它默认时被用作内部框架错误页面: 1import play.api._
2import play.api.mvc._
3import play.api.mvc.Results._
4
5object Global extends GlobalSettings {
6
7 override def onError(request: RequestHeader, ex: Throwable) = {
8 InternalServerError(
9 views.html.errorPage(ex)
10 )
11 }
12
13}If the framework doesn’t find an
Action for a request, the onHandlerNotFound operation will be called: 1import play.api._
2import play.api.mvc._
3import play.api.mvc.Results._
4
5object Global extends GlobalSettings {
6
7 override def onHandlerNotFound(request: RequestHeader): Result = {
8 NotFound(
9 views.html.notFoundPage(request.path)
10 )
11 }
12
13}onBadRequest 方法就会被调用(Unmi 注: Play 1.x 是否有这样的机制呢?): 1import play.api._
2import play.api.mvc._
3import play.api.mvc.Results._
4
5object Global extends GlobalSettings {
6
7 override def onBadRequest(request: RequestHeader, error: String) = {
8 BadRequest("Bad Request: " + error)
9 }
10
11}覆盖 onRouteRequest 方法
Global 对象的另一个重要的方面是它还提供了一种方式去拦截请求,并在请求派发给 Action 之前执行业务逻辑.小贴士 这个勾也可用于劫持请求, 允许开发者插入他们自己的请求路由机制.让我们来看它实际是怎么工作的:
1import play.api._
2import play.api.mvc._
3
4// Note: this is in the default package.
5object Global extends GlobalSettings {
6
7 override def onRouteRequest(request: RequestHeader): Option[Handler] = {
8 println("executed before every request:" + request.toString)
9 super.onRouteRequest(request)
10 }
11
12}永久链接 https://yanbin.blog/play2-0-tutorials-cn-application-global-object/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。