Базовая конфигурация Spring MVC: PageNotFound с использованием InternalResourceViewResolver

Я пытаюсь запустить первую установку Spring 3 MVC.

Мое приложение работает на Tomcat, а в контексте сервера "grapevine"

В целях тестирования я пытаюсь получить от http://localhost:8080/grapevine/test запросы на рендеринг содержимого WEB-INF/jsp/noSuchInvitation.jsp

Когда я пытаюсь это сделать, я получаю 404, а журналы предполагают, что моего jsp нет:

WARN  org.springframework.web.servlet.PageNotFound  - No mapping found for HTTP request with URI [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] in DispatcherServlet with name 'grapevine'

Я, должно быть, неправильно настроил это где-то, но я не вижу, что я сделал не так.

Вот все соответствующие фрагменты.

Web.xml:

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

Из моего контекста:

<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

Контроллер:

@Controller
public class ParticipantInvitationController {

@RequestMapping("/test")
public ModelAndView test()
{
    return new ModelAndView("noSuchInvitation");
}

Журнал:

DEBUG org.springframework.web.servlet.DispatcherServlet  - Rendering view [org.springframework.web.servlet.view.JstlView: name 'noSuchInvitation'; URL [/WEB-INF/jsp/noSuchInvitation.jsp]] in DispatcherServlet with name 'grapevine'
DEBUG org.springframework.web.servlet.view.JstlView  - Forwarding to resource [/WEB-INF/jsp/noSuchInvitation.jsp] in InternalResourceView 'noSuchInvitation'
DEBUG org.springframework.web.servlet.DispatcherServlet  - DispatcherServlet with name 'grapevine' processing GET request for [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp]
WARN  org.springframework.web.servlet.PageNotFound  - No mapping found for HTTP request with URI [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] in DispatcherServlet with name 'grapevine'
DEBUG org.springframework.security.web.context.HttpSessionSecurityContextRepository  - SecurityContext contents are anonymous - context will not be stored in HttpSession. 
DEBUG org.springframework.web.servlet.DispatcherServlet  - Successfully completed request

person Marty Pitt    schedule 07.10.2010    source источник
comment
Вы уверены, что орфографических ошибок нет?   -  person Adeel Ansari    schedule 07.10.2010
comment
возможный дубликат Сопоставление не найдено для HTTP-запроса с URI [/WEB-INF/pages/apiForm.jsp]   -  person naXa    schedule 13.03.2015


Ответы (5)


Это потому, что <url-pattern> в вашем web.xml слишком "широкое". Значение /* означает, что сервлет настроен на получение всех запросов, включая запрос от сервлета к JSP. Вы видите сообщение об ошибке от DispatcherServlet, который получает собственный перенаправленный запрос.

Вам следует выбрать более конкретный <url-pattern>, например <url-pattern>/xyz/*</url-pattern>, чтобы ваш URL стал http://localhost:8080/grapevine/xyz/test, и тогда он должен работать нормально.

person skaffman    schedule 07.10.2010
comment
В чем разница между / * и просто /? У меня есть веб-приложение Spring, настроенное почти так же, как у Марти, но мое работает с сервлетом диспетчера, сопоставленным с /. - person Ben J; 07.10.2010
comment
@Ben: / будет соответствовать только корневому URL, тогда как /* будет соответствовать всем URL - person skaffman; 07.10.2010
comment
Это устранило проблему, спасибо. Ховуэр, у меня один вопрос. Для страницы example.com шаблон URL-адреса / будет соответствовать только example.com. Как возможно, что запрос к example.com/test будет перенаправлен на сервлет диспетчера Spring? - person Wojciech Górski; 12.10.2012
comment
@ WojciechGórski При запуске ваши контроллеры сканируются, и необходимые пути устанавливаются как сервлеты. Вы можете проверить свои журналы на o.s.w.s.m.m.a.RequestMappingHandlerMapping и увидеть установленные пути. - person SelimOber; 08.01.2014
comment
SelimOber, я знаю, что работает. Мне было просто любопытно, почему это работает (шаблон URL-адреса должен применяться только к корневому URL-адресу, а не к подстраницам) - person Wojciech Górski; 09.01.2014
comment
@ WojciechGórski, насколько я понимаю, с / на сервлет Dispatcher перенаправляются только отображенные URL-адреса, например: /foo/bar/baz. С другой стороны, с /* каждый запрос отправляется диспетчеру, он обслуживает то, что может, и отправляет, не найденный в противном случае. - person SelimOber; 15.01.2014

Просто замените /* на / вместо своего url-pattern. Это будет работать...

person Jomon    schedule 19.03.2013
comment
Также было бы полезно немного пояснить, почему это работает. - person Alfergon; 19.03.2013

Решение 1: вы можете зарегистрировать свой сервлет в * .html и * .json (или xml, gif, png ...):

<servlet>
    <servlet-name>RestServlet</servlet-name>
    <servlet-class>
       org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>RestServlet</servlet-name>
  <url-pattern>/</url-pattern>
  <url-pattern>*.html</url-pattern>
  <url-pattern>*.json</url-pattern>
 </servlet-mapping>

Решение 2. Если вы хотите, чтобы ваш сервлет отображался в /*, добавьте в файл spring.xml следующее:

<mvc:default-servlet-handler/> 

И это в ваш файл web.xml:

<servlet-mapping>
  <servlet-name>jsp</servlet-name>
  <url-pattern>/WEB-INF/jsp/*</url-pattern>
 </servlet-mapping>

<servlet>
  <servlet-name>jsp</servlet-name>
  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>

Обоснование объясняется здесь: spring, web.xml. Это зарегистрирует явный обработчик для страниц JSP с более высоким приоритетом, чем /*.

person Nacho Coloma    schedule 12.02.2013

ВНИМАНИЕ! Это может быть вводящее в заблуждение сообщение об ошибке. Это просто случилось со мной.

Даже несмотря на то, что сообщение об ошибке неожиданно содержит / ContextName / ... в начале пути, это все равно может быть орфографическая ошибка в префиксе InternalResourceViewResolver:

<property name="prefix" value="/WEB-INF-typo-Here/jsp/"/>

или сам путь к файлу.

Теперь, когда я исправил орфографическую ошибку, все работает нормально. Я не знаю, почему контекст отображается в сообщении об ошибке, и это действительно заставило меня проигнорировать мою глупую опечатку и попытаться попробовать другие замечательные ответы на этот вопрос. Не позволяйте этому случиться с вами!

Кстати, я использую выпуск Spring 4.0.0.

person David Lotts    schedule 28.12.2013

для меня я решил проблему, используя шаблоны .jsp, а не только .html.

person appsthatmatter    schedule 31.07.2014