Базовая конфигурация 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");
}
Log:
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
5 ответов
это так <url-pattern>
в своем web.xml
слишком "широкий". Значение /*
означает, что сервлет настроен для приема всех запросов, и это включает запрос от сервлета к JSP. Сообщение об ошибке, которое вы видите, от DispatcherServlet
, который получает свой собственный перенаправленный запрос.
вы должны выбрать более конкретный <url-pattern>
, например,<url-pattern>/xyz/*</url-pattern>
, так что Ваш URL-адрес будет http://localhost:8080/grapevine/xyz/test
, а затем он должен работать нормально.
Решение 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: если вы хотите, чтобы ваш сервлет отображался в /*
, добавьте следующее к вашей весне.xml-файл:
<mvc:default-servlet-handler/>
и это для вашей сети.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>
обоснование объясняется здесь:весна, web.в XML. Это зарегистрирует явный обработчик для страниц JSP с более высокий приоритет, чем /*
.
остерегайтесь: это может быть вводящее в заблуждение сообщение об ошибке. Это просто случилось со мной.
даже думал, что сообщение об ошибке неожиданно содержит /ContextName/... в начале пути это все еще может быть ошибкой в префиксе InternalResourceViewResolver:
<property name="prefix" value="/WEB-INF-typo-Here/jsp/"/>
или сам путь к файлу.
теперь, когда я исправил ошибку, она работает нормально. Я не знаю, почему контекст отображается в сообщении об ошибке, и это действительно заставило меня игнорировать моя глупая опечатка и попытка попробовать замечательные другие вклады в этот вопрос. Не позволяй этому случиться с тобой!
кстати, я использую выпуск Spring 4.0.0.