Поддержка Джерси MVC

Джерси MVC Поддержка

1. обзор

Jersey is an open-source framework for developing RESTFul Web Services.

Помимо того, что он служит эталонной реализацией JAX-RS, он также включает ряд расширений для дальнейшего упрощения разработки веб-приложений.

В этом руководствеwe’ll create a small example application that uses the Model-View-Controller (MVC) extension offered by Jersey.

Чтобы узнать, как создать API с Джерси, ознакомьтесь с этимwrite-up here.

2. MVC в Джерси

Jersey contains an extension to support the Model-View-Controller (MVC) design pattern.

Прежде всего, в контексте компонентов Джерси, контроллер из шаблона MVC соответствует классу или методу ресурса.

Аналогично, представление соответствует шаблону, связанному с классом или методом ресурса. Наконец, модель представляет объект Java, возвращенный из метода ресурса (Controller).

To use the capabilities of Jersey MVC in our application, we first need to register the MVC module extension that we wish to use.

В нашем примере мы собираемся использовать популярный шаблонизатор JavaFreemarker. Это один из механизмов рендеринга, который изначально поддерживается Джерси вместе сMustache и стандартными Java Server Pages (JSP).

Для получения дополнительной информации о том, как работает MVC, обратитесь к этомуtutorial.

3. Настройка приложения

В этом разделе мы начнем с настройки необходимых зависимостей Maven в нашемpom.xml.

Затем мы рассмотрим, как настроить и запустить наш сервер с помощью простого встроенного сервераGrizzly.

3.1. Maven Зависимости

Начнем с добавления расширения Jersey MVC Freemarker.

Мы можем получить последнюю версию изMaven Central:


    org.glassfish.jersey.ext
    jersey-mvc-freemarker
    2.27

Нам также понадобится контейнер сервлетов Grizzly.

Опять же, мы можем найти последнюю версию вMaven Central:


    org.glassfish.jersey.containers
    jersey-container-grizzly2-servlet
    2.27

3.2. Настройка сервера

Чтобы использовать поддержку шаблонов Jersey MVC в нашем приложенииwe need to register the specific JAX-RS features provided by the MVC modules.

Имея это в виду, мы определяем пользовательскую конфигурацию ресурса:

public class ViewApplicationConfig extends ResourceConfig {
    public ViewApplicationConfig() {
        packages("com.example.jersey.server");
        property(FreemarkerMvcFeature.TEMPLATE_BASE_PATH, "templates/freemarker");
        register(FreemarkerMvcFeature.class);;
    }
}

В приведенном выше примере мы настраиваем три элемента:

  • Сначала мы используем методpackages, чтобы указать Джерси просканировать пакетcom.example.jersey.server на предмет классов, аннотированных@Path. . Это зарегистрирует нашFruitResource

  • Далее мы настраиваем базовый путь для разрешения наших шаблонов. Это говорит Джерси искать шаблоны Freemarker/src/main/resources/templates/freemarker 

  • Наконец, мы регистрируем функцию, которая обрабатывает рендеринг Freemarker через классFreemarkerMvcFeature 

3.3. Запуск приложения

Теперь давайте посмотрим, как запустить наше веб-приложение. Мы будем использоватьexec-maven-plugin, чтобы настроить нашpom.xml для выполнения нашего встроенного веб-сервера:


    org.codehaus.mojo
    exec-maven-plugin
    
        com.example.jersey.server.http.EmbeddedHttpServer
    

Теперь скомпилируем и запустим наше приложение с помощью Maven:

mvn clean compile exec:java
...
Jul 28, 2018 6:21:08 PM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
Application started.
Try out http://localhost:8082/fruit
Stop the application using CTRL+C

Перейдите по URL-адресу браузера -http://localhost:8080/fruit. Вуаля, отображается «Страница с приветственными фруктами!».

4. Шаблоны MVC

В Джерси API MVC состоит из двух классов для привязки модели к представлению, а именноViewable и@Template.

В этом разделе мы объясним три различных способа привязки шаблонов к нашему представлению:

  • Использование классаViewable

  • Использование саннотации@Template 

  • Как обрабатывать ошибки с помощью MVC и передавать их в определенный шаблон

4.1. ИспользованиеViewable в классе ресурсов

Начнем сViewable:

@Path("/fruit")
public class FruitResource {
    @GET
    public Viewable get() {
        return new Viewable("/index.ftl", "Fruit Index Page");
    }
}

In this example, the FruitResource JAX-RS resource class is the controller. ЭкземплярViewable инкапсулирует ссылочную модель данных, которая представляет собой простойString.

Кроме того, мы также включаем именованную ссылку на связанный шаблон представления -index.ftl.

4.2. Использование@Template в методе ресурсов

There’s no need to use Viewable every time we want to bind a model to a template.

В следующем примере мы просто аннотируем наш метод ресурса с помощью@Template:

@GET
@Template(name = "/all.ftl")
@Path("/all")
@Produces(MediaType.TEXT_HTML)
public Map getAllFruit() {
    List fruits = new ArrayList<>();
    fruits.add(new Fruit("banana", "yellow"));
    fruits.add(new Fruit("apple", "red"));
    fruits.add(new Fruit("kiwi", "green"));

    Map model = new HashMap<>();
    model.put("items", fruits);
    return model;
}

В этом примере мы использовали аннотацию@Template. Это позволяет избежать обертывания нашей модели непосредственно ссылкой на шаблон черезViewable и делает наш метод ресурсов более читабельным.

Модель теперь представлена ​​возвращаемым значением нашего аннотированного метода ресурса - aMap<String, Object>.. Оно передается непосредственно в шаблонall.ftl, который просто отображает наш список фруктов.

4.3. Обработка ошибок с MVC

Теперь давайте посмотрим, как обрабатывать ошибки с помощью аннотации@ErrorTemplate:

@GET
@ErrorTemplate(name = "/error.ftl")
@Template(name = "/named.ftl")
@Path("{name}")
@Produces(MediaType.TEXT_HTML)
public String getFruitByName(@PathParam("name") String name) {
    if (!"banana".equalsIgnoreCase(name)) {
        throw new IllegalArgumentException("Fruit not found: " + name);
    }
    return name;
}

Generally speaking, the purpose of the @ErrorTemplate annotation is to bind the model to an error view. Этот обработчик ошибок позаботится о рендеринге ответа, когда во время обработки запроса возникает исключение.

В нашем простом примере Fruit API, если во время обработки ошибок не возникает, то для визуализации страницы используется шаблонnamed.ftl. В противном случае, если возникает исключение, пользователю отображается шаблонerror.ftl.

In this case, the model is the thrown exception itself. Это означает, что из нашего шаблона мы можем вызывать методы непосредственно для объекта исключения.

Давайте быстро взглянем на фрагмент из нашего шаблонаerror.ftl, чтобы выделить это:


    

Error - ${model.message}!

В нашем последнем примере мы рассмотрим простой модульный тест:

@Test
public void givenGetFruitByName_whenFruitUnknown_thenErrorTemplateInvoked() {
    String response = target("/fruit/orange").request()
      .get(String.class);
    assertThat(response, containsString("Error -  Fruit not found: orange!"));
}

В приведенном выше примере мы используем ответ от нашего ресурса фруктов. Мы проверяем, что ответ содержит сообщение отIllegalArgumentException, которое было отправлено.

5. Заключение

В этой статье мы рассмотрели расширение MVC для платформы Jersey.

Мы начали с представления того, как MVC работает в Джерси. Далее мы рассмотрели, как настроить, запустить и настроить пример веб-приложения.

Наконец, мы рассмотрели три способа использования шаблонов MVC с Jersey и Freemarker и способы обработки ошибок.

Как всегда, доступен полный исходный код статьиover on GitHub.