玩所有匹配的框架路线

时间:2014-09-05 13:05:13

标签: angularjs routing playframework-2.0

我正在使用Play框架为我的休息服务开发一个角度应用程序。公用文件夹中的所有内容都是一个有角度的应用程序(样式表,javascripts,图像和HTML)。我希望每个请求都不会被样式表,javascripts,模板或图像文件夹中的某些内容路由到index.html页面。这样,角度路由可以从那里接管......

作为附注,我可以提一下,我将把/services/下的每个restservice放在我自己的java控制器上。

在游戏框架2.3.4中是否可以定义一条无需使用匹配元素即可捕获所有路由的路由?

这是我到目前为止的路线:

GET     /                       controllers.Assets.at(path="/public", file="index.html")
GET     /stylesheets/*file      controllers.Assets.at(path="/public/stylesheets", file)
GET     /javascripts/*file      controllers.Assets.at(path="/public/javascripts", file)
GET     /templates/*file        controllers.Assets.at(path="/public/templates", file)
GET     /images/*file           controllers.Assets.at(path="/public/images", file)

#this line fails
GET     /*                      controllers.Assets.at(path="/public", file="index.html")

2 个答案:

答案 0 :(得分:4)

不可能省略匹配元素​​的使用,但您可以通过控制器路由客户端。路线定义如下:

GET         /*path               controllers.Application.matchAll(path)

相应的控制器可以实现如下:

public class Application extends Controller {

    public static Result matchAll(String path) {
        return redirect(controllers.routes.Assets.at("index.html"));
    }

}

<强>更新

如果您不想重定向客户端,则可以将静态资源作为流返回。在这种情况下,需要响应MIME类型。

public class Application extends Controller {

    public static Result matchAll(String path) {
        return ok(Application.class.getResourceAsStream("/public/index.html")).as("text/html");
    }

}

答案 1 :(得分:0)

对于此任务,您可以在Global class中使用onHandlerNotFound,这会在不重定向的情况下呈现某些页面:

import play.*;
import play.mvc.*;
import play.mvc.Http.*;
import play.libs.F.*;

import static play.mvc.Results.*;

public class Global extends GlobalSettings {

    public Promise<Result> onHandlerNotFound(RequestHeader request) {
        return Promise.<Result>pure(notFound(
            views.html.notFoundPage.render(request.uri())
        ));
    }

}