zoukankan      html  css  js  c++  java
  • Spring MVC 中 DefaultServletHandlerConfigurer

      <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

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

  • 相关阅读:
    Oracle-通过创建索引加快SQL执行效率
    Oracle-DG,MRP进程无法正常应用问题处理,重启大法好
    Oracle-DG,12c pdb创建测试
    Oracle-DG,疑问主库添加日志后,备库未操作主库日志比备库日志数量多,有什么影响?
    Oracle-DG疑问,什么情况下主库会发出一个会话连接备库
    Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于实时同步状态?
    Oracle-rm误删除数据文件,如何强制删除文件启动db
    Oracle-buffer cache过小导致SQL执行时间长
    win10下完全卸载-重装MySQL
    VSCode配置详细教程
  • 原文地址:https://www.cnblogs.com/emanlee/p/15754589.html
Copyright © 2011-2022 走看看