SpringBoot筆記(三):靜態資源和動態模板
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/
- /
原始碼分析
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開頭的屬性即可。
改變就是好事! 堅持成就信仰! 努力證明選擇!