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

Краткое руководство по контроллерам пружин

Краткое и практическое руководство по контроллерам Spring – как для типичных приложений MVC, так и для API REST.

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

1. введение

В этой статье мы сосредоточимся на основной концепции весенних MVC – контроллеров.

2. Обзор

Давайте начнем с того, что сделаем шаг назад и рассмотрим концепцию Фронтального контроллера в типичной пружинной модели контроллера вида архитектуры .

На очень высоком уровне, вот основные обязанности, которые мы рассматриваем:

  • Перехватывает входящие запросы
  • Преобразует полезную нагрузку запроса во внутреннюю структуру данных
  • Отправляет данные в Модель для дальнейшей обработки
  • Получает обработанные данные из Модели и передает эти данные в Представление для визуализации

Вот краткая схема потока высокого уровня в Spring MVC :

Весенний MVC

Как вы можете видеть, DispatcherServlet играет роль Переднего контроллера в архитектуре.

Схема применима как к типичным контроллерам MVC, так и к контроллерам RESTful – с некоторыми небольшими отличиями (описанными ниже).

В традиционном подходе MVC приложения не ориентированы на обслуживание, поэтому существует распознаватель V iew , который отображает окончательные представления на основе данных, полученных от Контроллера .

Приложения RESTful предназначены для работы с сервисами и возвращают необработанные данные (обычно JSON/XML). Поскольку эти приложения не выполняют рендеринга представлений, не существует Распознавателей представлений – обычно ожидается, что Контроллер будет отправлять данные напрямую через HTTP-ответ.

Давайте начнем с контроллеров в стиле MVC0.

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

Чтобы иметь возможность работать с Spring MVC , давайте сначала разберемся с зависимостями Maven:


    org.springframework
    spring-webmvc
    5.0.6.RELEASE

Чтобы получить последнюю версию библиотеки, загляните в spring-webmvc на Maven Central .

4. Веб-конфигурация Проекта

Теперь, прежде чем рассматривать сами контроллеры, нам сначала нужно настроить простой веб-проект и выполнить быструю настройку Сервлета .

Давайте сначала посмотрим, как DispatcherServlet можно настроить без использования web.xml – но вместо этого используется инициализатор:

public class StudentControllerConfig implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        AnnotationConfigWebApplicationContext root = 
          new AnnotationConfigWebApplicationContext();
        root.register(WebConfig.class);

        root.refresh();
        root.setServletContext(sc);

        sc.addListener(new ContextLoaderListener(root));

        DispatcherServlet dv = 
          new DispatcherServlet(new GenericWebApplicationContext());

        ServletRegistration.Dynamic appServlet = sc.addServlet("test-mvc", dv);
        appServlet.setLoadOnStartup(1);
        appServlet.addMapping("/test/*");
    }
}

Чтобы настроить работу без XML, убедитесь, что в вашем пути к классу есть servlet-api 3.1.0.

Вот как web.xml будет выглядеть так:


    test-mvc
    
      org.springframework.web.servlet.DispatcherServlet
    
    1
    
        contextConfigLocation
        /WEB-INF/test-mvc.xml
    

Мы устанавливаем здесь свойство contextConfigLocation , указывающее на файл XML , используемый для загрузки контекста Spring. Если свойство отсутствует, Spring выполнит поиск файла с именем {имя_сервета}-servlet.xml .

В нашем случае servlet_name является test-mvc и поэтому в этом примере DispatcherServlet будет искать файл с именем test-mvc-servlet.xml .

Наконец, давайте настроим DispatcherServlet и сопоставим его с определенным URL – чтобы завершить нашу Систему на основе фронтального контроллера здесь:


    test-mvc
    /test/*

Таким образом, в этом случае DispatcherServlet перехватывал бы все запросы в шаблоне /тест/* .

5. Веб-конфигурация Spring MVC

Давайте теперь посмотрим, как DispatcherServlet можно настроить с помощью Spring Config :

@Configuration
@EnableWebMvc
@ComponentScan(basePackages= {
  "com.baeldung.controller.controller",
  "com.baeldung.controller.config" }) 
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void configureDefaultServletHandling(
      DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
 
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver bean = 
          new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

Давайте теперь рассмотрим настройку сервлета Диспетчера с использованием XML . Снимок XML – файла DispatcherServlet – файла XML , который DispatcherServlet использует для загрузки пользовательских контроллеров и других Spring | сущностей показан ниже:




    
        /WEB-INF/
    
    
        .jsp
    

Основываясь на этой простой конфигурации, платформа, конечно, инициализирует любой компонент контроллера, который она найдет в пути к классам.

Обратите внимание, что мы также определяем распознаватель представлений, отвечающий за визуализацию представлений – мы будем использовать Spring InternalResourceViewResolver здесь. При этом ожидается, что имя представления будет разрешено, что означает поиск соответствующей страницы с использованием префикса и суффикса (оба определены в конфигурации XML ).

Так, например, если Контроллер возвращает представление с именем ” добро пожаловать” , просмотр распознаватель попытается разрешить страницу с именем “добро пожаловать.jsp” в папке WEB-INF .

6. Контроллер MVC

Давайте теперь, наконец, реализуем контроллер стиля MVC.

Обратите внимание, как мы возвращаем объект ModelAndView , который содержит карту модели и объект представления ; оба будут использоваться распознавателем V iew для визуализации данных:

@Controller
@RequestMapping(value = "/test")
public class TestController {

    @GetMapping
    public ModelAndView getTestData() {
        ModelAndView mv = new ModelAndView();
        mv.setViewName("welcome");
        mv.getModel().put("data", "Welcome home man");

        return mv;
    }
}

Итак, что именно мы здесь устроили.

Сначала мы создали контроллер под названием TestController и сопоставили его с “/тест” путем. В классе мы создали метод, который возвращает объект ModelAndView и сопоставляется с запросом GET , поэтому любой вызов URL, заканчивающийся на ” test “, будет перенаправляться DispatcherServlet в метод getTestData в TestController .

И, конечно же, мы возвращаем объект ModelAndView с некоторыми данными модели для хорошей оценки.

Объекту представления присвоено имя ” добро пожаловать “. Как обсуждалось выше, Распознаватель представлений будет искать страницу в папке WEB-INF с именем ” welcome.jsp “.

Ниже вы можете увидеть результат примера GET операции:

результат_финал

Обратите внимание, что URL заканчивается на “тест” . Шаблон URL является “/тест/тест “.

Первый “/тест” поступает из сервлета, а второй – из сопоставления контроллера.

7. Больше весенних зависимостей для ОТДЫХА

Давайте теперь начнем смотреть на спокойный контроллер. Конечно, хорошее место для начала-это дополнительные зависимости Maven, которые нам нужны для этого:


    
        org.springframework
        spring-webmvc
        5.0.6.RELEASE
    
    
        org.springframework
        spring-web
        5.0.6.RELEASE
    
    
        com.fasterxml.jackson.core
        jackson-databind
        2.9.5
    

Пожалуйста, обратитесь к ссылкам jackson-core , spring-webmvc и spring-web для получения последних версий этих зависимостей.

Джексон , конечно, не является обязательным здесь, но это, безусловно, хороший способ включить поддержку JSON. Если вам интересно глубже погрузиться в эту поддержку, ознакомьтесь со статьей конвертеры сообщений здесь .

8. Контроллер REST

Настройка для приложения Spring RESTful такая же, как и для приложения MVC , с той лишь разницей, что в нем нет распознавателей V iew и нет карты модели.

API, как правило, просто возвращает необработанные данные обратно клиенту – обычно представления XML и JSON – и поэтому DispatcherServlet обходит распознаватели представлений и возвращает данные прямо в теле ответа HTTP .

Давайте взглянем на простую реализацию контроллера RESTful:

@Controller
public class RestController {

    @GetMapping(value = "/student/{studentId}")
    public @ResponseBody Student getTestData(@PathVariable Integer studentId) {
        Student student = new Student();
        student.setName("Peter");
        student.setId(studentId);

        return student;
    }
}

Обратите внимание на аннотацию @ResponseBody к методу, которая предписывает Spring обходить распознаватель представлений и по существу выводить выходные данные непосредственно в тело HTTP – ответа .

Краткий снимок выходных данных отображается ниже:

16-го июля

Вышеуказанный вывод является результатом отправки запроса GET в API с идентификатором студента / 1 .

Одно краткое замечание здесь: аннотация @RequestMapping – это одна из тех центральных аннотаций, которые вам действительно нужно изучить, чтобы использовать ее в полной мере.

9. Пружинная загрузка и аннотация @RestController

Аннотация @RestController из Spring Boot-это в основном быстрый ярлык, который избавляет нас от необходимости всегда определять @ResponseBody .

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

@RestController
public class RestAnnotatedController {
    @GetMapping(value = "/annotated/student/{studentId}")
    public Student getData(@PathVariable Integer studentId) {
        Student student = new Student();
        student.setName("Peter");
        student.setId(studentId);

        return student;
    }
}

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

В этом руководстве мы рассмотрим основы использования контроллеров весной, как с точки зрения типичного приложения MVC, так и с точки зрения API RESTful.

Конечно, весь код в статье доступен на GitHub .