#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 равен {}