Как взаимодействуют DispatcherServlet, Resolver и Controllers? - программирование

Как взаимодействуют DispatcherServlet, Resolver и Controllers?

Итак, я столкнулся с довольно распространенным ошибкой:

WARNING: No mapping found for HTTP request with URI [/WEB-INF/jsp/index.jsp] in DispatcherServlet with name 'app'

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

Разработка в Eclipse, я имею следующую структуру:

/src/com/whiuk/philip/web/controller/IndexController.java
/WebContent
/WebContent/WEB-INF
/WebContent/WEB-INF/web.xml
/WebContent/WEB-INF/app-servlet.xml
/WebContent/WEB-INF/jsp/index.jsp

Элемент развертывания Eclipse означает, что он развертывается следующим образом:

/src -> WEB-INF/classes
/WebContent -> /
/ivy.xml[*] -> WEB-INF/lib

У меня есть файл web.xml, который определяет DispatcherServlet и отображение всех файлов (/*)

<servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

У меня есть файл app-servlet.xml, который сканирует пакеты и определяет InternalResourceViewResolver:

<context:component-scan base-package="com.whiuk.philip.web" />
<mvc:annotation-driven />
<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

У меня есть IndexController, у которого есть RequestMapping для индекса:

 @Controller
 public class IndexController {
      @RequestMapping(value = "/index", method = RequestMethod.GET)
      public ModelAndView index() {
             return new ModelAndView();
      }
 }

Журналы показывают, что это зарегистрировано:

org.springframework.web.servlet.handler.AbstractHandlerMethodMapping registerHandlerMethod
INFO: Mapped "{[/index],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}"
onto public org.springframework.web.servlet.ModelAndView 
com.whiuk.philip.web.controller.IndexController.index()

Наконец, у меня есть файл index.jsp.

Может кто-нибудь объяснить, что такое неправильная конфигурация, что приводит к ошибке, показанной вверху, и, если возможно, предоставить предложение или так для целей DispatcherServlet, Resolvers и того, как они питаются в контроллеры.

4b9b3361

Ответ 1

По существу, что происходит, так как у вас есть Spring DispatcherServlet, сопоставленный с /*, он, как правило, вызывается для каждого запроса (это нормально), но, к сожалению, вызывается даже тогда, когда запрос отправляется на страницу JSP (/WEB-INF/jsp/index.jsp), а не вызывает вызов сервлета по умолчанию для контейнеров.

Исправление, о котором я знаю, следующее:

Сопоставьте его по пути сервлетов по умолчанию /:

<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Одна из проблем, которые вы видели выше, заключается в том, что ресурсы под корнем вашего webapp, к сожалению, будут обработаны DispatcherServlet, которые не будут знать, что с ним делать, исправление заключается в зарегистрируйте обработчик сервлета по умолчанию таким образом:

<mvc:default-servlet-handler />

Ответ 2

Я попытаюсь объяснить "поток" запроса в приложении Spring Web MVC.

При отправке запроса в ваше приложение происходит следующее:

  • Запрос поступает на ваш сервер (например, Tomcat). В зависимости от пути контекста в URL-адресе сервер решает, к какому приложению принадлежит запрос.
  • В зависимости от URL-адреса и отображения сервлетов в файле web.xml вашего приложения сервер знает, какой сервлет должен обработать запрос.
  • Запрос передается в цепочку сервлет фильтра, которая может изменять или отклонять запросы
  • Сервлет получает контроль над запросом. В случае вашего приложения Spring получает запрос Spring Dispatcherservlet. Теперь Spring пинает
  • Запрос обрабатывается mvc-перехватчики preHandle методы
  • Запрос сопоставляется с контроллером на основе URL-адреса. Будет вызван соответствующий метод контроллера.
  • Контроллер обрабатывает запрос. В контроллерах могут возвращаться многие разные ответы (jsp, pdf, json, перенаправления и т.д.). Пока я предполагаю, что вы хотите отобразить простой вид jsp. Результат контроллера - это две вещи: модель и вид. Модель представляет собой карту, содержащую данные, которые вы хотите получить позже в своем представлении. Представление на этом этапе в большинстве случаев представляет собой простую строку, содержащую имя вида.
  • Зарегистрированные пружины mvc-перехватчики могут снова заново использовать метод postHandle (например, для модификации модели).
  • Результат "просмотра" вашего контроллера разрешен к реальному виду с помощью ViewResolver. В зависимости от ViewResolver результатом может быть страница jsp, вид фрагментов, тимелеафа или многих других "представлений". В вашем случае ViewResolver разрешает имя представления (например, "myPage" ) в файле jsp (например, /WEB-INF/jsp/myPage.jsp)
  • Вид визуализируется с использованием данных модели, возвращаемых вашим контроллером.
  • Ответ с визуализированным представлением снова будет передан в mvc-перехватчики (afterCompletion method)
  • Ответ оставит сервлет диспетчера. Здесь заканчивается земля Spring.
  • Ответ снова проходит через сервлет-фильтры.
  • Ответ отправляется обратно клиенту

Не стесняйтесь исправить меня, если я не на 100% правильно, или если что-то пропустил: -)