2013-05-28 100 views
0

我有以下情況:我需要根據提供的URL參數呈現模板。例如:根據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> 

當然,這隻提供給我HTML內容,而不是我想呈現的「模板」。

信息:我使用播放2與Java

問候

回答

1

其實我覺得你自己建議保持地圖的參數值來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(); 
     } 
    } 
} 

在上述所有模板的代碼預渲染在靜態塊。通過您描述問題的方式來判斷,似乎您的任何模板都沒有采用任何參數,因此這種儘早呈現模板的方法應該適合您。

但是,可能會出現這樣的情況,您將/將擁有采用參數且無法提前呈現的模板。在這種情況下,你可以採取另一種方法是使用動作組成的溶液:

/* 
* This action is composed of many different actions that form a 
* chain of responsibility. 
*/ 
@Abc 
@Def 
... 
public static Result test(final String myparameter) { 
    .... 
} 

這種做法是有點更面向未來的,但涉及更多的代碼和類也許並不像一般的你在做什麼目前正在尋找。

+0

謝謝,我可能會使用這個選項。但是,有沒有什麼辦法只在模板中存儲「引用」而不是「編譯後的html」?例如: 'Map map = new HashMap <>()' 'map.put(「abc」,abc)' – user2229298

0

如果您使用的是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; 
    } 
} 
0

繼承人如何與反思做到這一點的例子。由於上述方法如果您有未知數量的模板和/或不想每次添加模板時都不想更新代碼,則上述方法不切實際。

className是要呈現的模板的絕對路徑

Class<?> clazz = Class.forName(className); 
Method renderMethod = clazz.getMethod("render"); 
Object result = renderMethod.invoke(null); 

return ok((Html) result);