Basic 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
Ответы
Ответ 1
Это потому, что <url-pattern>
в вашем web.xml
слишком "широкий". Значение /*
означает, что сервлет настроен на прием всех запросов и включает в себя запрос сервлета к JSP. Сообщение об ошибке, которое вы видите, находится от DispatcherServlet
, которое получает свой собственный переадресованный запрос.
Вы должны выбрать более конкретный <url-pattern>
, например. <url-pattern>/xyz/*</url-pattern>
, чтобы ваш URL-адрес стал http://localhost:8080/grapevine/xyz/test
, и тогда он должен работать нормально.
Ответ 2
Просто замените /*
на /
на url-pattern
. Он будет работать...
Ответ 3
Решение 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 с большим приоритетом, чем /*
.
Ответ 4
BEWARE: Это может быть ошибочное сообщение об ошибке. Это случилось со мной.
Даже если сообщение об ошибке неожиданно содержит /ContextName/... в начале пути, оно все равно может быть ошибкой в префиксе InternalResourceViewResolver:
<property name="prefix" value="/WEB-INF-typo-Here/jsp/"/>
или путь к файлу.
Теперь, когда я исправил свои орфографические ошибки, он отлично работает. Я не знаю, почему контекст показывает в сообщении об ошибке, и это действительно заставило меня игнорировать мою глупую опечатку и попытаться попробовать замечательные другие вклады в этот вопрос. Не позволяйте этому случиться с вами!
Кстати, я использую Spring 4.0.0 release.
Ответ 5
для меня я решил проблему, используя шаблоны .jsp, а не только .html.