Введение в VRaptor в Java
1. Overviewс
В этой статье мы рассмотримVRaptor, простой и понятный веб-фреймворк Java MVC, который использует Java Contexts and Dependency Injection, и его легко понять.
Прямо как Spring -it relies heavily on annotations and works great with Hibernate.
Это также идет с некоторыми полезными плагинами - такими как для интернализации и модульного тестирования.
Итак, давайте исследуем различные компоненты VRaptor и создадим образец проекта.
2. Зависимости и настройка Maven
Один из быстрых способов начать работу - загрузитьvraptor-blank-project-distribution изofficial repository.
Пустой проект - это просто скелет, который можно превратить в полноценное веб-приложение по выбору.
После загрузки и распаковки проекта давайте переименуем каталог вvraptor (или любое другое имя).
Каталог должен содержать:
-
src/
-
pom.xml
-
и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,, браузер отобразит «It works!! VRaptor!».
If we face the “java.lang.LinkageError: loader constraint violation”, then, we have to modify the following dependencies in 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; это приводит к конфликту зависимостей.
Следующие зависимости потребуются в строке, поэтому давайте включим их в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
Последнюю версию артефактовvraptor-freemarker,mysql-connector-java иfreemarker можно найти в Maven Central.
Теперь, когда все готово, давайте создадим простой блог-сайт.
3. Поддержка гибернации
VRaptor предоставляет различные плагины для взаимодействия с базами данных, один из нихvraptor-hibernate, который __ работает с Hibernate 4.
Плагин делает bean-компонентSessionFactory Hibernate доступным во время выполнения через CDI.
После установки плагина нам нужен стандартный файл конфигурации Hibernate - пример можно найти в репозитории.
VRaptor использует технику под названием Producers, чтобы сделать объекты доступными для управления DI. Подробнее об этомhere.
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 and saving в каталоге представления по умолчанию (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. Таким образом, заполнитель${variable} вindex.ftl заменяется на «VRaptor!».
Более сложные способы использования задокументированыhere.
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 вPost.java соответственно:
Полный файлadd.ftl можно найти в исходном коде.
Если при отправке формы возникает ошибка, сообщение об ошибке включается, и пользователь перенаправляется к тому же методуadd():
if(validator.hasErrors()) {
result.include("errors", validator.getErrors());
}
validator.onErrorRedirectTo(this).addForm();
7. Заключение
В заключение мы кратко рассмотрели VRaptor и увидели, как можно реализовать базовую функциональность MVC.
documentation содержит более подробную информацию о структуре, а также о доступных плагинах.
Полный исходный код, включая образецdatabase.sql, доступенover on Github.