Перейти к основному содержанию

Интеграция шаблонизаторов

В этом примере мы реализуем шаблонизаторы в приложениях ActiveJ. В примере показано, как создать простое приложение Poll, которое создает новые опросы с пользовательским заголовком, описанием и параметрами. Каждый новый опрос получает уникальную сгенерированную ссылку, которая ведет на страницу, где можно проголосовать.

Посмотрите, как просто реализовать такие возможности с помощью ActiveJ: встроенный сервер приложений имеет всего около 100 строк кода с без дополнительных xml-конфигураций. В этом примере мы использовали Mustache в качестве шаблонизатора.

Здесь мы рассмотрим только класс ApplicationLauncher, который является основным классом приложения. Полные исходные тексты примеров вы можете найти на GitHub

Создание пусковой установки

ApplicationLauncher запускает наше приложение, заботится о маршрутизации и правильной генерации контента на HTML-страницах. Мы расширим ActiveJ HttpServerLauncher для управления жизненным циклом приложения:

note

В этом примере мы опустим обработку ошибок, чтобы все было кратко и просто.

public final class ApplicationLauncher extends HttpServerLauncher {
  private static ByteBuf applyTemplate(Mustache mustache, Map<String, Object> scopes) {    ByteBufWriter writer = new ByteBufWriter();    mustache.execute(writer, scopes);    return writer.getBuf();  }
  @Provides  PollDao pollRepo() {    return new PollDaoImpl();  }

Давайте посмотрим на пусковую установку поближе. Он содержит два метода:

  • applyTemplate(Mustache mustache, Map<String, Object> scopes) заполняет предоставленный шаблон Mustache заданными данными через ByteBuf - более эффективная реализация ByteBuffer;
  • pollRepo() обеспечивает бизнес-логику нашего приложения. Аннотация @Provides означает, что это делается через ActiveJ Inject DI. Далее мы предоставляем AsyncServlet:
public final class ApplicationLauncher extends HttpServerLauncher {
  private static ByteBuf applyTemplate(Mustache mustache, Map<String, Object> scopes) {    ByteBufWriter writer = new ByteBufWriter();    mustache.execute(writer, scopes);    return writer.getBuf();  }
  @Provides  PollDao pollRepo() {    return new PollDaoImpl();  }

В AsyncServlet мы создаем три объекта Mustache, по одному для каждой HTML-страницы. Чтобы определить маршрутизацию, мы создаем RoutingServlet. Вы можете заметить, что подход к маршрутизации напоминает Express.js. В приведенном выше примере мы добавили отображение на главную страницу с помощью метода map . Методmap(@Nullable HttpMethod method, String path, AsyncServlet servlet) добавляет маршрут к RoutingServlet: method является одним из HTTP методов (GET, POST и так далее) path является путем на сервере servlet определяет логику обработки запроса. Если вам необходимо получить некоторые данные из запроса в процессе обработки, вы можете использовать: request.getPathParameter(String key)/request.getQueryParameter(String key) (см. пример использования параметров запроса') для указания ключа нужного параметра и получения обратно соответствующей строки request.getPostParameters() для получения карты всех параметров запроса. В этом запросе мы получаем все текущие опросы и информацию о них, чтобы сформировать страницу listPolls* . Давайте добавим еще один запрос:

.map(GET, "/poll/:id", request -> {  int id = Integer.parseInt(request.getPathParameter("id"));  return HttpResponse.ok200()      .withBody(applyTemplate(singlePollView, mapOf("id", id, "poll", pollDao.find(id))));})

Этот запрос возвращает страницу с опросом, id которого был указан в пути. Обратите внимание на синтаксис предоставленного пути /poll/:id . : утверждает, что следующие символы до следующего / являются переменной ; в данном случае ее ключевым словом является id. Таким образом, вам не придется привязывать идентификатор каждого опроса к отдельному запросу. Следующие запросы с путями /create, /vote, /add и /delete заботятся о предоставлении страницы для создания новых опросов, голосования, добавления созданных опросов в pollDao и удаления их из него соответственно:

.map(GET, "/poll/:id", request -> {  int id = Integer.parseInt(request.getPathParameter("id"));  return HttpResponse.ok200()      .withBody(applyTemplate(singlePollView, mapOf("id", id, "poll", pollDao.find(id))));})

Также мы определили метод main() , который запустит нашу программу запуска:

public static void main(String[] args) throws Exception {  Launcher launcher = new ApplicationLauncher();  launcher.launch(args);}

Вот и все, у нас есть полнофункциональное приложение для опросов!

Запуск приложения

Если вы хотите запустить пример, вам нужно с GitHub и импортировать его как проект Maven. Посмотрите ветку v5.0. Перед запуском примера выполните сборку проекта (Ctrl F9 для IntelliJ IDEA). Откройте класс ApplicationLauncher и запустите его метод main() . Затем откройте ваш любимый браузер и перейдите по адресу localhost:8080.