0

用例:我有一个路由处理主机上的所有请求:端口/p 路由如下所示:

GET     /p/*path    controllers.Application.p(path: String)

p方法获取一些数据并将其直接传递给视图p

return ok(p.render(currentSession));

在视图中,如果存在与我传递的数据中的字符串匹配的模板,我想导入一个模板。在这种情况下,字符串表示模型对象名称,例如“用户”,如果有匹配的模板,它将是views/custompages/User.scala.html. 如果没有匹配的模板,我想使用一个通用的模板,例如views/generic.scala.html.

我对这个问题有两个部分:

第 1 部分:我看到我可以通过执行以下操作来检查模板是否存在:

@if(custompages.User != null) {
    <p>it exists!</p>
}

但如果我将其更改为custompages.Usera(不存在的模板),我会收到编译错误(object Usera is not a member of package)。怎么做这个检查?

第 2 部分:如何使用代表模型类的字符串进行检查?在第 1 部分的答案中将它连接到硬编码的“用户”的位置?

我会以错误的方式解决这个问题吗?我正在做的事情是否应该在控制器中使用反射来查找匹配的模板,然后呈现适当的模板?

4

1 回答 1

1

我决定从控制器而不是视图来解决问题。这是我用来做的代码,以防其他人最终在这里寻找类似的答案。

注释: associatedEntity 是我如何确定要渲染的模板我正在调用类渲染并将我自己的会话对象作为参数传递我使用以下内容来帮助创建答案:Play framework 2.1.3 function that will render scala template with given参数

谢谢@biesior 的建议!

public Result p(String uri) {

    Session currentSession = getSession();

    final Class<?> clazz;
    try {
        clazz = Class.forName("com.domain.views.html." + currentSession.currentPage.associatedEntity.getSimpleName());

        //assumed you have a String parameter for your template
        java.lang.reflect.Method render = null;
        try {
            render = clazz.getDeclaredMethod("render", Session.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        play.twirl.api.Html html = null;
        try {
            html = (play.twirl.api.Html) render.invoke(null, currentSession);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return ok(html);
    } catch (ClassNotFoundException e) {
        return ok(p.render(currentSession));
    }

}
于 2016-02-29T20:20:26.513 回答