用例:我有一个在主机上处理所有请求的路由:端口/p路由如下所示:
GET /p/*path controllers.Application.p(path: String)p方法获取一些数据并将其直接传递到视图p。
return ok(p.render(currentSession));在视图中,如果存在与传递的数据中的字符串匹配的模板,则需要导入模板。在这种情况下,字符串表示模型对象名,如"User“,如果有匹配的模板,则为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部分答案中硬编码的“用户”的位置?
我是不是走错路了?我所做的是应该在控制器中使用反射查找匹配的模板,然后呈现适当的模板吗?
发布于 2016-02-29 20:20:26
我决定从控制器而不是视图来解决这个问题。这是我用来做的代码,以防其他人在这里寻找类似的答案。
注意: associatedEntity是如何确定要呈现哪个模板的,我调用类呈现,并将自己的会话对象作为参数传递,我使用以下方法来帮助创建答案:Play framework 2.1.3 function that will render scala template with given parameters
谢谢你的建议!
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));
}
}https://stackoverflow.com/questions/35705844
复制相似问题