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

Вопросы для интервью Spring MVC

Изучите вопросы интервью Spring MVC.

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

1. введение

Spring MVC-это оригинальный веб-фреймворк от Spring, построенный на API сервлетов. Он обеспечивает архитектуру “Модель-представление-контроллер”, которая может использоваться для разработки гибких веб-приложений.

В этом уроке мы сосредоточимся на вопросах, связанных с этим, так как это часто является темой весеннего собеседования для разработчиков.

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

2. Основные вопросы Spring MVC

Q1. Почему Мы должны Использовать Spring MVC?

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

Такие понятия, как:

  • Сервлет диспетчера
  • Контроллеры
  • Распознаватели видов
  • Виды, Модели
  • ModelAndView
  • Атрибуты модели и сеанса

они полностью независимы друг от друга и отвечают только за одно.

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

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

Кроме того, мы используем Spring MVC не только при разработке веб-приложений, но и при создании веб-сервисов RESTful .

Q2. Какова роль аннотации @Autowired?

Аннотацию @Autowired можно использовать с полями или методами для ввода компонента по типу . Эта аннотация позволяет Spring разрешать и вводить сотрудничающие бобы в ваш боб.

Для получения более подробной информации, пожалуйста, обратитесь к учебнику о @Autowired весной .

Q3. Объясните атрибут модели

Аннотация @ModelAttribute является одной из самых важных аннотаций в Spring MVC. Он связывает параметр метода или возвращаемое значение метода с именованным атрибутом модели, а затем предоставляет его веб-представлению .

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

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

Подробнее об этой аннотации можно прочитать в нашей статье, связанной с аннотацией @ModelAttribute .

Q4. Объясните разницу между @Controller и @RestController?

Основное различие между аннотациями @Controller и @RestController заключается в том, что аннотация @ResponseBody автоматически включается в @RestController . Это означает, что нам не нужно аннотировать наши методы обработчика с помощью @ResponseBody . Нам нужно сделать это в классе @Controller , если мы хотим записать тип ответа непосредственно в тело ответа HTTP.

Q5. Опишите изменяемый путь

Мы можем использовать аннотацию @PathVariable в качестве параметра метода обработчика, чтобы извлечь значение переменной шаблона URI .

Например, если мы хотим получить пользователя по идентификатору из www.mysite.com/user/123 , мы должны отобразить наш метод в контроллере как /user/{id} :

@RequestMapping("/user/{id}")
public String handleRequest(@PathVariable("id") String userId, Model map) {}

@PathVariable имеет только один элемент с именем value . Это необязательно, и мы используем его для определения имени переменной шаблона URI . Если мы опустим элемент value, то имя переменной шаблона URI должно совпадать с именем параметра метода.

Также разрешено иметь несколько аннотаций @PathVariable , либо объявляя их одну за другой:

@RequestMapping("/user/{userId}/name/{userName}")
public String handleRequest(@PathVariable String userId,
  @PathVariable String userName, Model map) {}

или поместить их все в Map String> или MultiValueMap String> : String>

@RequestMapping("/user/{userId}/name/{userName}")
public String handleRequest(@PathVariable Map varsMap, Model map) {}

Q6. Проверка с использованием Spring MVC

Spring MVC по умолчанию поддерживает спецификации JSR-303. Нам нужно добавить JSR-303 и его зависимости от реализации в наше приложение Spring MVC . Например, валидатор Hibernate является одной из реализаций JSR-303, имеющихся в нашем распоряжении.

JSR-303-это спецификация Java API для проверки компонентов, часть Jakarta EE и JavaSE, которая гарантирует, что свойства компонента соответствуют определенным критериям, используя такие аннотации , как @NotNull , @Min и @Max . Дополнительные сведения о проверке доступны в статье Основы проверки компонентов Java .

Spring предлагает @Validator аннотацию и BindingResult класс . Реализация Validator вызовет ошибки в методе обработчика запросов контроллера, если у нас есть недопустимые данные. Затем мы можем использовать класс BindingResult для получения этих ошибок.

Помимо использования существующих реализаций, мы можем сделать ваши собственные. Для этого сначала мы создаем аннотацию, соответствующую спецификациям JSR-303. Затем мы реализуем класс Validator . Другим способом было бы реализовать интерфейс Validator |/Spring и установить его в качестве валидатора через @InitBinder аннотацию в контроллере классе.

Чтобы узнать, как реализовать и использовать собственные проверки, пожалуйста, ознакомьтесь с руководством по пользовательской проверке в Spring MVC .

Q7. Что такое @RequestBody и @ResponseBody?

Аннотация @RequestBody , используемая в качестве параметра метода обработчика, связывает тело HTTP-запроса с передачей или объектом домена . Spring автоматически десериализует входящий HTTP-запрос к объекту Java с помощью преобразователей Http-сообщений.

Когда мы используем аннотацию @ResponseBody для метода обработчика в контроллере Spring MVC, это указывает на то, что мы запишем возвращаемый тип метода непосредственно в тело ответа HTTP . Мы не будем помещать его в Модель , и Spring не будет интерпретироваться как имя представления.

Пожалуйста, ознакомьтесь со статьей на @RequestBody и @ResponseBody, чтобы узнать более подробную информацию об этих аннотациях.

Q8. Объясните модель, карту модели и ModelAndView?

Интерфейс Model определяет держатель атрибутов модели . Карта Модели имеет аналогичную цель, с возможностью передачи набора значений . Затем он обрабатывает эти значения, как если бы они находились в пределах Map . Следует отметить, что в Model ( ModelMap ) мы можем хранить только данные. Мы вводим данные и возвращаем имя представления.

С другой стороны, с помощью ModelAndView мы возвращаем сам объект . Мы задаем всю необходимую информацию, такую как данные и имя представления, в возвращаемом объекте.

Вы можете найти более подробную информацию в статье о модели, ModelMap и ModelView .

Q9. Объясните атрибуты сеанса и Атрибут сеанса

Аннотация @sessionAttributes используется для хранения атрибута модели в сеансе пользователя. Мы используем его на уровне класса контроллера, как показано в нашей статье об атрибутах сеанса в Spring MVC :

@Controller
@RequestMapping("/sessionattributes")
@SessionAttributes("todos")
public class TodoControllerWithSessionAttributes {

    @GetMapping("/form")
    public String showForm(Model model,
      @ModelAttribute("todos") TodoList todos) {
        // method body
        return "sessionattributesform";
    }

    // other methods
}

В предыдущем примере атрибут модели ‘ todos ‘ будет добавлен в сеанс, если атрибут @ModelAttribute и атрибут @sessionAttributes имеют одно и то же имя.

Если мы хотим извлечь существующий атрибут из сеанса, управляемого глобально, мы будем использовать @Sessionattributes аннотацию в качестве параметра метода :

@GetMapping
public String getTodos(@SessionAttribute("todos") TodoList todos) {
    // method body
    return "todoView";
}

Q10. Какова цель @EnableWebMvc?

Цель аннотации @EnableWebMvc состоит в том, чтобы включить Spring MVC через конфигурацию Java . Это эквивалентно управляемый аннотациями> в конфигурации XML. Эта аннотация импортирует конфигурацию Spring MVC из WebMvcConfigurationSupport . Он включает поддержку @Controller -аннотированных классов, которые используют @RequestMapping для сопоставления входящих запросов с методом обработчика. управляемый аннотациями>

Вы можете узнать больше об этом и подобных аннотациях в нашем руководстве по аннотациям Spring @Enable .

Q11. Что такое ViewResolver весной?

ViewResolver позволяет приложению отображать модели в браузере – без привязки реализации к конкретной технологии представления – путем сопоставления имен представлений с фактическими представлениями .

Для получения более подробной информации о ViewResolver ознакомьтесь с нашим Руководством по ViewResolver в Spring MVC .

Q12. Что такое BindingResult?

BindingResult – это интерфейс из пакета org.springframework.validation , который представляет результаты привязки. Мы можем использовать его для обнаружения и сообщения об ошибках в представленной форме . Его легко вызвать — нам просто нужно убедиться, что мы поместили его в качестве параметра сразу после объекта формы, который мы проверяем. Необязательный параметр Model должен следовать за параметром BindingResult , как это можно увидеть в учебнике custom validator :

@PostMapping("/user")
public String submitForm(@Valid NewUserForm newUserForm, 
  BindingResult result, Model model) {
    if (result.hasErrors()) {
        return "userHome";
    }
    model.addAttribute("message", "Valid form");
    return "userHome";
}

Когда Spring увидит аннотацию @Valid , он сначала попытается найти валидатор для проверяемого объекта. Затем он подберет аннотации проверки и вызовет валидатор. Наконец, он поместит найденные ошибки в BindingResult и добавит последний в viewmodel.

Q13. Что такое объект поддержки формы?

Объект поддержки формы или объект команды-это просто POJO, который собирает данные из формы, которую мы отправляем .

Мы должны иметь в виду, что он не содержит никакой логики, только данные.

Чтобы узнать, как использовать объект поддержки форм с формами в Spring MVC, пожалуйста, ознакомьтесь с нашей статьей о формах в Spring MVC .

Q14. Какова роль аннотации @Qualifier?

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

Давайте рассмотрим пример. Мы объявили два похожих компонента в конфигурации XML:


    


    

Когда мы попытаемся подключить боб, мы получим org.springframework.beans.factory.Исключение NoSuchBeanDefinitionException. Чтобы исправить это, нам нужно использовать @Qualifier , чтобы сообщить Spring о том, какой боб должен быть подключен:

@Autowired
@Qualifier("person1")
private Person person;

Q15. Какова роль аннотации @Required?

То @Требуется аннотация используется в методах сеттера, и это указывает на то, что свойство компонента, содержащее эту аннотацию, должно быть заполнено во время настройки. В противном случае пружинный контейнер выбросит BeanInitializationException исключение.

Кроме того, @Required отличается от @Autowired – поскольку он ограничен сеттером, в то время как @Autowired – нет. @Autowired также можно использовать для связи с конструктором и полем, в то время как @Required проверяет только, задано ли свойство.

Давайте рассмотрим пример:

public class Person {
    private String name;
 
    @Required
    public void setName(String name) {
        this.name = name;
    }
}

Теперь имя компонента Person должно быть задано в XML-конфигурации следующим образом:


    

Обратите внимание, что @Required не работает с классами на основе Java @Configuration по умолчанию . Если вам нужно убедиться, что все ваши свойства заданы, вы можете сделать это при создании компонента в аннотированных методах @Bean .

Q16. Опишите шаблон переднего контроллера

В шаблоне переднего контроллера все запросы сначала будут отправляться переднему контроллеру, а не сервлету . Он убедится, что ответы готовы, и отправит их обратно в браузер. Таким образом, у нас есть одно место, где мы контролируем все, что приходит из внешнего мира.

Передний контроллер определит сервлет, который должен сначала обработать запрос. Затем, когда он получит данные обратно из сервлета, он решит, какое представление отрисовывать, и, наконец, отправит отрисованное представление обратно в качестве ответа:

Чтобы ознакомиться с подробностями реализации, пожалуйста, ознакомьтесь с нашим Руководством по шаблону переднего контроллера в Java .

Q17. Что такое архитектура Модели 1 и Модели 2?

Модель 1 и Модель 2 представляют собой две часто используемые модели проектирования, когда речь заходит о разработке веб-приложений Java.

В модели 1 запрос поступает в сервлет или JSP, где он обрабатывается . Сервлет или JSP обрабатывает запрос, обрабатывает бизнес-логику, извлекает и проверяет данные и генерирует ответ:

Поскольку эта архитектура проста в реализации, мы обычно используем ее в небольших и простых приложениях.

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

Модель 2 основана на шаблоне проектирования контроллера представления модели и отделяет представление от логики, которая управляет содержимым.

Кроме того, мы можем выделить три модуля в шаблоне MVC: модель, представление и контроллер . Модель представляет собой динамическую структуру данных приложения. Он отвечает за манипуляции с данными и бизнес-логикой. Представление отвечает за отображение данных, в то время как контроллер служит интерфейсом между двумя предыдущими.

В модели 2 запрос передается контроллеру, который обрабатывает необходимую логику для получения правильного содержимого, которое должно отображаться. Затем контроллер помещает содержимое обратно в запрос, как правило, в виде JavaBean или POJO. Он также решает, какое представление должно отображать содержимое, и, наконец, передает ему запрос. Затем представление отображает данные:

3. Расширенные вопросы Spring MVC

Q18. В чем разница между аннотациями @Controller, @Component, @Repository и @Service весной?

Согласно официальной документации Spring, @Component является общим стереотипом для любого компонента, управляемого Spring. @Repository , @Service и @Controller являются специализациями @Component для более конкретных случаев использования , например, на уровнях сохранения, обслуживания и представления соответственно.

Давайте рассмотрим конкретные примеры использования последних трех:

  • @ Controller – указывает, что класс выполняет роль контроллера, и обнаруживает @RequestMapping аннотации внутри класса
  • @ Service – указывает, что класс содержит бизнес-логику и вызывает методы на уровне репозитория
  • @ Repository – указывает, что класс определяет хранилище данных; его задача состоит в том, чтобы перехватывать исключения, зависящие от платформы, и повторно выбрасывать их как одно из унифицированных непроверенных исключений Spring

Q19. Что такое DispatcherServlet и ContextLoaderListener?

Проще говоря, в шаблоне проектирования переднего контроллера один контроллер отвечает за направление входящих HttpRequests для всех других контроллеров и обработчиков приложения.

Пружины DispatcherServlet реализует этот шаблон и, следовательно, несет ответственность за правильную координацию Http-запросы к правым обработчикам.

С другой стороны, ContextLoaderListener запускает и закрывает корневой каталог Spring WebApplicationContext . Он связывает жизненный цикл ApplicationContext с жизненным циклом ServletContext. Мы можем использовать его для определения общих компонентов, работающих в разных контекстах Spring.

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

Q20. Что такое МногокомпОнентный решатель и Когда Его Следует использовать?

Интерфейс MultipartResolver используется для загрузки файлов . Фреймворк Spring предоставляет одну реализацию MultipartResolver для использования с Commons FileUpload и другую для использования с анализом составных запросов Servlet 3.0.

Используя их, мы можем поддерживать загрузку файлов в наших веб-приложениях.

Q21. Что такое перехватчик Spring MVC и как его использовать?

Перехватчики Spring MVC позволяют нам перехватывать запрос клиента и обрабатывать его в трех местах – до обработки, после обработки или после завершения (когда представление отображается) запроса.

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

Для получения подробной информации и различных реализаций ознакомьтесь со статьей Введение в Spring MVC HandlerInterceptor.

Q22. Что такое InitBinder?

Метод с аннотацией @InitBinder используется для настройки параметра запроса, шаблона URI и резервного копирования объектов/command . Мы определяем его в контроллере, и он помогает контролировать запрос. В этом методе мы регистрируем и настраиваем наш пользовательский Редактор свойств s, форматер и валидатор .

В аннотации есть элемент ‘ value ‘. Если мы не установим его, аннотированные методы @InitBinder будут вызываться при каждом HTTP-запросе. Если мы зададим значение, методы будут применяться только для определенных атрибутов команд/форм и/или параметров запроса, имена которых соответствуют элементу ‘ value ‘.

Важно помнить, что одним из аргументов должен быть WebDataBinder. Другие аргументы могут быть любого типа, поддерживаемого методами обработчика, за исключением объектов команд/форм и соответствующих объектов результатов проверки.

Q23. Объясните совет контроллера

Аннотация @ControllerAdvice позволяет нам писать глобальный код, применимый к широкому спектру контроллеров . Мы можем привязать диапазон контроллеров к выбранному пакету или определенной аннотации.

По умолчанию @ControllerAdvice применяется к классам, аннотированным @Controller (или @RestController ) . У нас также есть несколько свойств, которые мы используем, если хотим быть более конкретными.

Если мы хотим ограничить применимые классы пакетом, мы должны добавить имя пакета в аннотацию :

@ControllerAdvice("my.package")
@ControllerAdvice(value = "my.package")
@ControllerAdvice(basePackages = "my.package")

Также можно использовать несколько пакетов, но на этот раз нам нужно использовать массив вместо строки |.

Помимо ограничения пакета по его имени, мы можем сделать это, используя один из классов или интерфейсов из этого пакета :

@ControllerAdvice(basePackageClasses = MyClass.class)

Элемент ‘ назначаемые типы ‘применяет @ControllerAdvice к конкретным классам, в то время как’ аннотации ‘ делает это для конкретных аннотаций.

Следует помнить, что мы должны использовать его вместе с @ExceptionHandler . Эта комбинация позволит нам настроить глобальный и более конкретный механизм обработки ошибок без необходимости реализовывать его каждый раз для каждого класса контроллера.

Q24. Что делает аннотация @ExceptionHandler?

Аннотация @ExceptionHandler позволяет нам определить метод, который будет обрабатывать исключения . Мы можем использовать аннотацию независимо, но гораздо лучше использовать ее вместе с @ControllerAdvice . Таким образом, мы можем настроить глобальный механизм обработки ошибок. Таким образом, нам не нужно писать код для обработки исключений в каждом контроллере .

Давайте рассмотрим пример из нашей статьи об обработке ошибок для REST с помощью Spring:

@ControllerAdvice
public class RestResponseEntityExceptionHandler
  extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { IllegalArgumentException.class,
      IllegalStateException.class })
    protected ResponseEntity handleConflict(RuntimeException ex,
      WebRequest request) {
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(),
          HttpStatus.CONFLICT, request);
    }
}

Мы также должны отметить, что это обеспечит @ExceptionHandler методы для всех контроллеров, которые выбрасывают IllegalArgumentException или IllegalStateException . Исключения, объявленные с помощью @ExceptionHandler , должны соответствовать исключению, используемому в качестве аргумента метода. В противном случае механизм разрешения исключений выйдет из строя во время выполнения.

Здесь следует иметь в виду, что можно определить более одного @ExceptionHandler за тем же исключением. Мы не можем сделать это в одном классе, хотя, поскольку Весна будет жаловаться, создавая исключение и отказывая при запуске.

С другой стороны, если мы определим их в двух отдельных классах, приложение запустится, но оно будет использовать первый найденный обработчик, возможно, неправильный .

Q25. Обработка исключений в веб-приложениях

У нас есть три варианта обработки исключений в Spring MVC:

  • за исключением
  • на контроллер
  • глобально

Если во время обработки веб-запроса возникнет необработанное исключение, сервер вернет ответ HTTP 500. Чтобы предотвратить это, мы должны аннотировать любое из наших пользовательских исключений с помощью @ResponseStatus аннотации . Такого рода исключения разрешаются HandlerExceptionResolver .

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

Другой способ обработки исключений-использование @ExceptionHandler аннотации . Мы добавляем @ExceptionHandler методы к любому контроллеру и используем их для обработки исключений, создаваемых внутри этого контроллера. Эти методы могут обрабатывать исключения без аннотации @ResponseStatus , перенаправлять пользователя в специальное представление ошибок или создавать полностью настраиваемый ответ на ошибку.

Мы также можем передать связанные с сервлетом объекты ( HttpServletRequest , HttpServletResponse , HttpSession и Principal ) в качестве параметров методов обработчика. Но мы должны помнить, что мы не можем напрямую указать объект Model в качестве параметра.

Третий вариант обработки ошибок-это @ControllerAdvice classes . Это позволит нам применить те же методы, только на этот раз на уровне приложения, а не только к конкретному контроллеру. Чтобы включить это, нам нужно использовать @ControllerAdvice и @ExceptionHandler вместе. Таким образом, обработчики исключений будут обрабатывать исключения, создаваемые любым контроллером.

Для получения более подробной информации по этому вопросу ознакомьтесь со статьей Обработка ошибок для REST с помощью Spring.

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

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

Мы желаем вам удачи в любых предстоящих интервью!