如何使用Play 2.0创建自定义404页面处理程序?

Jul*_*Foy 27 scala playframework-2.0

使用Play 2.0处理404错误并显示漂亮模板视图的首选方法是什么?

Jul*_*Foy 23

您可以覆盖对象onHandlerNotFound上的方法Global,例如:

object Global extends GlobalSettings {
  override def onHandlerNotFound(request: RequestHeader): Result = {
    NotFound(views.html.notFound(request))
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在Play 2.2.x中,返回类型已更改,因此应将其包装在Future中.http://www.playframework.com/documentation/2.2.x/ScalaGlobal (6认同)
  • 是的,这段代码假设你的`views /`目录中有一个`notFound.scala.html`模板. (2认同)

And*_*w E 20

请注意,有两个不同的问题需要解决:

  1. 当"没有找到处理程序"时显示自定义404页面,例如当用户转到无效URL时,和

  2. 将自定义404(NotFound)页面显示为现有处理程序的有效结果.

我认为OP指的是#2,但答案提到#1.

"没有找到Handler"场景

在第一个场景中,对于"找不到处理程序"(即无效的URL),其他答案是正确的,但要更详细,根据Play 2.1文档:

第1步:添加自定义Global对象:

import play.api._
import play.api.mvc._
import play.api.mvc.Results._

object Global extends GlobalSettings {

  override def onHandlerNotFound(request: RequestHeader): Result = {
    NotFound(
      views.html.notFoundPage(request.path)
    )
  }   
}
Run Code Online (Sandbox Code Playgroud)

第2步:添加模板.这是我的:

@(path: String)

<html>
<body>
<h1>Uh-oh. That wasn't found.</h1>
<p>@path</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

第3步:调整你的conf/application.conf来引用你的新"全局".我把它放在控制器包中,但它不一定是:

...
application.global=controllers.Global
Run Code Online (Sandbox Code Playgroud)

第4步:重新启动并转到无效的网址.

"Real Handler无法找到对象"场景

在第二种情况下,现有处理程序想要显示自定义404.例如,用户询问对象"1234"但不存在此类对象.好消息是这样做很容易:

而不是Ok(),用NotFound()包围您的响应

例如:

object FruitController extends Controller {

  def showFruit(uuidString: String) = Action {
    Fruits.find(uuidString) match {
      case Some(fruit) => Ok(views.html.showFruit(fruit))

      // NOTE THE USE OF "NotFound" BELOW!
      case None => NotFound(views.html.noSuchFruit(s"No such fruit: $uuidString"))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我喜欢这个是从返回的HTML(showFruit vs noSuchFruit)中清除状态代码(200 vs 404).

HTH安德鲁


Mig*_*sco 6

如果你想使用Java而不是Scala来做同样的事情,你可以这样做(这适用于play framework 2.0.3):

Global.java:

import play.GlobalSettings;
import play.mvc.Result;
import play.mvc.Results;
import play.mvc.Http.RequestHeader;


public class Global extends GlobalSettings {

    @Override
    public Result onHandlerNotFound(RequestHeader request) {
        return Results.notFound(views.html.error404.render());
    }
}
Run Code Online (Sandbox Code Playgroud)

假设你的404错误模板是views.html.error404(即views/error404.scala.html).