Java项目静态资源映射的几种方式

一、Springboot

1、webjars方式

我们之前使用Maven构建一个Web项目时,在main目录下会存在一个webapp的目录,我们以前都是将所有的页面或静态资源导在这个目录下,但现在使用SpringBoot项目我们应该将静态资源文件放在哪里呢?

SpringBoot对于静态资源放置的位置,是有静态资源映射规则,在SpringBoot中,SpringMVC的web配置都在 org.springframework.boot.autoconfigure.web.servlet 包下的 WebMvcAutoConfiguration 这个配置里面,我们找到addResourceHandlers这个方法,该方法用于处理webjars方式的静态资源映射。

  @Override
  protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    super.addResourceHandlers(registry);
    if (!this.resourceProperties.isAddMappings()) {
      logger.debug("Default resource handling disabled");
      return;
    }
    ServletContext servletContext = getServletContext();
    addResourceHandler(registry, "/webjars/**","classpath:/META-INF/resources/webjars/");
    addResourceHandler(registry,this.mvcProperties.getStaticPathPattern(),registration -> {
    registration.addResourceLocations(this.resourceProperties.getStaticLocations());
        if (servletContext != null) {
          registration.addResourceLocations(new ServletContextResource(servletContext, SERVLET_LOCATION));
        }
    });
  }

阅读源码得知,所有的 /webjars/**,都需要去 classpath:/META-INF/resources/webjars/ 找对应的资源,那什么是webjars呢?

webjars本质就是以jar包的方式引入我们的静态资源,我们以前要导入一个静态资源文件,直接导入即可。

使用SpringBoot可以使用webjars,只需导入相应pom依赖即可使用:
image

2、继承WebMvcConfigurationSupport类

自定义一个WebMvcConfig继承WebMvcConfigurationSupport

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    /**
     * 添加静态资源映射
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 表示通过 ip:port/profile/** 能访问服务器D://upload目录下的所有文件
        registry.addResourceHandler("/profile/**").addResourceLocations("file:D://upload");
        // 表示通过 ip:port/backend/** 能访问根目录/backend目录下的所有文件
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        // 重写父类方法默认映射关系,如果不需要可以不写
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

3、在application.properties中配置

# 自定义静态资源访问路径,可以指定多个,之间用逗号隔开
spring.resources.static-locations=classpath:/myabc/,classpath:/myhhh

特别注意:自定义静态资源后,SpringBoot默认的静态资源路径将不再起作用!

二、Nginx

1、配置alias目录

alias指定的目录是完整的路径

location /static/ {
    alias  /var/www/static/;
    autoindex on;
}

注意:alias指定的目录后面必须要加上"/"

2、配置root目录

root指定的目录是location匹配访问的path目录的上一级目录

location /static/ {
    root  /var/www/;
    autoindex on;
}

注意:location中指定的/static/必须是在root指定的/var/www/目录中真实存在

3、部署VUE项目

location / {
    root   D:/WorkSpace/Test/dist/;
    try_files $uri $uri/ /index.html;
    index  index.html index.htm;
}

三、Tomcat

1、首先找到Tomcat中的server.xml文件
image

2、打开server.xml文件,在Host节点中增加如下配置

<Context path="/api" docBase="D:\upload\" reloadable="true" debug="0" crossContext="true"/>

静态资源存放目录:D:\upload\20230501.png
静态资源访问地址:http://localhost:8080/api/20230501.png

<Context>元素的属性:

  • path: 指定访问该Web应用的URL入口。

  • docBase: 指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于的appBase属性的相对路径,如果Web应用采用开放目录结构,则指定Web应用的根目录,如果Web应用是个war文件,则指定war文件的路径。

  • reloadable: 如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。

需要注意可能的风险:
1、在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web应用的发存阶段将reloadable设为false。
2、由于动态替代class,引发自动部署;如果部署失败,可能导致出现了2个相同的部署包。再次重启,然后2个缓存包都正常启动。 其本质原因是Tomcat在卸载应用的过程中,如果出现异常,则无法继续删除缓存;在重新加载的时候,无法清空已有的缓存,这个才是问题的根源。

posted @ 2023-04-28 15:20  空还是空  阅读(525)  评论(0编辑  收藏  举报