Play framework 2.1.3函数将使用给定参数呈现scala模板

时间:2013-10-24 02:48:48

标签: java reflection playframework playframework-2.0

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

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

如果可能的话?我会用反射完成它,但由于某种原因,我无法列出视图和view.html的字段。

有人可以告诉我为什么并解释我该怎么做才能实现这个目标?

谢谢

1 个答案:

答案 0 :(得分: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 and source generators生成模板的索引。您可以浏览views文件夹,然后从文件夹/模板名称和调用创建一个映射。

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

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

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