springmvc 请求无法到达controller,出现404错误的原因

最近做springmvc+mybatis+maven项目集成的时候遇到一个问题,项目搭起来以后,http请求怎么都进不到controller中,耗费

了一天多时间弄这个问题,最后发现还是自己对spring的配置文件和各种注解不熟。其实这个问题就是由于注解没配好的缘故

首先,从配置文件讲起

web.xml

	<!-- 加载Spring配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
		classpath:spring-context*.xml
		</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 加载spring mvc -->
	<servlet>
		<servlet-name>spring3mvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>
			classpath:spring-mvc*.xml
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>spring3mvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

在上面的web.xml中,我们看到基于ContextLoaderListener和DispatcherServlet都可以配置spring相关的XML,两类XML的前缀分别以spring和springmvc开头,说明,基于ContextLoaderListener加载的XML配置,原则上是与spring容器相关的(也可以说是父容器);而基于DispatcherServlet加载的XML配置,原则上是与springmvc容器相关的(相当于子容器)。

父容器加载的配置文件默认地址为:/WEB-INF/applicationContext.xml,它默认以applicationContext命名,说明它是spring的全局的配置,如果你项目中此文件名和地址都没有改,那么在web.xml中可以不用配置,spring容器会自动到默认地址下去加载。

子容器的配置文件命名默认为[servlet-name]-servlet.xml方式,也就是说servlet-name中如果没有指定init-param属性,系统自动寻找的配置文件为[servlet-name]-servlet.xml,默认路径也是WEB-INF下。

所以个人建议,基于mvc相关的spring配置由DispatcherServlet加载,而其余的JavaBean都交给ContextLoaderListener加载。

值得说明的是这两种方式加载spring的ApplicationContext上下文对象不是合并存储的。mvc
context可以引用applicationContext的bean,而applicationContext无法引用到mvc的bean,spring查找bean,会先在当前context中查找,如果没有满足的,再到父容器查找。而且两个context中可以存在相同的bean定义的,只不过优先查找当前context。并且各context上下文中的声明式标签相互不起作用。也就是说,如果你在applicationContext.xml中声明的<mvc:annotation-driven
/> ,在mvc的context中是不起作用的。

说了这么多,其实我项目中的错误原因也就找到了,我的问题在于,我将<mvc:annotation-driven
/>声明在了application上下文的配置中,从而导致mvc的context 中声明的<context:component-scan base-package="com.hq51.business.controller" /> 不起作用,项目也就无法识别和加载controller了,所以会出现需要controller处理的http请求,最后都是莫名其妙的404错误。

时间: 2024-10-24 11:21:28

springmvc 请求无法到达controller,出现404错误的原因的相关文章

注解WebServlet配置Servlet报404错误的原因

使用注解WebServlet配置Servlet报404错误的原因 Servlet3.0之后新增了注解,用于简化Servlet.Filter及Listener的声明,这样就在配置Servlet的时候多了一个选择.Servlet3.0的部署描述文件web.xml的顶层标签<web-app>有一个metadata-complete属性,该属性为true,则容器在部署时只依赖部署描述文件,忽略所有标注,如果不配置该属性,或者将其设置为false,则表示启动标注支持.当metadata-complete

ajax调取springmvc controller报404错误及表格提交

今天遇到一个很奇怪的问题,前台ajax中写的url地址明明与controller requestmapping地址匹配,但一直报404的错.后来和其他的方法一比对,发现是没有加@ResponseBody注解.加上之后就正常了. @ResponseBody注解的意思是直接输出,所以我一直以为只和输出内容有关,总觉得应该是先匹配地址,然后匹配对了,执行方法再输出内容,看来不是如此. 另外记下提交前台表格的两种方法: ① $.ajax({ url:"your_url", data:$(&qu

myeclipse2017maven Web项目测试controller时报404错误

问题描述: 这是我自己基于SSM框架搭建的一个Maven Web项目,前面一切顺利,单元测试这些都通过了,就是访问不到controller,直接改为访问jsp也不行,页面一直显示404,后来也是百度了好久才找到一个和我问题相同的同志,我们都是需要改WEB.XML的对应的工程名.点击工程右键-->properties-->找到Project Facets-->找到Web Context Root->点击config...,如下图 原文地址:https://www.cnblogs.co

解决Web IIS部署 svg/woff/woff2字体 404错误

问题:最近在IIS上部署web项目的时候,发现一些字体图标等无法正常显示,经查是浏览器无法找到woff.woff2字体的对应文件,报404错误. 原因:因为服务器IIS默认没有全部添加.svg,.woff/.woff2 这几个文件类型,只要在IIS上添加MIME 类型即可. 解决方法 1.打开服务器IIS管理器,找到MIME类型. 2.添加MIME类型 添加三条: 文件扩展名      MIME类型 .svg             image/svg+xml.woff            a

当CodeIgniter遇到Nginx报404错误的解决办法

由于CodeIgniter当初是设计在apache的,而apache对pathinfo是支持比较好的,所以一切都很nice.但是当你把写好的代码放到nginx上,傻眼了,可能出了CodeIgniter的welcom之外,其他都是404错误.而我惊奇的发现,CodeIgniter的官方文档竟然对在Nginx上的配置只字不提.而你百度"CodeIgniter Nginx 404"又能搜到一堆一堆的文章,奇葩的是几乎每个文档的配置方法貌似还不大一样.如果你搞好了还罢,搞不好就是配几个晚上都搞

Springmvc 访问页面出现404错误

配置springmvc时出错: 我在web.xml中添加 <!-- springMvc配置 --> <servlet> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- springMvc-XML配置文件 --> <in

&lt;mvc:default-servlet-handler/&gt;导致controller失效,报404错误

最近在做ssm框架整合的一个小项目时,页面跳转一直有404错误,也没有报错提示.然后一步一步去找,终于发现是<mvc:default-servlet-handler/>的原因. 如上图所示,如果springmvc的配置文件这样写的话会报错. <mvc:default-servlet-handler/>这一行代码的意思是使用默认的Servlet来响应静态文件,因为在web.xml中使用了DispatcherServlet截获所有请求的url,包括jsp页面的关于js,css等引入.由

大家来找茬-SpringMVC中Tomcat正常启动,始终访问不了Controller,出404错

创建了一个空的SpringMVC项目,Tomcat可以正常启动,但是运行的时候,始终进不了Controller,并且报404错误. 百度各种查,结果也是查不到原因.各个群里面各种求,各种贴源码,也没有大神给解决.花了整整一天也没有搞出来,就在快要崩溃的时候,必应了一下子, 终于功夫不负有心人,在一篇文章的评论中找到了答案. 大家如有有闲工夫,可以来找找茬. 源码如下: web.xml <?xml version="1.0" encoding="UTF-8"?&

springMVC 请求404异常或静态资源无法访问

springMVC 请求404错误或静态资源无法访问问题:springMVC 请求404错误或静态资源无法访问. 在web.xml中我们一般这样配置: spring3 org.springframework.web.servlet.DispatcherServlet 1 spring3 / 使用 / 可以实现rest风格,但是会拦截了所有的请求导致静态资源无法访问(解决方法后面说), 当然,如果你使用*.do.*.xhtml等就不会出现静态资源无法访问问题. 静态资源无法访问解决方案: 1,在s