1. Обзор
В этой статье мы рассмотрим VRaptor , простой и понятный веб-фреймворк Java MVC , который использует контексты Java и технологию внедрения зависимостей и прост в понимании.
Точно так же, как Spring – он сильно зависит от аннотаций и отлично работает с Hibernate .
Он также поставляется с некоторыми полезными плагинами – например, для интернализации и модульного тестирования.
Итак, давайте рассмотрим различные компоненты Raptor и создадим примерный проект.
2. Зависимости и настройка Maven
Один из быстрых способов начать работу-это загрузить vraptor-blank-project-distribution из официального репозитория .
Пустой проект-это просто скелет, который можно конкретизировать, чтобы стать полноценным веб-приложением по выбору.
После загрузки и распаковки проекта давайте переименуем каталог в raptor (или любое другое имя).
Каталог должен содержать:
- src/
- src/
- и README.md
Проект основан на Maven и поставляется с плагином tomcat7 Maven, который предоставляет контейнер сервлета для запуска приложения.
Он также поставляется с стандартным IndexController , который имеет только один метод – index() .
По умолчанию представление, отображаемое этим методом, находится в webapp/WEB-INF/jsp/index/index.jsp – это следует соглашению WEB-INF/jsp/ controller_name/method_name.
Чтобы запустить сервер, мы выполним команду mvn tomcat7 : run из корня проекта.
В случае успеха, если мы посетим http://localhost:8080, браузер отобразит ” Это работает!! ВРаптор! “.
Если мы столкнемся с “ java.lang.LinkageError: loader constraint violation”, затем мы должны изменить следующие зависимости в pom.xml :
org.jboss.weld.servlet weld-servlet-core 2.1.2.Final org.jboss.spec.javax.el jboss-el-api_3.0_spec org.jboss.weld weld-core-impl 2.1.2.Final org.jboss.spec.javax.el jboss-el-api_3.0_spec
Виновником является el-api , который включен в weld-servlet-core и weld-core-impl с compile scope; это приводит к конфликту зависимостей.
По ходу дела понадобятся следующие зависимости, поэтому давайте включим их в pom.xml :
br.com.caelum.vraptor vraptor-freemarker 4.1.0-RC3
mysql mysql-connector-java 8.0.8-dmr org.freemarker freemarker 2.3.27-incubating
Последнюю версию артефактов raptor-freemarker , /mysql-connector-java и freemarker можно найти в Maven Central.
Теперь, когда мы готовы к работе, давайте создадим простой блог-сайт.
3. Поддержка гибернации
VRaptor предоставляет различные плагины для взаимодействия с базами данных, одним из них является vraptor-hibernate который работает с Hibernate 4.
Плагин делает спящий режим SessionFactory bean доступен во время выполнения через CDI.
С плагином на месте нам нужен стандартный конфигурационный файл Hibernate – пример можно найти в репозитории.
VRaptor использует метод, называемый Producers, чтобы сделать объекты доступными для управления DI. Подробнее об этом здесь .
4. Определение веб-маршрутов в VRaptor
В VRaptor определения маршрутов находятся в контроллерах, которые являются просто @Controller -аннотированными объектами Java – точно так же, как и в Spring.
@Path аннотации используются для сопоставления пути запроса к определенному контроллеру, а @Get, @Post, @Put, @Delete и @Patch аннотации используются для указания типов HTTP-запросов.
Конфигурация отображения маршрутов выглядит аналогично пути JAX-RS, но официально не реализует стандарт.
Кроме того, при определении пути можно указать переменную пути в фигурных скобках:
@Get("/posts/{id}")
Значение id затем может быть доступно внутри метода контроллера:
@Get("/posts/{id}") public void view(int id) { // ... }
Когда форма отправляется на определенный маршрут, VRaptor может автоматически заполнить объект представленными данными формы.
Давайте посмотрим на это в действии в следующем разделе статьи.
5. Представления и механизм шаблонов
По умолчанию представления могут быть реализованы с помощью JSP. Однако можно использовать и другие шаблонные движки – в этой статье мы будем работать с Freemarker.
Давайте начнем с создания index.ftl и сохранения it в каталоге представления по умолчанию (src/main/resources/templates):
VRaptor Blank Project It works!! ${variable}
Теперь мы можем использовать определенный вид с классом FreemarkerView для рендеринга вида:
@Path("/") public void index() { result.include("variable", "VRaptor!"); result.use(FreemarkerView.class).withTemplate("index"); }
Объект Result содержит состояние модели – у него есть методы для перенаправления на другую страницу, URL-адрес или метод контроллера; он может быть введен в контроллер с помощью CDI.
В нашем примере переменная | разрешается Freemarker. Таким образом, ${variable} placeholder в index.ftl заменяется на “Raptor!”.
Более продвинутые способы использования задокументированы здесь .
6. Пример Обработки Отправки Формы
Давайте посмотрим, как мы можем обрабатывать отправку форм с помощью проверки:
@Post("/post/add") public void add(Post post) { post.setAuthor(userInfo.getUser()); validator.validate(post); if(validator.hasErrors()) { result.include("errors", validator.getErrors()); } validator.onErrorRedirectTo(this).addForm(); Object id = postDao.add(post); if(Objects.nonNull(id)) { result.include("status", "Post Added Successfully"); result.redirectTo(IndexController.class).index(); } else { result.include( "error", "There was an error creating the post. Try Again"); result.redirectTo(this).addForm(); } }
Объект Post сначала проверяется с помощью Java bean validation , а затем сохраняется в базе данных с помощью postDao.add() .
Поля объекта Post заполняются автоматически из значений представленной формы-данных, соответствующих полям ввода формы в файле представления.
Обратите внимание, что имя поля ввода должно иметь префикс с именем объекта в нижнем регистре.
Например, представление, ответственное за добавление новой записи, имеет поля ввода: post.title и post.post , которые соответствуют полям title и post in Post . |/java соответственно:
Полный файл add.ftl можно найти в исходном коде.
Если в отправке формы есть ошибка, то сообщение об ошибке включается и пользователь перенаправляется на тот же метод add() :
if(validator.hasErrors()) { result.include("errors", validator.getErrors()); } validator.onErrorRedirectTo(this).addForm();
7. Заключение
В заключение мы взглянули на Raptor с первого взгляда и увидели, как можно достичь базовой функциональности MVC.
В documentation содержится более подробная информация о фреймворке, а также о доступных плагинах.
Полный исходный код, включая образец database.sql , доступен на Github .