找不到带URI的HTTP请求的映射[/WEB-INF/pages/apiForm.jsp]

时间:2009-08-12 13:54:51

标签: spring spring-mvc servlet-dispatching

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

  

13:45:02,034 DEBUG [org.springframework.web.servlet.view.JstlView] -   在InternalResourceView'apiForm'中转发资源[/WEB-INF/pages/apiForm.jsp]     13:45:02,035 DEBUG [org.springframework.web.servlet.DispatcherServlet] -   名为“testapp2”的DispatcherServlet确定[/WEB-INF/pages/apiForm.jsp]的Last-Modified值
   13:45:02,038 DEBUG [org.springframework.web.servlet.DispatcherServlet] - 找不到处理程序   在getLastModified中    13:45:02,038 DEBUG [org.springframework.web.servlet.DispatcherServlet] -   DispatcherServlet,名称为'testapp2'处理请求   [/WEB-INF/pages/apiForm.jsp]
   13:45:02,038 WARN [org.springframework.web.servlet.PageNotFound] - 找不到映射   名为“testapp2”的DispatcherServlet中带有URI [/WEB-INF/pages/apiForm.jsp]的HTTP请求
   13:45:02,045 DEBUG [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>

16 个答案:

答案 0 :(得分: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>

答案 1 :(得分:90)

是的,我知道我参加这个派对已经迟到了,但它可能对其他人有所帮助。

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>

答案 2 :(得分:17)

只需将<mvc:default-servlet-handler />添加到DispatcherServlet配置中即可完成!

答案 3 :(得分: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应用程序上下文中 不仅仅是网址,还没找到全班!

答案 4 :(得分: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/>

答案 5 :(得分:9)

帮助我的解决方案是:不要将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 :(得分: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>

申请工作正常!

答案 7 :(得分:8)

可以进行简单的检查。我目前正在使用Spring MVC架构和hibernate。我错过了在类名之上编写@Controller注释。这对我来说是个问题。

@Controller
public class MyClass{
    ...
}

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

答案 8 :(得分:3)

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

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

一切都很好但是在那条线的存在下会出现同样的错误。

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

<mvc:annotation-driven />

希望它有所帮助!

答案 9 :(得分:1)

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

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

“Project | Properties | Java Compiler”

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

答案 10 :(得分:1)

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

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

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

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

我的2美分。谢谢!

Edit1:使用项目特定设置

Edit2:刚刚意识到布拉德·帕克斯已经在这个线程中回答了这个问题。好吧,至少我得到了“编辑”-badge这一个= D

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

答案 13 :(得分:0)

你需要的是让一个控制器首先响应url然后呈现你的jsp。请参阅此link for a solution

答案 14 :(得分:0)

&#34; / openStudentPage&#34;是我想先打开的页面,我做了:

 @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";
}

答案 15 :(得分:-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>