Play框架2.1.3函数将使用给定参数呈现scala模板
我需要一个方法在我的控制器中以这种方式从它收到的参数调用适当的模板:
public static Result renderTemplate(String folder, String template) { return ok( views.html.<>.<>.render(Users.createForm) ); }
如果可能的话? 我会用reflection完成它,但由于某种原因我无法列出视图和view.html的字段。
有人可以告诉我为什么,并解释我应该怎么做才能实现这一目标?
谢谢
如果你这样做,你可能会失去类型安全性和在编译时而不是运行时捕获一些错误的可能性。
但仍有可能:
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);
另一种不包括reflection开销的方法是在构建时使用SBT和源生成器创建模板的索引。 您可以浏览views文件夹,然后从文件夹/模板名称和invokations创建一个映射。
地图位于生成的类中,如下所示:
map.put("folderx.templatey", views.html.folderx.templatey);//no reflection!
因此,如果模板不存在,至少SBT会在构建时警告您。