【问题标题】:Play framework 2.1.3 function that will render scala template with given parameters播放框架 2.1.3 函数,该函数将使用给定参数呈现 scala 模板
【发布时间】:2013-10-24 02:48:48
【问题描述】:

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

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 的字段。

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

谢谢

【问题讨论】:

    标签: java reflection playframework playframework-2.0


    【解决方案1】:

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

    但还是有可能的:

    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 对模板进行索引。您可以浏览视图文件夹,然后根据文件夹/模板名称和调用创建地图。

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

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

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

    【讨论】:

    • 原理明白了,但是报错:在这一行:`html = (play.api.templates.Html) render.invoke(null, form);`[NullPointerException: null]@ 987654322@ 模板有一个参数,形式为@(createForm: Form[models.User])
    • 抱歉耽搁了,这周很忙
    • 为简单起见,我使用 String 参数创建了一个表单,您需要 Form.class 而不是 String.class。
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2014-05-11
    • 2013-05-10
    • 2014-10-06
    相关资源
    最近更新 更多