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.