初遇SpringBoot踩坑與載入靜態檔案遇到的坑

沐顏小妖精發表於2021-06-04

                                            SpringBoot開發

1、建立SpringBoot專案

大家都知道SpringBoot開發非常快,建立SpringBoot專案時,勾上SpringWEB就正常開發,不需要任何配置檔案就可以執行,寫個後臺Controller層介面即可做測試了。

你不相信?

真的有那麼神奇的東西?

那我現在就建立一個專案來一起測試下,我的開發環境JDK版本1.8,想玩SpringBoot或Springcloud的小夥伴一定要用jdk1.8及以上的版本哦,這裡用開發工具是STS也就是eclipse升級版,專門用來開發SpringBoot、SpringcCloud而研發的

 

 

 

專案建立完成了,

 

 

 

1.1 pom檔案

 

這是我建立之後自生成的pom檔案,可以看到除了SpringWeb和Springtest就沒有其他的了

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>Test</artifactId>
    <version>1-SNAPSHOT</version>
    <name>Test</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.test.main.TestApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

1.2、熱部署元件

當然,為了方便開發我們也可以加一個熱部署元件,在開發中修改後臺程式碼總需要無限關閉又重啟專案的問題

這個元件就是devtools

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
</dependency>

devtools版本號的話無需多說,都是SpringBoot自己管理,都是有一一對應的

 

 

 

1.3、測試

 可以啟動成功了,可以寫測試介面了

 

 

 新增熱部署後,不需要重啟專案,直接來測試

 

 

 還不信,我們可以打個斷點,用debug模式執行

 

 

 

 到這裡,後臺測試完成了,那麼前臺資源怎麼弄,為什麼說坑?

我們知道,如何是一個web專案的時候,我們是有一個webApp目錄,但是我們專案現在是沒有的,那要不要加進去?

而且我不知道大家有沒有發現,我們建立專案的時候,用的是jar包的形式,不是war包

 

 

 

 

 為了測試方便,程式碼規範,我們把啟動類的測試方法提取到controller層來

 

 

2、跳轉前端頁面

 

 問題來了,這怎麼跳轉到HTMl頁面去呢

開始呀,我也就隨便寫個方法試試,好傢伙跳了個寂寞,直接404

我不知道大家發現沒,你們在寫web專案時,controller註解使用的是個啥,不應該是@Controller註解麼?

我用的是@RestController,這個註解又是什麼鬼

不應該是說跳轉頁面麼?怎麼又說到註解了?大家別急看完就知道了

 

 

 這個@RestController註解的StringBoot獨有的,它裡面已經包含了@ResponseBody了,也正因為是標註在類上了,所以標註了@RestController的類不能實現頁面跳轉,

如果要跳轉頁面,重定向頁面的話,只能新建一個controller類,標記上@Controller註解,千萬別標記錯了

 

 

 你以為這樣就行了麼?

想想你在開發SSM框架時,寫的那麼多配置檔案,是不是有點太簡單了

2.1、thymeleaf

那我告訴你,確實沒有那麼簡單,但是也不難,我們還需要加上一個元件,這個元件的名字就是thymeleaf

它的pom是

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

這個玩意幹嘛的?

這個就是java模板引擎,聽起來是不是挺高大尚的,其實就是以前你們寫SpringMVC的東西,就是加前端檢視解析器等一些玩意啦

說那麼多都沒啥用,自己看一下SpringBoot對它的一些預設配置規則吧

 

 

 

 

 

看到這裡應該就不需要在進行多說了吧,我們就不需要寫SpringMVC的配置檔案了,按照它預設的配置對應的放進去就好了

2.2、thymeleaf的使用

當然,thymeleaf如果就那麼一點功能那就不會說他是高大尚了,以前用jsp開發時所有該有的功能,有了thymeleaf都可以用另外一個方式使用

那到底怎麼用呢,這裡我就簡單介紹一下,具體怎麼用,有哪些功能我感覺這個大佬教的還不錯,可以瞅瞅

https://fanlychie.github.io/post/thymeleaf.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">   <!--一定要在html標籤中加上哦-->
<head>
    <title>Index Page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p th:text="${message}">Welcome to BeiJing!</p><!--th:xxx     xxx指的是任意html屬性都可以替換掉      ${後端傳入前端的值}-->
</body>
</html>

 

3、SpringBoot靜態資源對映規則

然後我們看一下SpringBoot靜態資源配置對映規則

 

 

3.1、webjars

 

 

 預設為webjars找靜態檔案,webjars是個什麼鬼?

就是把前端用到的檔案打包成jar包的形式

 

 

 有興趣的同學可以去瞅一眼

 

 

 

 匯入之後就是這樣的啦,剛好對映到SpringBoot靜態資源預設路徑

3.2、其他靜態資源路徑

除了webjars就沒有其他靜態資源路徑了嗎?其實還是有的,一路除錯跟蹤下我們來到了這裡

 

 

 我們發現,最後存放靜態資原始檔路徑就是這幾個啦

/**
* 根路徑下的子路徑都是可以存放靜態資原始檔的
*/
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
                     "classpath:/META-INF/resources/", // 這個是根路徑
                     "classpath:/resources/",      // 根路徑下的子路徑

                     "classpath:/static/",        // 根路徑下的子路徑
                     "classpath:/public/"         // 根路徑下的子路徑
                     };

不信就直接上測試啦

 

 

 

 

 

 

所以知道怎麼訪問了嗎?

訪問靜態資源的時候不需要加static、public等,但是如果是static 下的子資料夾就需要在路徑上加上子檔名

比如是static下有一個abc資料夾,那麼訪問路徑上就是這樣啦   127.0.0.1:8080/abc.test.js

3.3、歡迎頁存放路徑

那我們的歡迎頁放哪裡呢

 

 

 

好了,關於靜態資原始檔的就那麼多,不愛勿噴哦

 

 

 

 

 

 

 

 

相關文章