springMVC中default-servlet-handler的作用

本文介绍如何使用 Spring MVC 中的 <mvc:default-servlet-handler/> 处理静态资源,避免 DispatcherServlet 对静态文件的不当处理导致页面样式丢失。通过两种配置方法实现静态资源的正确加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   <mvc:default-servlet-handler/> 这个springMVC xml文件的属性,主要是处理web项目的静态文件问题。
使用springMVC进行web项目开发的时候,通常在web.xml文件中会做如下的配置:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-dispatcher.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

然后进行springMVC的各项配置以后,启动项目,在浏览器中输入地址后出现如下问题



正常的页面显示成这样,所有的静态js,css图片等都被DispatcherServlet处理后,页面的样式没了。

  针对这个问题<mvc:default-servlet-handler/>这个标签可以帮我们解决这一问题,在springMVC的配置文件中配置了改xml标签属性相当于在dispatcherServlet处理链上串联了一个java:org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler静态资源处理类,每次请求过来,先经过DefaultServletHttpRequestHandler判断是否是静态文件,如果是静态文件,则进行处理,不是则放行交由DispatcherServlet控制器处理。 

  在springMVC配置文件中配置如下:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:task="http://www.springframework.org/schema/task"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-4.0.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
		http://www.springframework.org/schema/task
   		http://www.springframework.org/schema/task/spring-task-4.0.xsd
		http://code.alibabatech.com/schema/dubbo        
		http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
         <!-- 静态资源处理servlet配置 -->
	<mvc:default-servlet-handler/>
	<mvc:annotation-driven/>
  	
</beans>
 在springMVC配置文件中进行上述配置后,页面显示正常。

  配置方式二:

   通过程序进行配置 

@Configuration
@EnableWebMvc
public classWebConfig extendsWebMvcConfigurerAdapter {
@Override
public voidconfigureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
 //myCustomDefaultServlet这个是在spring中配置的servletBean的名字
  configurer.enable("myCustomDefaultServlet");
}
}
     上面的这两种配置方式只是在DispatcherServlet的请求处理路径为“/”的情况下使用,如果你配置的是*.do或*.pay等方式则不需要上面这样的配置,因为*.do或*.pay只处理以它结尾的请求,对静态资源文件不会做任何处理。



<think>我们正在讨论SpringMVC6的配置,特别是<servlet-class>的用法。根据SpringMVC的传统配置方式,在web.xml中我们会配置DispatcherServlet,并指定其servlet-class为org.springframework.web.servlet.DispatcherServlet。然而,在SpringMVC6(与SpringFramework6.x和SpringBoot3.x对应)中,由于支持Servlet容器5.0+,并且更加倾向于使用Java配置而非XML配置,因此配置方式可能有所变化。用户引用了之前的一些配置,但那些是针对较早版本的SpringMVC。在SpringMVC6中,通常我们不会直接编辑web.xml,因为SpringBoot已经极大地简化了配置过程。但是,如果用户仍然需要在非SpringBoot环境下使用SpringMVC6(即传统的Servlet容器部署方式),那么仍然会使用web.xml。根据SpringMVC6的文档,DispatcherServlet的类名仍然是org.springframework.web.servlet.DispatcherServlet,因此<servlet-class>的配置应该没有变化。但是,需要注意的是,SpringFramework6要求最低Java17和ServletAPI5.0或更高版本。另外,在SpringBoot中,我们通常不需要配置web.xml,而是通过Java配置类来配置DispatcherServlet。所以,根据用户的需求,我们有两种情况:1.传统方式(使用web.xml):在web.xml中,配置DispatcherServlet时,指定<servlet-class>为org.springframework.web.servlet.DispatcherServlet。2.SpringBoot方式(无web.xml):使用SpringBoot时,DispatcherServlet是自动注册的,我们不需要手动配置<servlet-class>。用户的问题是:“SpringMVC6servlet-class配置和用法”,所以我们需要提供两种方式,但特别指出在SpringMVC6中推荐的方式是使用SpringBoot,而传统的web.xml方式依然可用。然而,注意用户引用的资料中提到了<mvc:default-servlet-handler>,这通常是在SpringMVC的配置文件中,用于配置静态资源的处理。在SpringMVC6中,这些配置通常使用Java配置类。因此,我们可以这样回答:在SpringMVC6中,配置DispatcherServlet有两种主要方式:###1.使用传统的web.xml方式(适用于非SpringBoot项目):在web.xml中配置DispatcherServlet,指定servlet-class为`org.springframework.web.servlet.DispatcherServlet`,同时可以通过初始化参数指定Spring配置文件的位置。示例:```xml<servlet><servlet-name>mvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>mvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>```###2.使用SpringBoot方式(推荐):在SpringBoot项目中,DispatcherServlet会自动注册,无需手动配置。我们只需要通过注解`@SpringBootApplication`来启动应用程序。如果需要自定义DispatcherServlet的注册,可以通过在配置类中注册一个`DispatcherServletRegistrationBean`类型的Bean来实现。例如:```java@BeanpublicDispatcherServletRegistrationBeandispatcherServletRegistration(){DispatcherServletRegistrationBeanregistration=newDispatcherServletRegistrationBean();registration.setServlet(dispatcherServlet());//这里需要预先定义DispatcherServlet的Bean,但通常SpringBoot会自动配置registration.addUrlMappings("/");registration.setLoadOnStartup(1);returnregistration;}```然而,在SpringBoot中,通常不需要这样做,因为自动配置已经提供了默认值。###关于<mvc:default-servlet-handler>用户引用中提到了`<mvc:default-servlet-handler>`,在SpringMVC6中,如果使用XML配置,依然可以使用。但是在Java配置中,我们可以通过重写`WebMvcConfigurer`接口的`configureDefaultServletHandling`方法来达到相同效果:```java@Configuration@EnableWebMvcpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidconfigureDefaultServletHandling(DefaultServletHandlerConfigurerconfigurer){configurer.enable();}}```总结:-SpringMVC6中,`<servlet-class>`的用法和之前版本一样,仍然是`org.springframework.web.servlet.DispatcherServlet`,但主要用在web.xml配置中。-对于SpringBoot项目,我们通常不直接配置`<servlet-class>`,而是通过自动配置或Java配置类来间接管理。另外需要提醒的是,SpringMVC6(SpringFramework6)要求使用Java17+和ServletAPI5.0+。§§相关问题§§1.在SpringMVC6中,如何配置多个DispatcherServlet?2.SpringMVC6中如何完全使用Java配置替代web.xml?3.在SpringBoot3(对应SpringMVC6)中,如何自定义DispatcherServlet的配置?</think> ### Spring MVC 6 中 `<servlet-class>` 的配置与用法 在 Spring MVC 6(对应 Spring Framework 6.x)中,`<servlet-class>` 的配置遵循与早期版本相似的模式,但需注意以下关键点: #### 1. **基础配置方式** 在 `web.xml` 中配置 `DispatcherServlet`,`<servlet-class>` 的值仍为 **`org.springframework.web.servlet.DispatcherServlet`**: ```xml <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` - **作用**:声明 Spring MVC 的**前端控制器**,拦截所有请求(`/`)[^1]。 - **变化点**:Spring MVC 6 要求使用 **Servlet API 6.0+**(Jakarta EE 10),需确保依赖库兼容性。 #### 2. **Java 配置替代方案(推荐)** Spring MVC 6 **推荐使用 Java 配置**取代 `web.xml`: ```java public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { RootConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] { MvcConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } } ``` - **核心优势**:无需手动定义 `<servlet-class>`,框架自动注册 `DispatcherServlet`[^2]。 - **初始化逻辑**:通过继承 `AbstractAnnotationConfigDispatcherServletInitializer` 实现零 XML 配置。 #### 3. **Servlet 容器的启动流程** 当容器初始化时: 1. 自动检测 `AbstractAnnotationConfigDispatcherServletInitializer` 的实现类 2. 创建 `DispatcherServlet` 实例并加载 `@Configuration` 类 3. 等价于隐式声明了: ```xml <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> ``` #### 4. **与传统配置的对比** | 特性 | XML 配置 (`web.xml`) | Java 配置 (Spring MVC 6) | |---------------------|-----------------------------|-----------------------------------| | `<servlet-class>` | 需显式声明 | 框架自动注册 | | 配置文件加载方式 | 通过 `<init-param>` 指定 | 重写 `getServletConfigClasses()` | | 兼容性 | Tomcat 10+/Jetty 12+ | 仅支持 Jakarta EE 10+ 容器 | ### 使用建议 1. **新项目首选 Java 配置**:完全避免 `web.xml` 配置。 2. **迁移项目保留 XML**:若需兼容旧版,可保留 `web.xml`,但需更新至 Servlet 6.0。 3. **验证依赖**:确保使用 `spring-webmvc:6.x` 和 `jakarta.servlet-api:6.0`。 > ⚠️ **注意**:Spring MVC 6 不再支持 `javax.*` 命名空间,需统一使用 `jakarta.*` 包名。若使用 `<servlet-class>` 出现 `ClassNotFoundException`,请检查依赖是否包含 Jakarta EE 10+ 的 Servlet API。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值