<mvc:default-servlet-handler/> 这个Spring MVC xml文件的属性,主要是处理web项目的静态文件问题。

每次请求过来,先经过 DefaultServletHttpRequestHandler 判断是否是静态文件,如果是静态文件,则进行处理,不是则放行交由 DispatcherServlet 控制器处理。

    /*
*开启对静态资源的访问
* 类似在Spring MVC的配置文件中设置<mvc:default-servlet-handler/>元素
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable();
}

可以通过自定义一个WebMvcConfigurer类型的bean,改写configureDefaultServletHandling 方法,如下。

@Configuration
public class MyWebConfigurer extends WebMvcConfigurerAdapter {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}

这样就设置了一个默认的servlet,在加载静态资源的时候就会按照servlet方式去加载了。

Spring MVC<mvc:default-servlet-handler />的需求是什么?

使用此 handler 调度程序会将所有请求转发到默认的Servlet.要启用该功能,您可以使用注释或基于xml的配置.

======================================

What is the DefaultServlet
    The default servlet is the servlet which serves static resources as well as serves the directory listings (if directory listings are enabled).

public class DefaultServletHandlerConfigurer extends Object

Configures a request handler for serving static resources by forwarding the request to the Servlet container's "default" Servlet. This is intended to be used when the Spring MVC DispatcherServlet is mapped to "/" thus overriding the Servlet container's default handling of static resources.

Since this handler is configured at the lowest precedence, effectively it allows all other handler mappings to handle the request, and if none of them do, this handler can forward it to the "default" Servlet.

REF

https://tomcat.apache.org/tomcat-7.0-doc/default-servlet.html#what

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.html

REF

https://blog.csdn.net/zhengyangzkr/article/details/70174296

https://vimsky.com/zh-tw/examples/detail/java-method-org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.enable.html

https://www.cnblogs.com/hujunzheng/p/9682960.html

======================================

下面完整示例来自 https://geek-docs.com/spring/spring-tutorials/defaultservlet.html

DefaultServlet

DefaultServlet 是大多数 Web 应用的默认资源服务 Servlet,用于提供 HTML 页面和图像等静态资源。

DefaultServletHttpRequestHandler 尝试在启动时自动检测容器的默认 Servlet,例如 Tomcat,Jetty,Wildfly 和 Resin。 如果默认 Servlet 是使用其他名称自定义配置的,则必须明确提供默认 Servlet 的名称。

如果我们重写DefaultServlet's路由(/),则可以使用 DefaultServletHandlerConfigurer's enable() 方法启用它,以便我们仍然可以使用容器的默认 Servlet 提供静态资源。

Spring DefaultServlet示例

在以下应用中,我们将 Spring 调度程序 servlet 配置为 / 路径,该路径将重写默认 servlet 的路径。 我们使用 DefaultServletHandlerConfigurer 启用默认 servlet。

该应用提供一个简单的 HTML 主页,这是一个静态资源。

这是项目结构

pom.xml
src
├───main
│ ├───java
│ │ └───com
│ │ └───zetcode
│ │ └───config
│ │ MyWebInitializer.java
│ │ WebConfig.java
│ ├───resources
│ │ logback.xml
│ └───webapp
│ index.html
└───test
└───java

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId>
<artifactId>defaultservletex</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties> <dependencies> <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency> <dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency> </dependencies> <build>
<plugins> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin> </plugins>
</build> </project>

这是 Maven 构建文件。 我们具有以下依赖性:用于 Java Servlet 技术的 javax.servlet-api,用于日志记录的 logback-classic 和用于创建 Spring Web MVC 应用的 spring-webmvc。

maven-war-plugin 创建 Web 存档(WAR)。

com/zetcode/config/MyWebInitializer.java

package com.zetcode.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyWebInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer { @Override
protected Class<?>[] getRootConfigClasses() {
return null;
} @Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
} @Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}

MyWebInitializer 初始化 Spring Web 应用。

@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}

我们将 Spring DispatcherServlet 注册到 / 路径。 这代替了 DefaultServlet ; 因此,我们必须在配置文件中注册一个默认的 servlet 处理程序。

com/zetcode/config/WebConfig.java

package com.zetcode.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer { @Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}

WebConfig 通过 @EnableWebMvc 启用 Spring MVC,并通过 DefaultServletHandlerConfigurer's enable() 方法配置 DefaultServlet。

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

configureDefaultServletHandling()使用 URL 映射 /** 和相对于其他 URL 映射的最低优先级来配置 DefaultServletHttpRequestHandler。 这样,静态资源请求由容器的默认 Servlet 处理。

webapp/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home page</title>
</head>
<body>
<p>
This is home page.
</p>
</body>
</html>

这是主页。 它是静态资源,由 DefaultServlet 自动提供服务。

======================================

Spring MVC ServletMappings 路径匹配原理(截取匹配)
通常情况下,大家配置 spring mvc的路径拦截(ServletMapping)都习惯配置 “/”,但在某些特殊场景下,你可能希望所有的mvc的路径都有个固定的前缀,形如“/springmvc/*”,如果你在springmvc的ServletMapping中配置了这种路径,那么你的URL访问地址和controller的path就要注意了:如果你的地址栏URL为"/springmvc/user",那么你的controller中的path就必须配置"/user",因为spring mvc拦截了所有以“/springmvc”为前缀的请求,而在匹配的时候也截掉了“/springmvc”,用剩下的“/user”匹配controller。

https://blog.csdn.net/renchenglin118/article/details/93207031

======================================

Spring MVC 中 DefaultServletHandlerConfigurer的更多相关文章

  1. Spring mvc中@RequestMapping 6个基本用法

    Spring mvc中@RequestMapping 6个基本用法 spring mvc中的@RequestMapping的用法.  1)最基本的,方法级别上应用,例如: Java代码 @Reques ...

  2. spring mvc中使用freemark的一点心得

    参考文档: FreeMarker标签与使用 连接http://blog.csdn.net/nengyu/article/details/6829244 freemarker学习笔记--指令参考: ht ...

  3. Http请求中Content-Type讲解以及在Spring MVC中的应用

    引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...

  4. Spring mvc中@RequestMapping 6个基本用法小结(转载)

    小结下spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: @RequestMapping(value="/departments" ...

  5. Spring MVC中处理静态资源的多种方法

    处理静态资源,我想这可能是框架搭建完成之后Web开发的”头等大事“了. 因为一个网站的显示肯定会依赖各种资源:脚本.图片等,那么问题来了,如何在页面中请求这些静态资源呢? 还记得Spring MVC中 ...

  6. Spring MVC 中的基于注解的 Controller【转】

    原文地址:http://my.oschina.net/abian/blog/128028 终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 H ...

  7. spring mvc中的文件上传

    使用commons-fileupload上传文件所需要的架包有:commons-fileupload 和common-io两个架包支持,可以到Apache官网下砸. 在配置文件spring-mvc.x ...

  8. spring mvc中的valid

    当你希望在spring mvc中直接校验表单参数时,你可以采用如下操作: 声明Validator的方式: 1.为每一个Controller声明一个Validator @Controller publi ...

  9. spring mvc中的@PathVariable(转)

    鸣谢:http://jackyrong.iteye.com/blog/2059307 ------------------------------------------------ spring m ...

  10. Spring MVC中基于注解的 Controller

         终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...

随机推荐

  1. 墨天轮访谈 | 阿里云捷熙:AnalyticDB,人人可用的数据分析服务

    分享嘉宾:李婧玮(捷熙) 阿里云数据库资深产品经理 整理:墨天轮社区 导读 大家好,我是来自阿里云的捷熙.AnalyticDB是融合数据库.大数据技术于一体的云原生企业级数据仓库平台,今天我为大家带来 ...

  2. 基于腾讯云短信接口和nodejs服务器实现手机号验证码

    知识储备:js基础.nodejs基础.ajax基础: 1. 手机验证码原理 表单提交,把手机号码传送到后端:后端拿到手机号码后根据相关算法随机形成一个验证码,并将其保存在数据库:用户拿到验证码后将验证 ...

  3. vue3自动导入 api ,不需要多次导入 api 了

    安装插件   npm i -D unplugin-auto-import 配置 vite.config.js export default defineConfig({ plugins: [ vue( ...

  4. HarmonyOS NEXT开发之ArkTS自定义组件学习笔记

    在HarmonyOS中,ArkTS提供了创建自定义组件的能力,允许开发者封装和复用UI代码.以下是关于自定义组件的详细介绍,包括创建自定义组件.页面和自定义组件的生命周期.自定义组件的自定义布局.冻结 ...

  5. 你在使用 KubeSphere 吗?

    如果你正在使用 KubeSphere,欢迎在社区分享你的使用和实践经验,赢取 KubeSphere 周边礼品(T恤.帆布袋.徽章等)以及 Kubernetes 技术书籍. 为什么我们要征集用户案例? ...

  6. 云原生周刊:目前的 Kubernetes 开源监控方案有没有缺陷?

    视频推荐 目前的 Kubernetes 开源监控方案有没有缺陷? YouTube 频道 OpenObservability Talks 最新一期视频邀请了 VictoriaMetrics 项目的创始人 ...

  7. 饿了么element-ui的图标设置大小

    给element-ui的图标设置大小,其实就是给此组件或其父组件设置字体大小 方法一 需要给父盒子设置字体大小 效果如下 父组件scss样式: 子组件样式: 方法二 直接给当前组件设置字体大小!省事儿 ...

  8. npoi2.3+泛型+反射 根据配置统一解析excel数据到实体的基础方法

    解析方法: /// <summary> /// excel数据解析到实体 /// </summary> /// <typeparam name="T" ...

  9. Go语言基础06 _function

    Go语言基础06 _function 函数在Go语言中是一等公民 与其他主要编程语言的差别 可以有多个返回值 所有参数都是值传递:slice,map,channel 会有传引用的 错觉 函数可以作为变 ...

  10. VMware安装教程---------------------以及Windows,Linux,Apple MAC OS系统安装

    1.什么是VMware虚拟机 VMware虚拟机是一个虚拟机软件,它可以在一台机器上同时运行多个系统,这些系统包括Windows,Linux,Apple os等. 2.虚拟机有什么用 虚拟机的用处很多 ...