springboot中靜態頁面無法訪問及return無法重定向問題

米奇羅發表於2019-03-23

1. 前言

這幾天做一個小專案,碰到了一些奇葩bug,各種百度都無法解決,只有自己一個一個試,氣到爆炸。springboot中靜態頁面templates下的HTML檔案無法直接訪問,還有就是return "redirect:”無法重定向問題,這篇部落格就解決這個坑。

2. 靜態頁面無法載入

先看看我的專案目錄架構:

springboot中靜態頁面無法訪問及return無法重定向問題

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:”無法重定向

springboot中靜態頁面無法訪問及return無法重定向問題

一直在網上查問題,路徑改了無數次,都不能訪問,搞了一晚上,第二天試著改了一下@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. 小結&參考資料

小結

看起來問題很小,但就是因為這個小問題就浪費了整整兩天時間,又肝又氣,真的很累的,但解決後就很開心了,就像高中做數學題一樣,幾個小時解一道數學題 ,做出來就會很開心。但也需要堅持,半途而廢最終就沒成果了。

參考資料

相關文章