Scala 如何使用Play 2.0创建自定义404页面处理程序?
使用Play 2.0处理404错误并显示良好模板视图的首选方法是什么?您可以覆盖对象上的Scala 如何使用Play 2.0创建自定义404页面处理程序?,scala,playframework-2.0,Scala,Playframework 2.0,使用Play 2.0处理404错误并显示良好模板视图的首选方法是什么?您可以覆盖对象上的onHandlerNotFound方法,例如: 对象全局扩展全局设置{ 覆盖def onHandlerNotFound(请求:RequestHeader):结果={ NotFound(views.html.NotFound(请求)) } } 如果您想使用Java而不是Scala来做同样的事情,您可以这样做(这适用于play framework 2.0.3): Global.java: import play.
onHandlerNotFound
方法,例如:
对象全局扩展全局设置{
覆盖def onHandlerNotFound(请求:RequestHeader):结果={
NotFound(views.html.NotFound(请求))
}
}
如果您想使用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());
}
}
public Promise<SimpleResult> onHandlerNotFound(RequestHeader request) {
return Promise.<SimpleResult>pure(notFound(
views.html.throw404.render()
));
}
如果您的404错误模板是views.html.error404(即views/error404.scala.html)。请注意,有两个不同的问题需要解决:
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)
)
}
}
步骤2:添加模板。这是我的:
@(path: String)
<html>
<body>
<h1>Uh-oh. That wasn't found.</h1>
<p>@path</p>
</body>
</html>
步骤4:重新启动并转到无效URL
“真实处理程序找不到对象”场景
在第二个场景中,现有处理程序希望显示自定义404。例如,用户请求对象“1234”,但不存在此类对象。好消息是这样做很容易:
用NotFound()代替Ok(),将您的响应包围起来。
例如:
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"))
}
}
}
我喜欢的是将状态代码(200 vs 404)与返回的HTML(showFruit vs noSuchFruit)完全分离
嗯
Andrew这在2.2.1中起作用。在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());
}
}
public Promise<SimpleResult> onHandlerNotFound(RequestHeader request) {
return Promise.<SimpleResult>pure(notFound(
views.html.throw404.render()
));
}
公共承诺onHandlerNotFound(请求头请求){
返回承诺。纯(未找到)(
views.html.throw404.render()文件
));
}
确保您有一个名为
/views/throw404.scala.html的视图
这在2.2.3 Play-Java中适用
public Promise<SimpleResult> onHandlerNotFound(RequestHeader request) {
return Promise<SimpleResult>pure(Results.notFound(views.html.notFound404.render()));
}
公共承诺onHandlerNotFound(请求头请求){
返回Promisepure(Results.notFound(views.html.notFound404.render());
}
html应该在/views/notFound404.scala.html中
不要忘记添加Results.notFounf()并导入play.mvc.Results 请注意,游戏开发团队正在努力摆脱游戏中的全局状态,因此
GlobalSettings
和应用程序全局对象自版本2.4以来一直被弃用
应使用HttpErrorHandler.onClientError而不是
GlobalSettings.onHandlerNotFound
。基本上创建一个继承自HttpErrorHandler
的类,并为onClientError
方法提供实现
为了找出错误的类型(在您的例子中是404),您需要读取状态代码,该代码作为一个方法参数传递
if(statusCode == play.mvc.Http.Status.NOT_FOUND) {
// your code to handle 'page not found' situation
// e.g. return custom implementation of 404 page
}
为了让Play知道要使用什么处理程序,您可以将错误处理程序放在根包中,或者使用Play.http.errorHandler
configuration键在application.conf中配置它,例如
play.http.errorHandler = "my.library.MyErrorHandler"
您可以在这里找到有关错误处理的更多详细信息:对于或。对于Java,如果您只想重定向到主页面,我可以这样解决它
@Override
public Promise<Result> onHandlerNotFound(RequestHeader request) {
return Promise.pure(redirect("/"));
}
@覆盖
公共承诺onHandlerNotFound(请求头请求){
返回承诺。纯(重定向(“/”);
}
您是否自己创建了一个页面?当我尝试该代码时,它说它不起作用?是的,该代码假定在视图/
目录中有notFound.scala.html
模板。@JulienRichard Foy:请注意,您的解决方案仅适用于2.0.4。在2.0中,它是onActionNotFound,请参见差异:请注意,在Play 2.2.x中,返回类型已更改,因此应该在将来对其进行包装。如果将Global
对象放入根包中,即app/views/Global.scala,而不是示例中的app/views/controllers/Global.scala,则可以跳过步骤3。默认的application.conf指向这里:#application.global=global
在播放2.2中,回答必须在将来进行包装:您的问题不包含此问题的至少一个其他答案尚未提供的任何信息。键入: