Playframework 2.0 根据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() .

我有以下情况:我需要根据提供的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()
...
然后在应用程序控制器中:

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);