Что такое шаблон проектирования FrontController? На каком уровне DispatcherServlet использует его? - PullRequest
0 голосов
/ 14 сентября 2018

На самом деле я пытаюсь понять DispatcherServlet и узнал, что он следует шаблону проектирования FrontController.Пытаясь понять шаблон проектирования FrontController, наткнулся на эту ссылку FrontController из справочника Oracle Doc Не так много, как я начинающий, но мало что понял, как ниже

Если у нас нетFrontController Мы часто пытаемся дублировать код в нескольких контроллерах, таких как аутентификация и авторизация.И из-за чего ремонтопригодность становится большой проблемой, если мы хотим что-то изменить в будущем.Таким образом, имея frontController на месте, мы можем перенести основные функции в frontController, и изменения могут быть легко сделаны.

Когда я объяснил то же самое в интервью, он спросил меня, каковы эти основные функции.Я рассказал Internalization, viewResolver, Authentication, Authorization и т. Д. И теперь снова спросил, подумайте, нет ли сервлета-диспетчера, как вы управляете этими функциями в каждом контроллере?

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

Итак, вот мои вопросы

  1. Во-первых, верно ли мое понимание?

  2. Если я понимаюправильно, как ответить на второй вопрос интервьюера?Что, если не использовать диспетчерский сервлет, как вы выполняете эти функции в каждом контроллере?значит попросил меня написать какой-нибудь псевдокод общих функций.Что я не мог, так как я разработчик свинга.Может, кто-нибудь объяснит мне пример кода, который мы повторяем на контроллере, а теперь с диспетчером, которого можно избежать.

  3. Если мы начнем сравнивать DispatcherServlet с шаблоном проектирования frontController, можно ли сказать, что это LocaleResolver?, HandlerMapping, ThemeResolver, ViewResolver, HandlerExceptionResolver, HandlerAdapter, MultipartResolver и т. Д. Являются вспомогательными классами для DispatcherServlet?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

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

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

  1. Использование сервлета
  2. Использование фильтра

Spring Framework реализовал FrontController Design Patter, используя DispatcherServlet для перехвата каждого запроса и делегирования ответственному контроллеру для обработки запроса.

Если интервьюер спрашивает вас, что случилось, если у вас нет DispatcherServlet, как вы управляете всеми этими процессами аутентификации и авторизации, вы можете просто сказать, что я могу определить Фильтр, который будет перехватывать каждый запрос. Фильтр должен отвечать за диспетчеризацию, аутентификацию и авторизацию вещи. Struts использует Filter для реализации шаблона FrontController Design.

0 голосов
/ 15 сентября 2018

Определение фронт-контроллера

Фронт-контроллер отвечает за обработку всех запросов на веб-сайт.Для разработчиков веб-приложений это может быть очень полезной структурой, поскольку она дает разработчикам гибкость и возможность повторного использования кода без необходимости добавлять снова и снова. Он обеспечивает единую точку действия для обработки всех поступающих запросов кВеб-приложение J2EE направляет запрос в конкретный контроллер приложения для доступа к модели и просмотра ресурсов уровня представления.


позволяет проверить функциональность сервлета диспетчера, чтобы убедиться, что он находится спередиконец: рассмотрим приведенную ниже диаграмму, взятую из https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch15s02.html:

enter image description here

Как видно на предыдущей диаграмме, фронт-контроллер представлен для шаблона MVC,Он реализован в виде сервлета javax.servlet.Servlet, такого как ActionServlet в стойках, FacesServlet в JSF и DispatcherServlet в Spring MVC.Он обрабатывает входящие запросы и делегирует запросы конкретному контроллеру приложения.Этот контроллер приложения создает и обновляет модель и передает ее на фронт-контроллер для рендеринга.Наконец, Front Controller определяет конкретное представление и отображает данные этой модели.

Теперь рассмотрим шаг следующим образом:

  1. Пользователь нажимает на браузер или отправляет веб-форму приложения.Запрос покидает браузер, либо с некоторой дополнительной информацией, либо с общей информацией.Этот запрос обращается к Spring 10 *, который является простым классом сервлетов, как и другие веб-приложения на основе Java.Это Front-контроллер среды MVC Spring, который направляет все входящие запросы через единую точку.Среда Spring MVC централизует управление потоком запросов с помощью этого Front Controller.

  2. Пользователь нажимает на браузер или отправляет веб-форму приложения.Запрос покидает браузер, либо с некоторой дополнительной информацией, либо с общей информацией.Этот запрос обращается к Spring 10 *, который является простым классом сервлетов, как и другие веб-приложения на основе Java.Это Front-контроллер среды MVC Spring, который направляет все входящие запросы через единую точку.Среда Spring MVC централизует управление потоком запросов с помощью этого Front Controller.

  3. После того, как Spring 10 * определит конкретный прикладной контроллер с помощью конфигурации отображения обработчика, DispatcherServlet отправляет этот запрос выбранному контроллеру.Это фактический контроллер, отвечающий за обработку информации в соответствии с запросом пользователя и его параметрами.

  4. После того, как Spring 10 * определит контроллер конкретного приложения с помощью конфигурации отображения обработчика,DispatcherServlet отправляет этот запрос выбранному контроллеру.Это фактический контроллер, отвечающий за обработку информации в соответствии с запросом пользователя и его параметрами.

  5. После того, как Spring 10 * определит контроллер конкретного приложения с помощью конфигурации отображения обработчика,DispatcherServlet отправляет этот запрос выбранному контроллеру.Это фактический контроллер, отвечающий за обработку информации в соответствии с запросом пользователя и его параметрами.

  6. Spring MVC DispatcherServlet отображает модель в виде и генерирует читаемый пользователем форматинформация о модели

  7. Наконец, эта информация создает ответ и возвращает его в браузер пользователя по DispatcherServlet.

Итак, модуль Spring MVC предоставляет готовую реализацию шаблона фронт-контроллера, представляя класс org.springframework.web.servlet.DispatcherServlet. Это простой класс сервлетов и основа инфраструктуры Spring MVC. И этот сервлет интегрирован с контейнером Spring IoC, чтобы использовать шаблон зависимостей Spring. Веб-инфраструктура Spring использует Spring для своей собственной конфигурации, и все контроллеры являются компонентами Spring. Вы можете увидеть пружинный документ https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch15s02.html, который допускает использование шаблона проектирования переднего контроллера в DispatcherServlet


Ответы конкретно на ваши вопросы:

  1. да, с вашим пониманием все в порядке, но для лучшего понимания обратитесь к моему описанию
  2. когда нет DispatcherServlet, вам нужно определить что-то, чтобы позаботиться о необходимой функциональности, и лучше всего написать фильтр, включающий вашу логику аутентификации и авторизации
  3. Они не относятся к классам помощников , поскольку он имеет свое собственное определение в ООП, вы можете рассматривать их как компоненты, играющие роль в реализованной в шаблоне разработки фронт-контроллера версии Spring

Подробнее:

  • Большинство определений взято из книги Spring 5 Design Patterns Динеша Раджпута, вы можете обратиться к этой книге за дополнительной информацией
0 голосов
/ 14 сентября 2018

(1) FrontController - это просто центральное место, где все внешние запросы принимаются и передаются каждый из этих запросов соответствующему обработчику.Как вы объяснили, поскольку это центральное место для всех запросов, его можно использовать для выполнения всех общих задач, таких как безопасность, ведение журнала и т. Д.

(2) DispatcherServlet - это фактическиФронт контроллер Spring MVC.Он перехватывает каждый запрос, а затем отправляет каждый на соответствующий контроллер, который был зарегистрирован в контексте приложения Spring.

Подумайте, если нет сервлета-диспетчера, как вы управляете этими функциями в каждом контроллере?

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

Вы можете сделать что-то вроде реализации отдельного сервиса, который будет выполнять эти общие задачи (сквозные задачи), поскольку вы можете управлять всеми поступающими запросами.

...