0

我有以下情况: 我需要根据提供的 URL 参数来渲染一个模板。例子:

http://localhost:9000/abc -> renders abc.scala.html
http://localhost:9000/def -> renders def.scala.html

最简单的解决方案是在路由文件中定义这些要求:

GET /abc     controllers.Application.abc()
GET /def     controllers.Application.def()
...

然后在应用程序控制器中:

public static Result abc() {
    return ok(abc.render());
}

但我正在寻找一个更“通用”的解决方案。像这样:

GET /:myparameter     controllers.Application.test(myparameter: String)

不幸的是,我不知道如何在我的控制器中“调用”相应的视图。我在考虑某种地图,其中每个参数都映射到一个视图,但没有成功。我试过这样

Map<String, play.api.templates.Html>

当然,这只为我提供了 HTML 内容,而不是我想要呈现的“模板”。

信息:我正在使用带有 Java 的 Play 2

此致

4

3 回答 3

1

实际上,我认为您建议自己维护参数值到Html类型的映射的建议是一个可行的选择:

public class Application extends Controller {

    private static final Map<String, Html> views = new HashMap<>();

    static {
        views.put("abc", abc.render());
        views.put("def", def.render());
        ...
    }

    public static Result test(final String myparameter) {

        final Html view = views.get(myparameter);
        if (view != null) {
            return ok(view);
        } else {
            // Unsupported parameter
            return badRequest();
        }
    }
}

在上面的代码中,所有模板都预渲染在一个静态块中。从您描述问题的方式来看,您的任何模板似乎都没有接受任何参数,因此这种早期渲染模板的方法应该适合您。

但是,您可能会/将拥有接受参数且无法提前呈现的模板。在这种情况下,您可以采取的另一种方法是使用动作组合的解决方案:

/*
 * This action is composed of many different actions that form a 
 * chain of responsibility.
 */
@Abc
@Def
...
public static Result test(final String myparameter) {
    ....
}

这种方法更具前瞻性,但涉及更多代码和类,并且可能不像您目前正在寻找的那样通用。

于 2013-05-28T23:12:37.570 回答
0

If you are using Java 1.7, you can use a simple switch

public static Result test(final String myparameter) {

    switch(myparameter){
        case "abc":
          //Initialize x,y
          abc.render(x,y);
          break;
        case "def":
          //Initialize x,y,z
          defview.render(x,y,z);
          break;
    }
}
于 2013-05-29T15:07:43.120 回答
0

下面是一个如何通过反射做到这一点的示例。如果您有未知数量的模板和/或不想在每次添加模板时更新代码,则上述方法不实用。

className 是您要渲染的模板的绝对路径

Class<?> clazz = Class.forName(className);
Method renderMethod = clazz.getMethod("render");
Object result = renderMethod.invoke(null);

return ok((Html) result);
于 2013-08-31T11:00:27.387 回答