微信优化

weixinyouhua

SpringMVC配置文件怎么配置?springmvc配置文件详解与核心配置

2026-09-11 15:22:52

Spring MVC 的配置文件核心是 spring-mvc.xml,它负责开启注解驱动、组件扫描、视图解析器等一系列Web层能力,是SSM项目与Spring Boot之前转型绕不开的关键关卡。 很多新手在搭建SSM项目时,明明代码看着没问题,但一启动就报404或者500,问题八成就出在这个XML文件上,今天这篇内容,不扯虚的,直接把这个文件从里到外拆开揉碎,让你看完能对着自己的项目改,改完能跑通。

springmvc配置文件放哪里最稳妥?项目结构决定你的写法

聊配置文件之前,得先确认它在项目里的物理位置,这直接影响你引用classpath路径时会不会写错,在传统的Maven Web项目里,绝大多数情况下的标准答案是放在 src/main/resources 目录下,但这里有个坑,很多同学用的是Eclipse或者IDEA的自动生成功能,文件跑到了 src/main/webapp/WEB-INF 下面。

这两个位置有什么本质区别?简单说,在resources目录下,配置文件会被Maven打包进classes目录,也就是classpath根路径下,如果你放在WEB-INF下,虽然也能被ClassPathXmlApplicationContext扫到,但容易和DispatcherServlet的初始化参数搞混。

实际开发中,我建议你按这个路径放:

  • 文件路径:src/main/resources/spring/spring-mvc.xml
  • 或者单文件:src/main/resources/spring-mvc.xml

然后在你放Spring配置的地方注册它,如果是纯XML项目,在web.xml里用context-param指定;如果用了注解配置类,就用@ImportResource({"classpath:spring-mvc.xml"})引入,记住一个原则:项目里路径越清晰,后期维护越省心

springmvc xml配置详解:六个核心标签搞定九成业务

这个文件本质上是Spring IoC容器的一个特殊分支,专门管理Controller、HandlerMapping、ViewResolver这些Web组件,别被那一堆繁琐的schema吓到,真正天天用的核心标签不超过六个。

组件扫描要用排除策略,别把Service也扫进来

新手最容易犯的错,就是把整个com.example包都扫了,这会让Service和Dao也注册到SpringMVC子容器里,导致事务失效,因为父子容器对代理对象的处理方式不一样。

正确姿势是面向Controller层扫描

<context:component-scan base-package="com.example.controller">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

这里有个细节:use-default-filters属性默认是true,你需要显式设置为false,否则include-filter不生效,业内专家指出,超过半数的SSM整合报错都源于组件扫描范围失控。

注解驱动开启后,你才能偷懒用@GetMapping

<mvc:annotation-driven/>这行代码,是SpringMVC 3.1以后的新功能核心,它帮你注册了RequestMappingHandlerMapping和RequestMappingHandlerAdapter,少了它,你写的

SpringMVC配置文件怎么配置?springmvc配置文件详解与核心配置

@RequestMapping注解根本不会被识别,Tomcat会直接给你返回404。

这个东西在Spring 5和Spring 6里表现有些微差异,但核心逻辑一致,统计下来,初学阶段遇到的“方法报405”或者“参数绑定不上”,多半跟它有关。

视图解析器:前后缀配置决定返回字符串去哪找页面

InternalResourceViewResolver是使用频率最高的视图解析器,它的工作逻辑很直白:拼接你Controller返回的字符串,加上前缀和后缀,去webapp目录下找物理JSP文件。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

当你Controller里return "user/list"时,它实际找的是/WEB-INF/jsp/user/list.jsp,这个过程中,重点在于Controller返回的是逻辑视图名,不是物理路径,只要你遵循这个规则,前端页面怎么挪目录,后端代码完全不用动。

静态资源放行:不然你的CSS和JS全被DispatcherServlet拦走

SpringMVC默认会拦截所有请求,包括/css/style.css/js/app.js,你可以用<mvc:default-servlet-handler/>把静态资源交回Tomcat默认的DefaultServlet处理,或者更精准地用<mvc:resources>映射:

<mvc:resources mapping="/static/" location="/static/"/>

这两种方式区别在于,default-servlet-handler会匹配所有没被Controller处理的路径,resources适合指定特定目录,常规项目里用第二种更多,因为明确指向静态资源目录,不会和其他映射冲突。

拦截器链:登录校验和跨域处理都在这里规划

拦截器是SpringMVC里最具可操作性的扩展点。<mvc:interceptors>可以配多个<mvc:interceptor>,通过<mvc:mapping path="/"/>指定拦截范围,用<mvc:exclude-mapping>放行登录页和注册接口。

比如你写一个LoginInterceptor,不用在Java代码里硬编码放行路径,全部在XML里管理,这个设计非常适合权限规则频繁变动的项目,改配置文件比改Java代码再重新编译要快得多,也让非开发同学能参与简单维护。

文件上传解析器:id必须是multipartResolver

用SpringMVC做文件上传,在XML里配置一个CommonsMultipartResolver是标准操作,有两点必须注意:bean的id必须叫multipartResolver,不然DispatcherServlet找不到它;其次encoding必须和页面表单保持一致。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="UTF-8"/>
    <property name="maxUploadSize" value="10485760"/>
</bean>

maxUploadSize单位是字节,上面这个是10MB,实际生产环境根据业务调整,这里要提一口,Spring 6已经把这个类标记为过时,如果用的是Spring Boot 3架构,建议用

SpringMVC配置文件怎么配置?springmvc配置文件详解与核心配置

StandardServletMultipartResolver

springmvc配置文件有哪些常见疑难?这些场景你迟早遇到

前面聊的是标准配置,但真实的开发环境里,配置文件的问题往往不是不会写,而是写完了不知道错在哪,这里挑几个高频场景,专门解决你排错难的问题。

配置文件里的路径写法,决定你项目能不能打包成功

很多人在本地跑得好好的,一打war包丢到服务器上就全部漂红,多半是路径写法问题,在XML里引用外部properties文件时,用classpath:开头最安全:

<context:property-placeholder location="classpath:jdbc.properties"/>

如果项目有多个模块,properties文件在别的jar包里,可以用classpath:前缀,千万别写相对路径,那种依赖当前工作目录的写法,在Tomcat作为服务启动时绝对会让你头疼。

SSM整合时,Spring容器和SpringMVC容器怎么分工

SSM项目里,通常会有applicationContext.xmlspring-mvc.xml两个文件,两者的职责边界是行业共识:Spring配置文件管理Service、Dao、事务、数据源;SpringMVC配置文件只管理Controller、视图解析器、拦截器

你在spring-mvc.xml里引入<import resource="classpath:spring-mybatis.xml"/>是可以的,但更推荐在web.xml里配置同一个context-param,这样加载顺序可控,也不会出现重复创建Bean的问题,记得让web.xml里的DispatcherServlet和ContextLoaderListener都指向同一个applicationContext.xml,才能避免双容器冲突。

配置文件不生效,检查项目构建是不是把这个地方忽略了

如果你用的Maven,pom.xml里<build>节点如果不做资源插件配置,XML文件放在src/main/java目录下就不会被编译到classes里,虽然这是一个maven配置问题,但它常常被误判为SpringMVC配置问题,建议所有配置文件统一放resources目录,这是最干净安全的路径,也能避免后续接手的人产生困惑。

一个能直接用的springmvc配置文件模板

看了这么多理论,不如直接给一个实战模板,这个模板适用于Spring 5版本,涵盖大多数互联网企业项目的常规需求,你只需要根据自己的包名改一下base-package,就可以直接套用。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/mvc
   

SpringMVC配置文件怎么配置?springmvc配置文件详解与核心配置

http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.example.controller" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <mvc:annotation-driven/> <mvc:resources mapping="/static/" location="/static/"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>

这个模板省略了拦截器和上传解析器,用的时候按需往里加。配置的原则是“最小必备”,不要一股脑把能想到的都堆进去,不然排查问题会很痛苦,需要用到什么再加什么,保持配置文件的干净,比什么都强。

springmvc配置文件要写对,核心结论重述

SpringMVC的配置文件,核心意义在于把Web层组件从Java代码中解耦出来,交给容器管理,你看到的那些标签和bean定义,本质上都在描述“控制器如何被发现、请求如何被处理、视图如何被渲染”这三件事,搞清楚这个逻辑,配置文件在你眼里就不是一堆烦人的尖括号,而是有条理的构建说明书,无论是从零搭建SSM,还是接手老项目维护,抓住扫描、注解驱动、视图解析器这三个核心模块,整体结构就不容易跑偏。

springmvc配置文件常见问题解答

问题:springmvc配置文件里的controller扫描包路径写错了,启动会不会报错?

不会报错,但请求会全部404,容器启动时只会按路径扫描注册bean,路径不存在也只会记录一条debug级别日志,绝大多数情况下不会中断启动,排查时先看启动日志里有没有RequestMappingHandlerMapping的成功信息,再确认控制器类是否被扫描到。

问题:为什么我已经把springmvc配置写在applicationContext.xml里,Controller就是不生效?

因为DispatcherServlet默认会加载/WEB-INF/spring-mvc.xml这个特定名字的文件,如果你想共用applicationContext.xml,要么在web.xml里显式配置contextConfigLocation参数指向它,要么在spring-mvc.xml里用<import>引入公共配置,顺带一提,SpringMVC的配置类也可以用来替代XML完成同样功能,但初学阶段把XML练扎实,能让你对容器初始化流程有更具体的感觉。

问题:springmvc配置文件里可以定义普通的Service和Dao吗?

可以定义,但通常不建议这样设计,SpringMVC子容器会先查找父容器中的bean,如果你在子容器里定义了同样的类,可能会覆盖父容器的定义,导致事务代理失效和依赖注入混乱,Controller应该在MVC容器中,Service和Dao应该在Spring容器中,这是行业共识,在实际项目中,我发现严格遵守这个分层原则能减少很多隐性Bug,尤其是在多人协作时,各层的职责边界越清晰,别人接手你的代码就越容易理解。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待