Базовая конфигурация 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, а затем он должен работать нормально.


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


Решение 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.


для меня я решил проблему с помощью .шаблоны JSP и не только .формат html.