4

我需要一个方法在我的控制器中调用适当的模板,从它接收的参数中,以这种方式:

public static Result renderTemplate(String folder, String template) {
    return ok(
        views.html.<<FOLDER_GOES_HERE>>.<<TEMPLATE_NAME_GOES_HERE>>.render(Users.createForm)
    );
}

如果这可能?我会通过反射来完成,但由于某种原因,我无法列出 view 和 view.html 的字段。

有人能告诉我为什么并解释我应该怎么做才能做到这一点吗?

谢谢

4

1 回答 1

9

如果你这样做,你可能会失去类型安全性和在编译时而不是运行时捕获一些错误的可能性。

但是还是可以的:

final Class<?> clazz = Class.forName("views.html." + folder + "." + template);
//assumed you have a String parameter for your template
java.lang.reflect.Method render = clazz.getDeclaredMethod("render", String.class);
play.api.templates.Html html = (play.api.templates.Html) render.invoke(null, "hi");
return ok(html);

另一种不包括反射开销的方法是在构建时使用SBT 和源生成器对模板进行索引。您可以浏览视图文件夹,然后从文件夹/模板名称和调用创建地图。

该地图位于生成的类中,如下所示:

map.put("folderx.templatey", views.html.folderx.templatey);//no reflection!

因此,如果模板不存在,至少 SBT 会在构建时向您发出警告。

于 2013-10-24T06:03:49.753 回答