Basic Spring MVC配置:使用InternalResourceViewResolver的PageNotFound

时间:2010-10-07 05:33:23

标签: java spring spring-mvc url-pattern

我正在尝试运行第一个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 个答案:

答案 0 :(得分:27)

这是因为<url-pattern>中的web.xml太“宽”。值/*表示servlet配置为接收所有请求,包括从servlet到JSP的请求。您看到的错误消息来自DispatcherServlet,它正在接收自己转发的请求。

您应该选择更具体的<url-pattern>,例如<url-pattern>/xyz/*</url-pattern>,以便您的网址变为http://localhost:8080/grapevine/xyz/test,然后就可以正常使用了。

答案 1 :(得分:2)

只需将/*替换为/作为url-pattern。它会起作用......

答案 2 :(得分:1)

解决方案1 ​​:您可以在* .html和* .json(或xml,gif,png ...)注册您的servlet:

<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 :如果要将servlet映射到/*,请将以下内容添加到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>

此处解释了基本原理:springweb.xml。这将为JSP页面注册一个显式处理程序,其优先级高于/*

答案 3 :(得分:0)

当心:这可能是一个误导性的错误信息。它发生在我身上。

即使错误消息意外地在路径的开头包含/ ContextName / ...,它仍然可能是InternalResourceViewResolver前缀中的拼写错误:

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

或文件路径本身。

现在我修复了拼写错误,它运行正常。我不知道为什么上下文显示在错误信息中,它真的让我忽略了我的愚蠢错字并试图尝试这个问题的精彩其他贡献。不要让它发生在你身上!

BTW,我使用的是Spring 4.0.0版本。

答案 4 :(得分:0)

对我来说,我使用.jsp模板而不仅仅是.html解决了这个问题。