2010-10-07 1 views
11

Я пытаюсь запустить первую установку Spring 3 MVC.Базовая конфигурация Spring MVC: PageNotFound using InternalResourceViewResolver

Мое приложение работает на коте, в контексте серверного «виноградная лоза»

Для целей тестирования, я пытаюсь получить запросы от http://localhost:8080/grapevine/test для визуализации содержимого WEB-INF/jsp/noSuchInvitation.jsp

When Я стараюсь это, я получаю 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 
+0

Вы уверены, что орфографические ошибки не установлены? –

+0

Возможный дубликат [Нет сопоставления для HTTP-запроса с URI \ [/WEB-INF/pages/apiForm.jsp \]] (http://stackoverflow.com/questions/1266303/no-mapping-found-for-http -request-with-uri-web-inf-pages-apiform-jsp) – naXa

ответ

27

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

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

+1

В чем разница между/* и просто /? У меня настроен Spring Webapp почти точно так же, как у Марти, но мой работает с сервлетом диспетчера, отображаемым в /. –

+3

@Ben: '/' будет соответствовать только корневому URL-адресу, тогда как '/ *' будет соответствовать всем URL-адресам – skaffman

+2

Это исправило проблему, спасибо. Ховер, у меня есть один вопрос. Учитывая страницу example.com, url-pattern/будет соответствовать только http://example.com. Как возможно, что запрос на http://example.com/test перенаправляется на сервлет диспетчера весны? –

1

Решение 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 с большим приоритетом, чем /*.

2

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

+6

Немного объясните, почему это работает, также будет оценено. – Alfergon

0

BEWARE: Это может быть обманчивое сообщение об ошибке. Это случилось со мной.

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

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

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

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

BTW, я использую выпуск Spring 4.0.0.

0

для меня Я решил проблему, используя шаблоны .jsp, а не только .html.

 Смежные вопросы

  • Нет связанных вопросов^_^