SSM中的静态资源配置

Spring xml中通过mvc:resource节点配置静态资源:

<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/html/**" location="/html/"/>

还有一种简化的配置风格:

<mvc:resources mapping="/**" location="/"/>

除了xml配置还可以通过java代码来配置静态资源:

@Configuration
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/");
    }
}

只需定义一个类继承WebMvcConfigurationSupport,重写addResourceHandlers方法即可。

SpringBoot中静态资源配置

通常我们创建SpringBoot项目时resources资源目录下会创建static的目录,这个目录默认存放静态资源。但是静态资源就只能存在再static目录中吗?下面我们来看下SpringBoot中默认存放静态资源的目录及如何自定义存放目录。

默认存放位置
  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/
  • /
源码分析

springboot js 加载动态转圈效果 spring boot动态加载模块_intellij-idea
this.mvcProperties.getStaticPathPattern()对应的目录是/,下面的getResourceLocations方法另外加入其他四个目录。
访问路径: 启动项目,端口号8080,当我们在static目录下存放图片a.jpg时,此时的访问路径为:

http://location:8080/a.jpg

就是因为使用的默认配置目录,自动去static目录下寻找,此时如果在路径上加static反而会报404的错误。

自定义位置

除了默认的目录位置,还可以在配置文件中自定义静态资源的存放目录

#  自定义目录
spring.resources.static-locations=classpath:/
#  访问路径
spring.mvc.static-path-pattern=/**

动态模板

SpringBoot并不自带支持JSP,需要我们自己进行配置,在现在的Web开发中JSP也使用的越来越少,SpringBoot自动支持Thymeleaf 和reemarker。下面我们就来看看

整合Thymeleaf

依赖:

# 动态模板
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

# web开发
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

其实此时我们就可以使用thymeleaf动态模板了不需要任何配置,动态模板默认存放在template目录下,以.html结尾。下面我们来稍微了解一下为什么就可以直接使用了,此处涉及到SpringBoot的自动化配置,在后面的学习中我们还会专门讲到。
首先看下thymeleaf的自动化配置类org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration

@Configuration
@EnableConfigurationProperties(ThymeleafProperties.class)
@ConditionalOnClass({ TemplateMode.class, SpringTemplateEngine.class })
@AutoConfigureAfter({ WebMvcAutoConfiguration.class, WebFluxAutoConfiguration.class })
public class ThymeleafAutoConfiguration {
}

@Confoguration说明这是一个配置类
@EnableConfigurationProperties引入ThymeleafProperties的属性配置并使其生效
@ConditionalOnClass条件注解,必须在以下类存在的情况下才能生效,即引入thymeleaf依赖
@AutoConfigureAfter 控制加载顺序,在WebMvcAutoConfiguration,WebFluxAutoConfiguration之后被加载

再来看看ThymeleafProperties类中配置了哪些属性:

@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
        private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8;
        public static final String DEFAULT_PREFIX = "classpath:/templates/";
        public static final String DEFAULT_SUFFIX = ".html";
        private boolean checkTemplate = true;
        private boolean checkTemplateLocation = true;
        private String prefix = DEFAULT_PREFIX;
        private String suffix = DEFAULT_SUFFIX;
        private String mode = "HTML";
        private Charset encoding = DEFAULT_ENCODING;
        private boolean cache = true;
        //...
}

@ConfigurationProperties 对应配置文件中的配置,需要修改时我们只要改spring.thymeleaf开头的属性即可。类中默认定义了存放位置、文件后缀等。

定义Controller:

@Controller
public class IndexController {
    @GetMapping("/index")
    public String index(Model model) {
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User u = new User();
            u.setId((long) i);
            u.setName("javaboy:" + i);
            u.setAddress("深圳:" + i);
            users.add(u);
        }
        model.addAttribute("users", users);
        return "index";
    }
}
public class User {
    private Long id;
    private String name;
    private String address;
    //省略 getter/setter
}

此时只要在template中定义一个index.html文件,引入thymeleaf语法即可。thymeleaf语法参考:https://www.thymeleaf.org

Freemarker

依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

自动化配置同理于thymeleaf此处就不多做赘述,直接上源码:

@Configuration
@ConditionalOnClass({ freemarker.template.Configuration.class, FreeMarkerConfigurationFactory.class })
@EnableConfigurationProperties(FreeMarkerProperties.class)
@Import({ FreeMarkerServletWebConfiguration.class, FreeMarkerReactiveWebConfiguration.class,
                FreeMarkerNonWebConfiguration.class })
public class FreeMarkerAutoConfiguration {
}
@ConfigurationProperties(prefix = "spring.freemarker")
public class FreeMarkerProperties extends AbstractTemplateViewResolverProperties {
        public static final String DEFAULT_TEMPLATE_LOADER_PATH = "classpath:/templates/";
        public static final String DEFAULT_PREFIX = "";
        public static final String DEFAULT_SUFFIX = ".ftl";
        /**
         * Well-known FreeMarker keys which are passed to FreeMarker's Configuration.
         */
        private Map<String, String> settings = new HashMap<>();
}

如需自定义配置,只需改动spring.freemarker开头的属性即可。