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)
And*_*w E 20
请注意,有两个不同的问题需要解决:
当"没有找到处理程序"时显示自定义404页面,例如当用户转到无效URL时,和
将自定义404(NotFound)页面显示为现有处理程序的有效结果.
我认为OP指的是#2,但答案提到#1.
在第一个场景中,对于"找不到处理程序"(即无效的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步:重新启动并转到无效的网址.
在第二种情况下,现有处理程序想要显示自定义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安德鲁
如果你想使用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).