【问题标题】:No mapping found for HTTP request with URI [/WEB-INF/pages/apiForm.jsp] [duplicate]找不到带有 URI [/WEB-INF/pages/apiForm.jsp] 的 HTTP 请求的映射 [重复]
【发布时间】:2010-11-18 23:22:33
【问题描述】:

我的处理程序转发到 internalresourceview 'apiForm',但随后我收到错误 404 RequestURI=/WEB-INF/pages/apiForm.jsp。我确定 apiForm.jsp 位于 /WEB-INF/pages/

13:45:02,034 调试 [org.springframework.web.servlet.view.JstlView] - 转发到 InternalResourceView 'apiForm' 中的资源 [/WEB-INF/pages/apiForm.jsp]
13:45:02,035 调试 [org.springframework.web.servlet.DispatcherServlet] - 名为“testapp2”的 DispatcherServlet 确定 [/WEB-INF/pages/apiForm.jsp]
13:45:02,038 调试 [org.springframework.web.servlet.DispatcherServlet] 的 Last-Modified 值] - 未找到处理程序 在 getLastModified
13:45:02,038 调试 [org.springframework.web.servlet.DispatcherServlet] - 名称为“testapp2”的 DispatcherServlet 处理请求 [/WEB-INF/pages/apiForm.jsp]
13:45:02,038 警告 [org.springframework.web.servlet.PageNotFound] - 找不到映射 带有 URI [/WEB-INF/pages/apiForm.jsp] 的 HTTP 请求在 DispatcherServlet 中,名称为“testapp2”
13:45:02,045 调试 [org.springframework.web.servlet.DispatcherServlet] - 成功完成请求
13:45:02,048 DEBUG [org.springframework.web.servlet.DispatcherServlet] - 成功完成请求

这就是我的 dispatcher.xml 的样子..

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

【问题讨论】:

    标签: spring spring-mvc servlet-dispatching


    【解决方案1】:

    看起来 DispatcherServlet 正在尝试处理对 apiForm.jsp 的请求,这表明您的 web.xml servlet-mapping 正在将对该空间的请求定向到 DispatcherServlet。

    你可能有这样的东西?

    <servlet-mapping>
      <servlet>dispatcher</servlet>
      <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

    尝试使用不同的扩展名(例如 .do)调用您的控制器并更新 servlet 映射以适应

     <servlet-mapping>
      <servlet>dispatcher</servlet>
      <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    

    【讨论】:

    • 是的,你是对的。你能解释一下,为什么我不能将调度程序设置为 /* ?
    • 当您将 url-pattern 设置为 /* 时,所有请求都将发送到该 DispatcherServlet,其中包括对 JSP 呈现的请求。虽然这不是真的,但有时将 InternalResourceView(以及类似 JstlView 的派生)视为另一个 HTTP 请求是有用的,因为这样您就会明白为什么 DispatcherServlet 会接收到对 JSP 的请求。
    • 当我设置为 / 时,我的请求渲染得很好。只有当我设置 /* 。 / 和 /* 有什么不同?
    • / 仅匹配 URL host/servlet /* 匹配host/servlet 下的所有内容,例如 / index.html、/foo.jpg 以及最重要的是在这种情况下是 /WEB-INF/pages/apiForm.jsp,* 是通配符,表示“任何东西” 在前面的建议中,*.do 匹配任何以.do,例如 /foo.do、/foo/bar.do。它不匹配以 jsp 结尾的任何内容,因此对 /WEB-INF/pages/apiFrom.jsp 的请求不匹配,并且不会路由到 DispatcherServlet
    • 感谢您的回答,帮了大忙
    【解决方案2】:

    是的,我知道我参加这个聚会迟到了,但它可能会帮助其他人。

    servlet 容器根据匹配的最长路径选择映射。因此,您可以将此映射放入您的 JSP,它将被选择而不是 /* 映射。

    <servlet-mapping>
      <servlet-name>jsp</servlet-name>
      <url-pattern>/WEB-INF/pages/*</url-pattern>
     </servlet-mapping>
    

    实际上,对于 Tomcat,这就是您所需要的,因为 jsp 是一个开箱即用的 servlet。对于其他容器,您要么需要找出 JSP servlet 的名称,要么添加一个 servlet 定义,例如:

    <servlet>
      <servlet-name>jsp</servlet-name>
      <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    </servlet>
    

    【讨论】:

    • 非常感谢您写这篇文章,这正是我想要的!
    • 这是完美的,不允许扩展!谢谢,
    • Jetty 默认也使用 Jasper servlet,名称为“jsp”,因此同样的映射也适用于 Jetty。
    • 我无法让它工作。 jsp servlet 似乎在 Tomcat 7 中不存在,default servlet 威胁 jsp 作为静态页面。
    • (抱歉,treats)终于可以正常工作了(与 Jasper 一起)。 “你只需要 Tomcat”这句话是误导性的,还是谢谢你!
    【解决方案3】:

    只需将&lt;mvc:default-servlet-handler /&gt; 添加到您的 DispatcherServlet 配置中即可!

    【讨论】:

    • OP 真的应该改变接受的答案。很棒的提示。
    • 很好的答案!之前没有这个声明它真的很奇怪。我将 Eclipse 从 Juno SR1 升级到 Luna SR2 和 bam,它停止工作。如果没有这个答案,我不会走得太远。谢谢!
    • 静态 css/js 文件呢?添加 后,他们仍然无法加载事件
    【解决方案4】:

    你会得到一个No mapping found for HTTP request with URI错误

    如果您扫描了错误的包裹

    例如,您的控制器在 my.package.abc 中 但是你错误地放了

    &lt;context:component-scan base-package="my.package.efg*" /&gt;

    @ComponentScan("my.package.efg*")

    从某种意义上说,当请求进入时,您的控制器不会被扫描到 Web 应用程序上下文中 不只是url,整个类都找不到!

    【讨论】:

    • 这不是对这里提出的问题的回答,这是关于在将响应重定向到 JSP 视图后生成的错误。如果这是问题所在,则不会发生重定向,错误消息中也不会引用 JSP 文件。
    【解决方案5】:

    对我有帮助的解决方案是:不要将 DispatcherServlet 映射到 /*,将其映射到 /。最终的配置是:

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            ...
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    【讨论】:

      【解决方案6】:

      我想我阅读了整个互联网,以了解如何让 sitemesh 处理我的 html 路径而无需扩展 + API 路径无需扩展。我被裹在一件直筒夹克里,想弄清楚这一点,每转一圈似乎都会破坏其他东西。然后我终于看到了这个帖子。

      <servlet>
          <servlet-name>dispatcher</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet>
          <servlet-name>jsp</servlet-name>
          <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
      </servlet>
      
      <servlet-mapping>
          <servlet-name>dispatcher</servlet-name>
          <url-pattern>/*</url-pattern>
      </servlet-mapping>
      
      <servlet-mapping>
          <servlet-name>jsp</servlet-name>
          <url-pattern>/WEB-INF/views/*</url-pattern>
       </servlet-mapping>
      
      <servlet-mapping>
          <servlet-name>jsp</servlet-name>
          <url-pattern>/WEB-INF/decorators/*</url-pattern>
      </servlet-mapping>
      

      在你的 dispatcher-servlet.xml 中输入这个

      <mvc:default-servlet-handler/>
      

      【讨论】:

        【解决方案7】:

        可以进行简单的检查。我目前正在使用 Spring MVC 架构和休眠。我错过了在类名上方编写@Controller 注释。这给我带来了问题。

        @Controller
        public class MyClass{
            ...
        }
        

        希望这个简单的检查能解决您的问题。

        【讨论】:

        • 这只对我有用......之后......我必须添加以下行:@RequestMapping(value = "/", method = RequestMethod.GET)
        • 这不是对此处提出的问题的回答,这是关于将响应重定向到 JSP 视图后生成的错误。如果这是问题所在,则不会发生重定向,错误消息中也不会引用 JSP 文件。
        【解决方案8】:

        使用 Spring 3.1 和 Tomcat 7 时出现下一个错误:

        org.springframework.web.servlet.DispatcherServlet noHandlerFound 在名称为“appServlet”的 DispatcherServlet 中未找到带有 URI [/baremvc/] 的 HTTP 请求的映射

        我需要在 web.xml 中添加下一个配置:

        <welcome-file-list>
            <welcome-file/>
        </welcome-file-list>
        

        应用程序工作正常!

        【讨论】:

        • 这不是对此处提出的问题的回答,这是关于将响应重定向到 JSP 视图后生成的错误。如果这是问题所在,则不会发生重定向,错误消息中也不会引用 JSP 文件。
        【解决方案9】:

        我有同样的问题,当然有一点不同。故事是当我删除以下行时:

        <mvc:resources mapping="/resources/**" location="classpath:/resources/" />
        

        一切正常,但在出现该行时会引发相同的错误。

        经过反复试验,我发现我必须将以下行添加到我的 spring 应用程序上下文文件中:

        <mvc:annotation-driven />
        

        希望对你有帮助!

        【讨论】:

          【解决方案10】:

          与 Brad Parks 的答案相同...不过更多文字

          我遇到了完全相同的问题,并尝试了上述解决方案以及许多其他解决方案,但结果都是负面的。我什至从一个全新的 Dev env 开始,只是安装了一个 spring-mvc-template 并尝试在安装后直接运行它(应该可以工作,但对我来说失败了)

          对我来说,问题是 我在项目中使用的是 jdk1.6,但我在 eclipse 中选择的执行环境是 jdk1.7。 解决方案是更改项目特定执行环境设置,以便将此项目设置为 jdk1.6。 右键项目-->属性-->Java编译器-->如果没有勾选“启用项目特定设置”->选择合适的jdk(或者如果没有安装就添加)。

          我希望这可以帮助某人并节省那些人的时间,因为过去几天我一直在互联网的每个角落寻找答案。当我开始绝望并在不太可能找到它(根据我的大脑)的区域寻找解决方案时,我自己偶然发现了它。 =)

          我的 2 美分。谢谢!

          Edit1:使用项目特定设置

          Edit2:刚刚意识到 Brad Parks 已经在这个帖子中回答了这个问题。好吧,至少我从这个中得到了“编辑”徽章=D

          【讨论】:

          • 7 年后仍然相关。干杯,你救了我的一天
          【解决方案11】:

          这也可能发生在您的应用实际上没有编译,但它仍然在 Tomcat 中启动时。当我看到这种情况发生时,它并没有编译,因为该项目指定了“项目特定”JDK,并且代码是在没有该特定 JDK 的机器上签出的。 Eclipse 默认使用 JRE,而不是 JDK,然后应用程序没有被编译。

          为了在我们的特定情况下修复它,我们只是在此处关闭了“项目特定设置”:

          “项目|属性|Java编译器”

          以下是有关如何执行此操作的更详细信息: https://stackoverflow.com/a/2540730/26510

          【讨论】:

          • 先生,你是救生员。
          【解决方案12】:

          不幸的是,这是一个相当广泛的类错误消息。另一件可能出错的事情是,如果你缺少一些类/jars。例如,如果您缺少 spring-expression jar 文件,那么无论您如何努力以及如何尝试,dispatch-servlet 都无法找到您的控制器正确配置其他所有内容。

          【讨论】:

          • 问题中的信息非常清楚地表明正在定位控制器,因为它包含一个显示控制器方法执行的日志,然后将重定向发送到 JSP 视图,因此这不是解决方案这个问题。
          【解决方案13】:

          我在 Eclipse Luna EE 中遇到过这个问题。我的解决方案是简单地重新启动 eclipse,它神奇地开始正确加载 servlet。

          【讨论】:

          • 最好清理项目并运行这是使应用程序不需要重新启动eclipse的方法。
          【解决方案14】:

          您需要有一个控制器,它首先响应 url,然后呈现您的 jsp。看到这个link for a solution

          【讨论】:

            【解决方案15】:

            "/openStudentPage" 是我要先打开的页面,我做到了:

             @RequestMapping(value = "/", method = RequestMethod.GET)
                public String index(Model model) {
                 return "redirect:/openStudentPage";
                }
            
            @RequestMapping(value = "/openStudentPage", method = RequestMethod.GET)
            public String listStudents(Model model) {
                model.addAttribute("student", new Student());
                model.addAttribute("listStudents", this.StudentService.listStudents());
                return "index";
            }
            

            【讨论】:

              【解决方案16】:

              将您的 servlet 名称调度程序更改为任何其他名称。因为调度程序是 spring3、spring4 版本的预定义名称。

              <servlet>
                  <servlet-name>ahok</servlet-name>
                  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                  <load-on-startup>1</load-on-startup>
              </servlet>
              <servlet-mapping>
                  <servlet-name>ashok</servlet-name>
                  <url-pattern>/</url-pattern>
              </servlet-mapping>
              

              【讨论】:

              • org.springframework.web.servlet.DispatcherServlet 是纯控制器,因此无需更改其他控制器。
              猜你喜欢
              • 2013-08-14
              • 2015-02-18
              • 1970-01-01
              • 2017-01-20
              • 1970-01-01
              • 2016-02-05
              • 2012-04-16
              相关资源
              最近更新 更多