92

我的处理程序转发到 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 DEBUG [org.springframework.web.servlet.DispatcherServlet]中找不到处理程序- DispatcherServlet 名称为 'testapp2' 处理请求 [/WEB-INF/pages/apiForm.jsp]
13:45:02,038警告 [org.springframework.web.servlet.PageNotFound] - 在 DispatcherServlet 中找不到带有 URI [/WEB-INF/pages/apiForm.jsp] 的 HTTP 请求的映射,名称为 '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>
4

16 回答 16

155

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

你可能有这样的事情?

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

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

 <servlet-mapping>
  <servlet>dispatcher</servlet>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>
于 2009-08-12T14:54:35.560 回答
91

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

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>
于 2010-05-27T17:49:39.240 回答
19

只需添加<mvc:default-servlet-handler />到您的 DispatcherServlet 配置中,您就完成了!

于 2014-09-21T06:35:23.847 回答
13

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

如果您扫描了错误的包裹

例如,您的控制器在my.package.abc中 ,但您错误地将

<context:component-scan base-package="my.package.efg*" />

或者

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

从某种意义上说,您的控制器不会被扫描到 Web 应用程序上下文中,当请求不仅来自 url,而且找不到整个类时!

于 2016-05-30T01:25:13.183 回答
9

Solution that helped me is: do not map DispatcherServlet to /*, map it to /. Final config is then:

<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>
于 2014-05-23T23:50:57.503 回答
9

我想我阅读了整个互联网,以弄清楚如何让 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/>
于 2013-06-10T21:46:27.313 回答
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>

该应用程序有效!

于 2012-04-12T08:07:25.960 回答
8

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

@Controller
public class MyClass{
    ...
}

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

于 2012-11-29T06:55:54.110 回答
3

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

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

一切都很好,但是在存在该行的情况下,会出现相同的错误。

经过一些试验和错误后,我发现我必须将以下行添加到我的 spring 应用程序上下文文件中:

<mvc:annotation-driven />

希望能帮助到你!

于 2016-05-25T03:46:46.337 回答
2

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

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

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

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

我的 2 美分。谢谢!

Edit1:使用项目特定设置

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

于 2013-03-17T17:15:43.267 回答
2

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

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

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

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

于 2012-03-16T12:44:33.723 回答
1

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

于 2013-05-31T20:45:19.207 回答
1

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

于 2015-07-02T10:31:14.280 回答
0

“/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";
}
于 2015-01-22T10:46:07.940 回答
0

您需要的是有一个控制器首先响应 url,然后呈现您的 jsp。请参阅此链接以获取解决方案

于 2009-08-12T15:02:15.763 回答
-4

将您的 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>
于 2014-07-19T12:40:48.340 回答