3. SpringMVC 元件解析 - View Resolver - 檢視解析器
什麼是檢視解析器? 先來複習一下吧:
View Resolver 負責將處理結果生成 View 檢視,View Resolver 首先根據邏輯檢視名解析成物理檢視名,即 具體的頁面地址,再生成 View 檢視物件,最後對 View 進行渲染將處理結果通過頁面展示給使用者。
SpringMVC有預設元件配置,檢視解析器預設元件都是DispatcherServlet.properties配置檔案中配置的,該配置檔案地址 org/springframework/web/servlet/DispatcherServlet.properties,該檔案中配置了預設的檢視解析器,
我們可以在IDEA的lib下去找 然後找到spring-webmvc-5.0.5.RELEASE.jar包下的org/springframework/web/servlet/DispatcherServlet.properties ,然後我們直接開啟,發現裡面有很多我們前面介紹過的解析器,我們這篇文章講解的是檢視解析器:
找到
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
一般在倒數第二行 我們跟蹤InternalResourceViewResolver進去:
然後可以看到這個類繼承了UrlBasedViewResolver類,然後我們在跟蹤進去:
發現這兩行程式碼
public static final String REDIRECT_URL_PREFIX = "redirect:";
public static final String FORWARD_URL_PREFIX = "forward:";
其實呢 這個就是他定義的常量 我用我五毛錢英語可以讀出
分別是: 重定向 - url - 字首 和 轉發 - url - 字首
所以我可以知道 這就是 控制器返回那個字串的方式! 預設是第二個 轉發,所以他隱藏了而已,
所以我們可以去哪裡新增 去改變他的方式:
package com.bihu.Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping(value= {"/aaa"}) public class TestController { @RequestMapping(value = "/go",method = RequestMethod.GET) public String GoUrl(){ System.out.println("您成功訪問了 根目錄/aaa/go 網頁!"); return "redirect:/s1.jsp";
} }
嗯 果然是這樣 現在網頁不轉發了 是直接重定向了【網址變了】
所以 就是說 這個東西預設是 轉發 然後你完全可以新增這個進去實現重定向。
還有就是:
我們一般開發 如果檢視是 jsp 那麼我們一般都把 這個jsp 在webapp這個包下 建立一個資料夾存 jsp ,所以你在控制器返回的網址也是要變的【檢視解析器】:
例如這是我的結構圖,那麼我就要這要返回:
return "/jsp/s1.jsp";
所以如果你覺得麻煩 注意啊 是如果覺得麻煩,你完全可以返回一個 s1 其他的讓 Spring幫你配【Spring-MVC 容器中 配置依賴注入】:
注意: 我覺得不要配最好,因為聽錯報錯率挺高 因為 轉發 和 重定向的問題?? 還有就是 多層目錄 、 不同目錄
怎麼配?
首先我們得知道原理:
還是這個類:
UrlBasedViewResolver
它裡面有兩個變數叫:
private String prefix = "";
private String suffix = "";
五毛錢並夕夕翻譯的我:
prefix = ""; --檢視名稱字首
suffix = ""; --檢視名稱字尾
所以呢,就是:
return "/jsp/s1.jsp";
/webapp/jsp/ : prefix 為什麼是/webapp/jsp/ ? 因為如果你改變人家的父路勁 那麼就得重寫! 寫完整 不然找不到!
.jsp : suffix
所以呢 你會發現他都有set 和 get 方法 ,那麼你就可以在spring-mvc 容器上注入一下即可了!!!!
spring-mvc.xml :
這裡出錯了 待補充....