Spring 3 та @Controller

У цій статті розглянемо створення контролерів під час використання Spring Framework 3-ї версії та Spring MVC зокрема.

Абревіатура MVC у назві Spring MVC розшифровується як Model-view-controller. MVC («Модель-представлення-поведінка», «Модель-представлення-контролер») — схема використання декількох шаблонів проектування, за допомогою яких модель даних додатка, інтерфейс користувача та взаємодія з користувачем розділені на три окремі компоненти так, що модифікація одного з компонентів надає мінімальний вплив інші. Дана схема проектування часто використовується для побудови архітектурного каркасу, коли переходять від теорії до реалізації у конкретній предметній галузі.

Парадігра програмування MVC не буде докладно описуватися в даній статті.

Отже, контролер Spring MVC виконує роль (як не дивно :)) контролера в парадигмі програмування Model-View-Controller. Кожен запит перехоплюється глобальним Front-контролером, який за специфічними параметрами (URI, метод і заголовки запиту) визначає, якому з контролерів передати отриманий запит. Контролер обробляє запит та створює модель. Front-контролер заповнює представлення даними моделі та повертає отриманий результат браузеру. Нижче представлена ​​схема обробки запиту Spring.

controller
Рис 1. Обробка запиту в Spring Web MVC

Найпростіший контролер виглядає так:

Анотація @Controller служить для повідомлення Spring'у про те, що цей клас є bean'ом і його необхідно підвантажити при старті програми. Анотацією @RequestMapping(value = "/simple1") повідомляємо, що даний контролер оброблятиме запит, URI якого "/simple1"

- повідомляємо Front-контролеру, що ім'я подання "simple" (за замовчуванням, це файл /WEB-INF/views/simple.jsp).

Ці ж операції можна зробити за допомогою класу ModelAndView, який агрегує всі параметри моделі та ім'я відображення:

jsp-файл і в першому, і в другому випадку може виглядати, наприклад, так:

У двох наведених вище прикладах контролери не передають жодних даних уявленню, що буває вкрай рідко. Тому розглянемо варіант із передачею даних від контролера подання за допомогою моделі.

Модель-подання-контролер

Дані від контролера подання можуть передатися двома способами:

У першому випадку модель передається методу як параметра. Метод має повернути назву уявлення. У другому випадку метод сам створює об'єкт ModelAndView, який містить і модель, і ім'я представництва. Контролер має повернути цей об'єкт.

jsp-файл буде виглядати так:

У цьому прикладі контролер передає 2 параметри подання - name і path. Вони відображаються у поданні за допомогою конструкції $. Наприклад:

У цьому випадку користувачеві передається наступний рядок

Тобто вираз $ замінюється на John так як і в першому, і в другому методі контролера змінна моделі name заповнюється рядком John.

Щоб метод requestMapped отримав управління, необхідно виконати запит типу "/rmc/test".

Метод запиту

Як і в більшості http-фреймворків, у Spring є можливість розподіляти запити за різними методами не лише за параметрами, вказаними в URI, але й використовуючи різні методи запиту. Наприклад:

Для того, щоб виконався другий метод requestMethodPost, необхідно передати йому POST-запит, а для цього необхідноскористатися, наприклад, наступною формою:

Автозаповнення змінної із запиту або @PathVariable

У Spring є можливість автозаповнення змінної з шляху запиту. Розглянемо з прикладу:

Використовуючи цей код не потрібно дбати про те, як дістати рядок, розташований між pathvariable/ і наступним слешем. Вона буде автоматично поміщена в змінну категорію, завдяки анотації @PathVariable.

Ви можете замість рядкового типу змінної категорії використовувати цілий чи будь-який інший стандартний тип - Spring перетворює рядок до потрібного типу автоматично. Наприклад:

Варто зауважити, що в анотації @PathVariable можна як вказувати назву змінної:

так і не робити цього. У наступному випадку буде використовуватись назва, що збігається з назвою змінної: