Где инициализируется контекст приложения в mvc?
Контекст инициализируется спрингом во всех приложениях по одному и тому же принципу. MVC это или нет — разницы нет.
2 фев 2021 в 19:04
вам это исключительно ради познания и интереса или же за этим у Вас стоят какие-то практические задачи, которые по Вашему могут быть решены как только Вы узнаете как инициализируется контекст в Спринг?
2 фев 2021 в 19:06
Вопрос интересный конечно, но большой и длинный. Поэтому я и спрашивал у Вас про практическое применение. В общем же виде статью по инициализации контекста можно день или два писать.
2 фев 2021 в 19:10
Вопрос, что бы осознать до конца как это все происходит, очень много информации по этому вопросу прочитал, уже каша получилась. Думал найдется опытный практик, который досконально может все разложить по полочкам, обновив свои знания и оказав посильную помощь подрастающему поколению)))
Модель-Представление-Контроллер (MVC)
Yii использует шаблон проектирования Модель-Представление-Контроллер (MVC, Model-View-Controller), который широко применяется в веб-программировании.
MVC предназначен для разделения бизнес-логики и пользовательского интерфейса, чтобы разработчики могли легко изменять отдельные части приложения, не затрагивая другие. В архитектуре MVC модель предоставляет данные и правила бизнес-логики, представление отвечает за пользовательский интерфейс (например, текст, поля ввода), а контроллер обеспечивает взаимодействие между моделью и представлением.
Помимо этого, Yii использует фронт-контроллер, называемый приложением (application), который инкапсулирует контекст обработки запроса. Приложение собирает информацию о запросе и передает её для дальнейшей обработки соответствующему контроллеру.
Следующая диаграмма отображает структуру приложения Yii:
Статическая структура приложения Yii

1. Типичная последовательность работы приложения Yii ¶
Следующая диаграмма описывает типичную последовательность процесса обработки пользовательского запроса приложением:
Типичная последовательность работы приложения Yii

- Пользователь осуществляет запрос посредством URL http://www.example.com/index.php?r=post/show&id=1 , и веб-сервер обрабатывает его, запуская скрипт инициализации index.php .
- Скрипт инициализации создает экземпляр приложения и запускает его на выполнение.
- Приложение получает подробную информацию о запросе пользователя от компонента приложения request .
- Приложение определяет запрошенные контроллер и действие при помощи компонента urlManager . В данном примере контроллером будет post , относящийся к классу PostController , а действием — show , суть которого определяется контроллером.
- Приложение создаёт экземпляр запрашиваемого контроллера для дальнейшей обработки запроса пользователя. Контроллер определяет соответствие действия show методу actionShow в классе контроллера. Далее создаются и применяются фильтры (например, access control, benchmarking), связанные с данным действием, и, если фильтры позволяют, действие выполняется.
- Действие считывает из базы данных модель Post с ID равным 1 .
- Действие подключает представление show , передавая в него модель Post .
- Представление получает и отображает атрибуты модели Post .
- Представление подключает некоторые виджеты.
- Сформированное представление вставляется в макет страницы.
- Действие завершает формирование представления и выводит результат пользователю.
Found a typo or you think this page needs improvement?
Edit it on github !
Spring – MVC Framework
Среда Spring Web MVC предоставляет архитектуру Model-View-Controller (MVC) и готовые компоненты, которые можно использовать для разработки гибких и слабосвязанных веб-приложений. Шаблон MVC приводит к разделению различных аспектов приложения (логика ввода, бизнес-логика и логика пользовательского интерфейса), обеспечивая при этом слабую связь между этими элементами.
- Модель инкапсулирует данные приложения и в целом они состоят из POJO.
- Представление отвечает за рендеринг данных модели и, в общем, генерирует вывод HTML, который может интерпретировать браузер клиента.
- Контроллер отвечает за обработку пользовательских запросов и построение соответствующей модели и передает ее в представление для визуализации.
Модель инкапсулирует данные приложения и в целом они состоят из POJO.
Представление отвечает за рендеринг данных модели и, в общем, генерирует вывод HTML, который может интерпретировать браузер клиента.
Контроллер отвечает за обработку пользовательских запросов и построение соответствующей модели и передает ее в представление для визуализации.
ДиспетчерСервлет
Среда Spring Web Model-View-Controller (MVC) разработана на основе DispatcherServlet, который обрабатывает все HTTP-запросы и ответы. Рабочий процесс обработки запросов Spring Web MVC DispatcherServlet показан на следующей диаграмме:

Ниже приведена последовательность событий, соответствующая входящему HTTP-запросу в DispatcherServlet.
- После получения HTTP-запроса DispatcherServlet обращается к HandlerMapping для вызова соответствующего контроллера .
- Контроллер принимает запрос и вызывает соответствующие методы обслуживания на основе используемого метода GET или POST. Сервисный метод устанавливает данные модели на основе определенной бизнес-логики и возвращает имя представления в DispatcherServlet .
- DispatcherServlet будет получать помощь от ViewResolver для получения определенного представления для запроса.
- Как только представление завершено, DispatcherServlet передает данные модели в представление, которое в конечном итоге отображается в браузере.
После получения HTTP-запроса DispatcherServlet обращается к HandlerMapping для вызова соответствующего контроллера .
Контроллер принимает запрос и вызывает соответствующие методы обслуживания на основе используемого метода GET или POST. Сервисный метод устанавливает данные модели на основе определенной бизнес-логики и возвращает имя представления в DispatcherServlet .
DispatcherServlet будет получать помощь от ViewResolver для получения определенного представления для запроса.
Как только представление завершено, DispatcherServlet передает данные модели в представление, которое в конечном итоге отображается в браузере.
Все вышеупомянутые компоненты, то есть HandlerMapping, Controller и ViewResolver, являются частями WebApplicationContext w, который является расширением простого ApplicationContext с некоторыми дополнительными функциями, необходимыми для веб-приложений.
Требуемая конфигурация
Вам необходимо сопоставить запросы, которые вы хотите обработать с помощью DispatcherServlet , используя сопоставление URL-адресов в файле web.xml . Ниже приведен пример демонстрации объявления и сопоставления для примера HelloWeb DispatcherServlet:
id = "WebApp_ID" version = "2.4" xmlns = "http://java.sun.com/xml/ns/j2ee" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> Spring MVC Application HelloWeb org.springframework.web.servlet.DispatcherServlet 1 HelloWeb *.jsp
Файл web.xml будет храниться в каталоге WebContent / WEB-INF вашего веб-приложения. После инициализации HelloWeb DispatcherServlet платформа попытается загрузить контекст приложения из файла с именем [servlet-name] -servlet.xml, расположенного в каталоге WebContent / WEB-INF приложения. В этом случае наш файл будет HelloWebservlet.xml .
Затем тег указывает, какие URL будут обрабатываться каким DispatcherServlet. Здесь все HTTP-запросы, заканчивающиеся на .jsp, будут обрабатываться HelloWeb DispatcherServlet.
Если вы не хотите использовать имя файла по умолчанию как [servlet-name] -servlet.xml и расположение по умолчанию как WebContent / WEB-INF , вы можете настроить это имя файла и местоположение, добавив прослушиватель сервлета ContextLoaderListener в свой файл web.xml следующим образом –
DispatcherServlet definition goes here-----> .contextConfigLocation /WEB-INF/HelloWeb-servlet.xml org.springframework.web.context.ContextLoaderListener
Теперь давайте проверим необходимую конфигурацию файла HelloWeb-servlet.xml , который находится в каталоге WebContent / WEB-INF вашего веб-приложения –
Ниже приведены важные моменты, касающиеся файла HelloWeb-servlet.xml.
- Файл [servlet-name] -servlet.xml будет использоваться для создания определенных bean-компонентов, переопределяя определения любых bean-компонентов, определенных с таким же именем в глобальной области видимости.
- Тег будет использоваться для активации возможности сканирования аннотаций Spring MVC, которая позволяет использовать аннотации, такие как @Controller, @RequestMapping и т. Д.
- InternalResourceViewResolver будет иметь правила, определенные для разрешения имен представлений. Согласно определенному выше правилу, логическое представление с именем hello делегируется реализации представления, расположенной в /WEB-INF/jsp/hello.jsp .
Файл [servlet-name] -servlet.xml будет использоваться для создания определенных bean-компонентов, переопределяя определения любых bean-компонентов, определенных с таким же именем в глобальной области видимости.
Тег будет использоваться для активации возможности сканирования аннотаций Spring MVC, которая позволяет использовать аннотации, такие как @Controller, @RequestMapping и т. Д.
InternalResourceViewResolver будет иметь правила, определенные для разрешения имен представлений. Согласно определенному выше правилу, логическое представление с именем hello делегируется реализации представления, расположенной в /WEB-INF/jsp/hello.jsp .
Следующий раздел покажет вам, как создать ваши фактические компоненты, например, Controller, Model и View.
Определение контроллера
DispatcherServlet делегирует запрос контроллерам для выполнения специфической для него функциональности. Аннотация @Controller указывает, что определенный класс выполняет роль контроллера. Аннотация @RequestMapping используется для сопоставления URL либо с целым классом, либо с конкретным методом-обработчиком.
@Controller @RequestMapping("/hello") public class HelloController < @RequestMapping(method = RequestMethod.GET) public String printHello(ModelMap model) < model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; >>
Аннотация @Controller определяет класс как контроллер Spring MVC. Здесь первое использование @RequestMapping указывает, что все методы обработки на этом контроллере относятся к пути / hello . Следующая аннотация @RequestMapping (method = RequestMethod.GET) используется для объявления метода printHello () в качестве метода службы контроллера по умолчанию для обработки HTTP-запроса GET. Вы можете определить другой метод для обработки любого запроса POST по тому же URL.
Вы можете написать приведенный выше контроллер в другой форме, где вы можете добавить дополнительные атрибуты в @RequestMapping следующим образом:
@Controller public class HelloController < @RequestMapping(value = "/hello", method = RequestMethod.GET) public String printHello(ModelMap model) < model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; >>
Атрибут value указывает URL-адрес, с которым сопоставляется метод обработчика, а атрибут метода определяет метод службы для обработки HTTP-запроса GET. О контроллере, определенном выше, следует отметить следующие важные моменты:
- Вы определите необходимую бизнес-логику внутри метода сервиса. Вы можете вызвать другой метод внутри этого метода согласно требованию.
- На основе определенной бизнес-логики вы создадите модель в этом методе. Вы можете использовать различные атрибуты модели сеттера, и эти атрибуты будут доступны представлению для представления окончательного результата. В этом примере создается модель с атрибутом «сообщение».
- Определенный метод службы может возвращать строку, которая содержит имя представления, которое будет использоваться для визуализации модели. Этот пример возвращает “привет” как логическое имя представления.
Вы определите необходимую бизнес-логику внутри метода сервиса. Вы можете вызвать другой метод внутри этого метода согласно требованию.
На основе определенной бизнес-логики вы создадите модель в этом методе. Вы можете использовать различные атрибуты модели сеттера, и эти атрибуты будут доступны представлению для представления окончательного результата. В этом примере создается модель с атрибутом «сообщение».
Определенный метод службы может возвращать строку, которая содержит имя представления, которое будет использоваться для визуализации модели. Этот пример возвращает “привет” как логическое имя представления.
Создание JSP-видов
Spring MVC поддерживает много типов представлений для различных технологий представления. К ним относятся – JSP, HTML, PDF, рабочие листы Excel, XML, шаблоны Velocity, XSLT, JSON, Atom и RSS-каналы, JasperReports и т. Д. Но чаще всего мы используем шаблоны JSP, написанные с использованием JSTL.
Давайте напишем простое приветственное представление в /WEB-INF/hello/hello.jsp –
Hello Spring MVC $
Здесь $ – это атрибут, который мы установили внутри контроллера. Вы можете иметь несколько атрибутов для отображения внутри вашего представления.
Spring Web MVC Framework Примеры
Основываясь на вышеизложенных концепциях, давайте проверим несколько важных примеров, которые помогут вам в создании веб-приложений Spring –
В этом примере объясняется, как написать простое приложение Spring Web Hello World.
В этом примере объясняется, как написать веб-приложение Spring с использованием HTML-форм для отправки данных в контроллер и отображения обработанного результата.
Узнайте, как использовать функциональность перенаправления страниц в Spring MVC Framework.
Узнайте, как получить доступ к статическим страницам вместе с динамическими страницами в Spring MVC Framework.
Узнайте, как обрабатывать исключения в Spring MVC Framework.
Spring MVC — основные принципы

Фреймворк Spring MVC обеспечивает архитектуру паттерна Model — View — Controller (Модель — Отображение (далее — Вид) — Контроллер) при помощи слабо связанных готовых компонентов. Паттерн MVC разделяет аспекты приложения (логику ввода, бизнес-логику и логику UI), обеспечивая при этом свободную связь между ними.
- Model (Модель) инкапсулирует (объединяет) данные приложения, в целом они будут состоять из POJO («Старых добрых Java-объектов», или бинов).
- View (Отображение, Вид) отвечает за отображение данных Модели, — как правило, генерируя HTML, которые мы видим в своём браузере.
- Controller (Контроллер) обрабатывает запрос пользователя, создаёт соответствующую Модель и передаёт её для отображения в Вид.
DispatcherServlet
Вся логика работы Spring MVC построена вокруг DispatcherServlet, который принимает и обрабатывает все HTTP-запросы (из UI) и ответы на них. Рабочий процесс обработки запроса DispatcherServlet’ом проиллюстрирован на следующей диаграмме:

Ниже приведена последовательность событий, соответствующая входящему HTTP-запросу:
- После получения HTTP-запроса DispatcherServlet обращается к интерфейсу HandlerMapping, который определяет, какой Контроллер должен быть вызван, после чего, отправляет запрос в нужный Контроллер.
- Контроллер принимает запрос и вызывает соответствующий служебный метод, основанный на GET или POST. Вызванный метод определяет данные Модели, основанные на определённой бизнес-логике и возвращает в DispatcherServlet имя Вида (View).
- При помощи интерфейса ViewResolver DispatcherServlet определяет, какой Вид нужно использовать на основании полученного имени.
- После того, как Вид (View) создан, DispatcherServlet отправляет данные Модели в виде атрибутов в Вид, который в конечном итоге отображается в браузере.
Конфигурирование
Вам будет необходимо связать (замапить) запросы, которые Вы хотите обработать при помощи DispatcherServlet, используя мапинг URL в файле web.xml. Ниже приведён пример объявления и мапинга DispatcherServlet’а HelloWeb:
Spring MVC Application HelloWeb org.springframework.web.servlet.DispatcherServlet 1 HelloWeb *.jsp
Файл web.xml будет находиться в каталоге WebContent/WEB-INF. После инициализации HelloWeb, фреймворк попытается загрузить контекст приложения из файла с именем [servlet-name]-servlet.xml, находящегося в каталоге WebContent/WEB-INF. В нашем случае, это будет HelloWeb-servlet.xml.
Далее, тэг указывает, какие веб-адреса обрабатываются каким DispatcherServlet’ом. В нашем случае, все HTTP-запросы, заканчивающиеся на «.jsp», будут обработаны HelloWeb.
Если Вы не хотите использовать [servlet-name]-servlet.xml / WebContent/WEB-INF в качестве файла и директории по умолчанию, Вы можете настроить имя файла и директорию, добавив слушатель сервлета (servlet listener) ContextLoaderListener в web.xml, как показано ниже:
. contextConfigLocation /WEB-INF/HelloWeb-servlet.xml org.springframework.web.context.ContextLoaderListener
Теперь давайте проверим конфигурацию для HelloWeb-servlet.xml, размещённую в каталоге WebContent/WEB-INF:
Ниже приведены важные моменты в HelloWeb-servlet.xml:
- Файл [servlet-name]-servlet.xml будет использоваться для создания обозначенных бинов, с переопределением определений каждого бина, определённых с тем же именем в глобальной области.
- Тэг будет использован для для активации функции сканирования аннотаций Spring MVC, позволяющей использовать аннотации, такие как Controller, @RequestMapping и проч.
- Имена Видов (View) будут определяться при помощи InternalResourceViewResolver. В соответствии с указанным выше правилом, Вид с именем hello будет реализован по адресу /WEB-INF/jsp/hello.jsp
Определение Контроллера
DispatcherServlet отправляет запрос контроллерам для выполнения определённых функций. Аннотация @Controllerannotation указывает, что конкретный класс является контроллером. Аннотация @RequestMapping используется для мапинга (связывания) с URL для всего класса или для конкретного метода обработчика.
@Controller @RequestMapping("/hello") public class HelloController < @RequestMapping(method = RequestMethod.GET) public String printHello(ModelMap model) < model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; >>
Аннотация Controller определяет класс как Контроллер Spring MVC. В первом случае, @RequestMapping указывает, что все методы в данном Контроллере относятся к URL-адресу «/hello». Следующая аннотация @RequestMapping(method = RequestMethod.GET) используется для объявления метода printHello() как дефолтного метода для обработки HTTP-запросов GET (в данном Контроллере). Вы можете определить любой другой метод как обработчик всех POST-запросов по данному URL-адресу.
Вы можете написать вышеуказанный Контроллер по-другому, указав дополнительные атрибуты для аннотации @RequestMapping следующим образом:
@Controller public class HelloController < @RequestMapping(value = "/hello", method = RequestMethod.GET) public String printHello(ModelMap model) < model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; >>
Атрибут «value» указывает URL, с которым мы связываем данный метод (value = «/hello»), далее указывается, что этот метод будет обрабатывать GET-запросы (method = RequestMethod.GET). Также, нужно отметить важные моменты в отношении приведённого выше контроллера:
- Вы определяете бизнес-логику внутри связанного таким образом служебного метода. Из него Вы можете вызывать любые другие методы.
- Основываясь на заданной бизнес-логике, в рамках этого метода Вы создаёте Модель (Model). Вы можете добавлять аттрибуты Модели, которые будут добавлены в Вид (View). В примере выше мы создаём Модель с атрибутом «message».
- Данный служебный метод возвращает имя Вида в виде строки String. В данном случае, запрашиваемый Вид имеет имя «hello».
Создание Вида (JSP)
Spring MVC поддерживает множество типов Видов для различных технологий отображения страницы. В том числе — JSP, HTML, PDF, Excel, XML, Velocity templates, XSLT, JSON, каналы Atom и RSS, JasperReports и проч. Но чаще всего используются шаблоны JSP, написанные при помощи JSTL.
Давайте напишем простой Вид «hello» в /WEB-INF/hello/hello.jsp:
Hello Spring MVC $
В данном случае, переменная $ выводит тот самый атрибут, установленный нами в Контроллере. Внутри Вида Вы можете отобразить любое количество атрибутов.
Примеры реализации фреймворка Spring MVC
Основываясь на приведённых выше концепциях, предлагаю выполнить несколько важных уроков, которые в дальнейшем помогут нам создавать приложения Spring Web:
Spring MVC Hello World Example
Пример, разъясняющий написание простейшего приложения Hello World.
Spring MVC Form Handling Example
В этом примере объясняется, как написать приложение Spring Web с помощью форм HTML, отправить данные контроллеру и отобразить обработанный результат.
Spring Static Pages Example
Получаем доступ к статическим страницам вместе с динамическими.