Playframework 2.0 根据URL参数呈现模板
我有以下情况:我需要根据提供的URL参数呈现模板。例如:Playframework 2.0 根据URL参数呈现模板,playframework-2.0,playframework-2.1,Playframework 2.0,Playframework 2.1,我有以下情况:我需要根据提供的URL参数呈现模板。例如: http://localhost:9000/abc -> renders abc.scala.html http://localhost:9000/def -> renders def.scala.html 最简单的解决方案是在路由文件中定义这些要求: GET /abc controllers.Application.abc() GET /def controllers.Application.def() .
http://localhost:9000/abc -> renders abc.scala.html
http://localhost:9000/def -> renders def.scala.html
最简单的解决方案是在路由文件中定义这些要求:
GET /abc controllers.Application.abc()
GET /def controllers.Application.def()
...
然后在应用程序控制器中:
public static Result abc() {
return ok(abc.render());
}
但我正在寻找一个更“通用”的解决方案。像这样:
GET /:myparameter controllers.Application.test(myparameter: String)
不幸的是,我不知道如何在控制器中“调用”相应的视图。我在考虑一种映射,其中每个参数映射到一个视图,但没有成功。我是这样试的
Map<String, play.api.templates.Html>
Map
当然,这只为我提供了HTML内容,而不是我想要呈现的“模板”
信息:我正在使用Java的Play2
致以最诚挚的问候事实上,我认为您建议自己维护
Html
类型的参数值映射是一个可行的选择:
public class Application extends Controller {
private static final Map<String, Html> views = new HashMap<>();
static {
views.put("abc", abc.render());
views.put("def", def.render());
...
}
public static Result test(final String myparameter) {
final Html view = views.get(myparameter);
if (view != null) {
return ok(view);
} else {
// Unsupported parameter
return badRequest();
}
}
}
这种方法更适合未来,但涉及更多的代码和类,并且可能不像您目前所寻找的那样通用。如果您使用的是Java 1.7,您可以使用一个简单的开关
public static Result test(final String myparameter) {
switch(myparameter){
case "abc":
//Initialize x,y
abc.render(x,y);
break;
case "def":
//Initialize x,y,z
defview.render(x,y,z);
break;
}
}
下面是一个如何使用反射进行此操作的示例。因为如果模板数量未知和/或不希望每次添加模板时都更新代码,则上述方法不实用 className是要呈现的模板的绝对路径
Class<?> clazz = Class.forName(className);
Method renderMethod = clazz.getMethod("render");
Object result = renderMethod.invoke(null);
return ok((Html) result);
Class clazz=Class.forName(className);
方法renderMethod=clazz.getMethod(“render”);
对象结果=renderMethod.invoke(null);
返回ok((Html)结果);
谢谢,我可能会使用此选项。但是有没有办法在映射中只存储对模板的“引用”而不是“编译的html”?类似于:Map Map=newhashmap()
Map.put(“abc”,abc)
Class<?> clazz = Class.forName(className);
Method renderMethod = clazz.getMethod("render");
Object result = renderMethod.invoke(null);
return ok((Html) result);