Базовая конфигурация Spring MVC: PageNotFound с использованием InternalResourceViewResolver - PullRequest
11 голосов
/ 07 октября 2010

Я пытаюсь запустить первую настройку 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

Ответы [ 5 ]

27 голосов
/ 07 октября 2010

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

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

2 голосов
/ 19 марта 2013

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

1 голос
/ 12 февраля 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>

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

0 голосов
/ 31 июля 2014

Для меня я решил проблему с помощью шаблонов .jsp, а не только .html.

0 голосов
/ 28 декабря 2013

ВНИМАНИЕ: это может быть ошибочное сообщение об ошибке. Это просто случилось со мной.

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

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

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

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

Кстати, я использую релиз Spring 4.0.0.

...