SpringBoot-web development (1): importación de recursos estáticos (análisis de código fuente)



En el desarrollo web, el elemento más básico es importar recursos estáticos, entonces, ¿cómo importar recursos estáticos en Springboot? La respuesta está en el código fuente, analicemos y analicemos ~

Primero, presione dos veces shiftpara buscar la WebMvcAutoConfugureclase en IDEA . Esta es la clase de configuración automática de webMvc. El método para procesar los recursos estáticos de springboot está en ella.
imagen-20200921192255315
Deslizamos hacia abajo y encontramos una clase de adaptación de configuración automática de webMvc. WebMvcAutoConfigurationAdapter
imagen-20200921192234170
Hay un addResourceHandlersmétodo, este Es nuestro proyecto springboot agregar un método para manejar recursos estáticos

Analicemos este código a continuación. Primero analizaremos la parte naranja del código y luego analizaremos la parte azul del código, ¡correspondiente a los dos métodos para importar recursos estáticos!
imagen-20200921191250400


Método 1: WebJars

En el addResourceHandlersmétodo, el código naranja en el ícono menciona una webjarscosa. Esta es la primera forma en que Springboot importa recursos estáticos. ¿Qué es esto?

if (!registry.hasMappingForPattern("/webjars/**")) {
    
    
   customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
         .addResourceLocations("classpath:/META-INF/resources/webjars/")
         .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}

1. ¿Qué son los webjars?

Referencia Bowen: https://www.jianshu.com/p/ca568526f0bd https://blog.coding.net/blog/spring-static-resource-process

Por lo general web开发, a menudo necesitamos importar algunos recursos estáticos, pero como js, css, imagesy otros recursos estáticos gestión es la versión caótica

  • Por ejemplo Jquery, Bootstrap, Vue.jsotras versiones de los componentes respectivos de la estructura frontal de extremo respectiva son diferentes depende

  • Por lo general, copiamos estos recursos web en el directorio de Java. Esta copia manual puede causar errores de versión. Si la versión de la copia es incorrecta, la página de inicio no se puede mostrar correctamente.

Entonces, ¿existe una solución como un jarpaquete de administración de back-end ? Esto presenta la introducción de hoy.WebJars

  • WebJarsProporciona archivos de recursos para proyectos web en forma de Jars y luego utiliza la gestión de estas bibliotecas dependientes en Maven para garantizar la singularidad de esta versión de recurso web.
  • WebjarsSe utiliza principalmente para Spring Bootcrear proyectos de microservicios basados ​​en la necesidad de empaquetar todos los recursos en archivos jar ejecutables.

2. Uso de webjars

En cuanto a WebJarsrecursos, el sitio web oficial: https://www.webjars.org/
imagen-20200921121150290
Vamos al sitio web para encontrar los recursos que necesitamos. Cada recurso tiene sus propias coordenadas de maven. Agrega dependencias de maven a tu proyecto y puedes usarlo directamente. Estos recursos también.
Por ejemplo, aquí, la jquerydependencia de maven importada y los jqueryrecursos importados se pueden ver a la izquierda
imagen-20200921121830938

3. Estructura de Webjars

Antes de comenzar, eche un vistazo a Jqueryla webjarscomprensión bajo webjarsla estructura de directorios del paquete

META-INF
    └─maven
        └─org.webjars
            └─jquery
                └─pom.properties
                └─pom.xml
    └─resources
        └─webjars
            └─jquery
                └─3.5.1
                       └─(静态文件及源码)

4. Analizar el código fuente

Analiza el siguiente código:

//如果静态资源符合"/webjars/**"的格式
if (!registry.hasMappingForPattern("/webjars/**")) {
    
    
    //添加资源注册到"/webjars/**"
   customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
         .addResourceLocations("classpath:/META-INF/resources/webjars/")
         .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}

Si el nombre del recurso estático coincide /webjars/**, vaya a la classpath:/META-INF/resources/webjars/ruta para buscar, agregue el recurso a la /webjars/**ruta, y estas dos rutas son una correspondencia:

/webjars/**  --->  classpath:/META-INF/resources/webjars/

En el futuro, puede acceder directamente a los recursos estáticos accediendo directamente a ellos a través del navegador a través del formato de la ruta de registro;

Y Webjarstodos nuestros recursos se ajustan a esta estructura de ruta, por lo que solo necesitamos introducir esta coordenada a través de maven, y todos se pueden encontrar e identificar. Así es como importamos recursos estáticos.
imagen-20200921122039544

5. Visita de prueba

A continuación, comencemos a probar si podemos acceder a recursos estáticos. El formato de acceso especificado en el código fuente /webjars/**corresponde a la classpath:/META-INF/resources/webjars/**ruta, aquí es:

http://localhost:8080/webjars/jquery/3.5.1/jquery.js

Puede ver el jueryarchivo estático js importado
imagen-20200921123135697




Método 2: staticPathPattern

En el addResourceHandlersmétodo, el código azul en el icono es la segunda forma en que Springboot puede importar recursos estáticos.

1. Análisis del código fuente

//获取staticPathPattern
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
//如果静态资源路径符合staticPathPattern的格式
if (!registry.hasMappingForPattern(staticPathPattern)) {
    
    
    customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
                                         .addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
                                         .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}

De manera similar, primero consígalo staticPathPatterny luego agregue recursos para registrarse en esta ruta, entonces, ¿cuál es esta ruta?

Hicimos clic getStaticPathPattern
imagen-20200921194643300
y luego hicimos clic y staticPathPattern
imagen-20200921194714793
descubrimos que esta ruta es /**: es decir, podemos /**acceder a recursos estáticos a través de este formato, entonces, ¿cuál es la ruta real correspondiente a esta ruta?

Haga clic en el código getStaticLocations(), puede ver cuatro rutas
imagen-20200921230923841

"classpath:/META-INF/resources/":就是上述的webjars
"classpath:/resources/":reources目录下的resources目录,不存在自己新建
"classpath:/static/":resources目录下的static目录
"classpath:/public/":resources目录下的public目录,不存在自己新建

imagen-20200921200824407

2. Visita de prueba

Por ejemplo, colocamos publicun archivo estático en el directorio1.js

hello

imagen-20200921203423657
Luego iniciamos el programa principal para visitar locaohost:8080/1.jsy visitamos exitosamente los recursos estáticos
imagen-20200921203451706
Resumen : localhost:8080Todas las rutas de recursos estáticos solicitadas debajo se encontrarán en esos cuatro directorios, que son los cuatro directorios donde se almacenan los recursos estáticos.

Podemos probar, cuando hay varios archivos estáticos con el mismo nombre existen en diferentes directorios anteriores, la prioridad: resources> static>public




Ruta de recursos personalizada

Al addResourceHandlerscomienzo del método, hay tal juicio

//如果静态资源已经被自定义
if (!this.resourceProperties.isAddMappings()) {
    
    
    logger.debug("Default resource handling disabled");
    return;
}

Puede application.propertiespersonalizar la ruta de los recursos estáticos en el, el valor predeterminado es/**

spring.mvc.static-path-pattern=/zsr/**

Por lo general, no se recomienda hacer esto, y el método 2 anterior no será válido (a menos que se defina explícitamente como /**)

Supongo que te gusta

Origin blog.csdn.net/qq_45173404/article/details/108721839
Recomendado
Clasificación