第一章:对静态资源的整合
@ConfigurationProperties(prefix
= "spring.resources", ignoreUnknownFields
= false)public
class ResourceProperties implements
ResourceLoaderAware
{//可以设置和静态资源有关的参数,缓存时间等
WebMvcAuotConfiguration:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
Integer cachePeriod = this.resourceProperties.getCachePeriod();
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META‐INF/resources/webjars/").setCachePeriod(cachePeriod));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
//静态资源文件夹映射
if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(registry.
addResourceHandler(staticPathPattern).addResourceLocations(this.resourceProperties.getStaticLocations()).setCachePeriod(cachePeriod));
}
} /
/配置欢迎页映射
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(
ResourceProperties resourceProperties) {
return new WelcomePageHandlerMapping(resourceProperties.getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
}
//配置喜欢的图标
@Configuration
@ConditionalOnProperty(value = "spring.mvc.favicon.enabled", matchIfMissing = true)
public static class FaviconConfiguration {
private final ResourceProperties resourceProperties;
public FaviconConfiguration(ResourceProperties resourceProperties) {
this.resourceProperties = resourceProperties;
}
@Bean
public SimpleUrlHandlerMapping faviconHandlerMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
//所有 **/favicon.ico
mapping.setUrlMap(Collections.singletonMap("**/favicon.ico",
faviconRequestHandler());
return mapping;
}
@Bean
public ResourceHttpRequestHandler faviconRequestHandler() {
ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
requestHandler.setLocations(this.resourceProperties.getFaviconLocations());
return requestHandler;
}
}
}
- 所有 /webjars/**,都去 classpath:/META-INF/resources/webjars/ 中找资源
- webjars:以 jar 包方式引入静态资源WebJars - Web Libraries in Jars
- 导入依赖:
<!‐‐引入jquery‐webjar‐‐>在访问的时候只需要写webjars下面资源的名称即可
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1</version>
</dependency>
- /**:访问当前项目的任何资,都去(静态资源文件夹)找映射
"classpath:/META‐INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目的根路径
- 首页:静态资源文件夹下的所有 index.html 页面,被 /** 映射
- localhost:端口号/index页面
第二章:模板引擎
-
JSP、Velocity、Freemarker、Thymeleaf:
- SpringBoot 推荐的 Thymeleaf:语法更简单,功能更强大
-
引入 thymeleaf:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 从 Spring 父文件中能看到 SpringBoot 2.0.1 所使用的 thymeleaf 版本是 3.0.9
- SpringBoot 启动的时候会自动配置:
- org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration
- 从 ThymeleafAutoConfiguration 的源代码中我们可以得知 ThymelaefProperties 中配置了 Thymeleaf 的规则:
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING;
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 = "classpath:/templates/";
private String suffix = ".html";
private String mode = "HTML";
private Charset encoding;
private boolean cache;
}
- 使用 html 作为模板,而且默认的前缀是放在 classpath:/templates/ 下,后缀是 .html
- 这些属性可以通过 application.properties 来修改
-
示例:
- 在 templates 下创建一个 success.html
- 在 html 中引入 thymeleaf 的命名空间
<html lang="en" xmlns:th="http://www.thymeleaf.org">
- 创建一个 Controller 提供一个访问的方法:
@RequestMapping("/success")public String hello(Model model){ model.addAttribute("hello","<h1>zhangsan</h1>");
return "success";
}
- 在 thymeleaf 模板中取值:
<!DOCTYPE
HTML PUBLIC "-//W3C//DTD HTML 4.01 "http://www.w3.org/TR/html4/loose.dtd"
Transitional//EN">
html lang="en" xmlns:th="http://www.thymeleaf.org">
head>
title>Title</title>
head>
body>
div th:text="${hello}"> </div>
body>
html>