Интеграция шаблонизаторов
В этом примере мы реализуем шаблонизаторы в приложениях 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.5. Перед запуском примера выполните сборку проекта (Ctrl F9 для IntelliJ IDEA). Откройте класс ApplicationLauncher
и запустите его метод main()
. Затем откройте ваш любимый браузер и перейдите по адресу localhost:8080.