Поддерживает ли Фреймворк Play «фрагменты»?

#html #layout #view #tags #playframework

#java #playframework

Вопрос:

Если я хочу иметь общую часть пользовательского интерфейса на нескольких страницах, например меню, каков рекомендуемый способ сделать это?

Он будет содержать как код шаблона, так и внутренний контроллер (аналогичный «фрагментам» в LiftWeb framework).

Я знаю, что для воспроизведения существует модуль меню, но меня больше интересует, как это будет достигнуто в целом.

Ответ №1:

Есть два способа включить общий код представления в фреймворк Play.

Вы можете использовать #{include} тег или #{extends} тег.

Тег extends, как следует из названия, расширяется из родительского представления. Тег extends используется по умолчанию в коде скелета, настраиваемом Play при создании нового приложения. Это расширяет main.html . Вы добавляете сюда свой код.

Тег includes позволяет вам вводить общий фрагмент кода представления в ваши шаблоны в указанной точке. Это работает во многом так же, как если бы php включал / требовал, или jsp включал работу.

Проблема возникнет, когда код вашего шаблона также потребует данных или логики из модели (через контроллер). Если это так, то вам нужно будет использовать обозначения @Before или @With в вашем контроллере, чтобы гарантировать, что каждый раз выполняется общая часть кода контроллера. Вы можете добавить любые данные в список renderArgs, чтобы они были доступны для использования в представлении.

Простым примером использования renderArgs было бы.

 @Before
private static void commonData() {
    // do your logic here
    renderArgs.put("menu", menu);
    renderArgs.put("selected", selectedMenuItem);
}
  

значения, которые вы ввели в renderArgs (меню и выбранные в примере), будут доступны точно так же, как если бы вы передали их в метод render .

Комментарии:

1. Спасибо — можете ли вы указать мне какой-либо пример кода, который использует renderArgs?

2. @Codemwnci Я получаю пустые / нулевые значения в моих renderArgs{} . При успешном входе в систему я сохранил карту в renderArgs, и она была напечатана со всеми значениями в консоли с помощью renderArgs.get(login_det’). toString() . Когда я использую то же самое в другом контроллере, я получаю renderArgs как {} . В чем может быть проблема здесь.

3. является ли это частью того же действия? Сохраняете ли вы данные в renderArgs с помощью @Before? Помните, что renderArgs существует только в течение срока действия запроса, поэтому он будет потерян при следующем запросе. Также помните, что если вы вызываете другое действие из действия, это приведет к перенаправлению HTTP, которое является другим запросом, поэтому renderArgs сбрасывается.

4. @Codemwnci Я устанавливаю значения в a во время входа в систему и в отдельной функции, которая является <pre>@</pre>Перед private static void commonData() { Map cacheMap = Cache.get(«login_det»,Map.class ); if(cacheMap!=null) { renderArgs.put(«login_det», cacheMap); System.out.println(«commonData» renderArgs.toString()); } }

5. @Codemwnci в моей функции контроллера customersList я напечатал cache и renderArgs.toString() . У Cahce все еще есть значения, но renderArgs равен {}