1. 程式人生 > 其它 >SpringBoot筆記(三):靜態資源和動態模板

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開頭的屬性即可。

改變就是好事! 堅持成就信仰! 努力證明選擇!