Рубрики
Без рубрики

Введение в Raptor на Java

Краткое и практическое руководство по фреймворку Raptor MVC для Java.

Автор оригинала: baeldung.

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 .