2013-05-28 4 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, а не «Шаблон», который я хочу отобразить.

Информация: Я использую Play 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 = 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); 
Смежные вопросы