Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何使用Play 2.0创建自定义404页面处理程序?_Scala_Playframework 2.0 - Fatal编程技术网

Scala 如何使用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.

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

您可以覆盖对象上的
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)。

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

  • 在“未找到处理程序”时显示自定义404页面,例如,当用户转到无效URL时,以及

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

  • 我认为OP指的是2,但答案指的是1。

    “未找到处理程序”场景 在第一个场景中,对于“找不到处理程序”(即无效URL),其他答案是正确的,但更详细,根据as:

    步骤1:添加自定义全局对象:

    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中,回答必须在将来进行包装:您的问题不包含此问题的至少一个其他答案尚未提供的任何信息。键入: