【问题标题】:Basic Spring MVC config: PageNotFound using InternalResourceViewResolver基本 Spring MVC 配置:PageNotFound 使用 InternalResourceViewResolver
【发布时间】:2011-04-22 04:38:09
【问题描述】:

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

我一定是在某个地方错误地配置了这个,但我看不出我做错了什么。

这里是所有相关的 sn-ps。

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

【问题讨论】:

标签: java spring spring-mvc url-pattern


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    注意:这可能是一个误导性的错误消息。它只是发生在我身上。

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

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

    或文件路径本身。

    现在我修正了我的拼写错误,它工作正常。我不知道为什么错误消息中会显示上下文,这确实使我忽略了我愚蠢的错字并尝试尝试对这个问题做出其他精彩的贡献。不要让它发生在你身上!

    顺便说一句,我使用的是 Spring 4.0.0 版本。

    【讨论】:

      【解决方案3】:

      只需将/* 替换为/ 作为您的url-pattern。它会工作......

      【讨论】:

      • 稍微解释一下它的工作原理也将不胜感激。
      【解决方案4】:

      解决方案 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 页面注册一个显式处理程序。

      【讨论】:

        【解决方案5】:

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

        您应该选择更具体的&lt;url-pattern&gt;,例如&lt;url-pattern&gt;/xyz/*&lt;/url-pattern&gt;,这样你的网址就会变成http://localhost:8080/grapevine/xyz/test,然后它应该可以正常工作了。

        【讨论】:

        • /* 和只是 / 有什么区别?我有一个 Spring webapp 的配置方式与 Marty 的几乎完全相同,但我的使用映射到 / 的调度程序 servlet。
        • @Ben: / 将仅匹配根 URL,而 /* 将匹配所有 URL
        • 解决了问题,谢谢。然而,我有一个问题。给定一个页面 example.com,url-pattern / 将仅匹配 example.com。对example.com/test 的请求怎么可能重定向到spring dispatcher servlet?
        • @WojciechGórski 在启动时,会扫描您的控制器并像 servlet 一样设置必要的路径。您可以检查您的日志中的 o.s.w.s.m.m.a.RequestMappingHandlerMapping 并查看设置的路径。
        • SelimOber,我知道它有效。我只是好奇为什么它可以工作(url-pattern 应该只适用于根 URL,而不是“子页面”)
        猜你喜欢
        • 2017-05-05
        • 2018-05-02
        • 1970-01-01
        • 2014-04-14
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        相关资源
        最近更新 更多