1. 前言
這幾天做一個小專案,碰到了一些奇葩bug,各種百度都無法解決,只有自己一個一個試,氣到爆炸。springboot中靜態頁面templates下的HTML檔案無法直接訪問,還有就是return "redirect:”無法重定向問題,這篇部落格就解決這個坑。
2. 靜態頁面無法載入
先看看我的專案目錄架構:
templates下的靜態頁面根本無法通過localhost:8080/ 訪問
原因是啥呢?
- 靜態資源載入順序順序 靜態資源路徑預設配置:
spring.resources.static-locations = classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
複製程式碼
靜態頁面spring boot根本沒有載入,導致無法直接訪問。
怎麼解決?
很簡單,修改載入路徑,加上templates就行了。
- yml配置如下
spring:
resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/templates/
複製程式碼
- xml配置
spring.resources.static-locations = classpath: /META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/templates/
複製程式碼
注意: 網上還有加入thymeleaf模組引擎,但是我加了沒用,如果頁面還有thymeleaf使用的話,肯定要加入的。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
複製程式碼
3. return "redirect:”無法重定向
一直在網上查問題,路徑改了無數次,都不能訪問,搞了一晚上,第二天試著改了一下@RestController註解,發現就行了,無言以對,網上硬是沒找到方法。 就只需要把@RestController改成@Controller註解即可。
原因分析
@RestController註解相當於@ResponseBody + @Controller合在一起的作用
- 原因就是 @ResponseBody註解引起的 @ResponseBody是作用在方法上的,@ResponseBody 表示該方法的返回結果直接寫入 HTTP response body 中,一般在非同步獲取資料時使用【也就是AJAX】,在使用 @RequestMapping後,返回值通常解析為跳轉路徑,但是加上 @ResponseBody 後返回結果不會被解析為跳轉路徑,而是直接寫入 HTTP response body 中。 比如非同步獲取 json 資料,加上 @ResponseBody 後,會直接返回 json 資料。@RequestBody 將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個物件。
不會被解析成跳轉路徑,那麼 return "redirect:” 重定向也就失效了。解決方法就是把@RestController改成@Controller註解。
4. 小結&參考資料
小結
看起來問題很小,但就是因為這個小問題就浪費了整整兩天時間,又肝又氣,真的很累的,但解決後就很開心了,就像高中做數學題一樣,幾個小時解一道數學題 ,做出來就會很開心。但也需要堅持,半途而廢最終就沒成果了。