Введение в VRaptor в Java

Введение в 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.