1. 程式人生 > 其它 >3. SpringMVC 元件解析 - View Resolver - 檢視解析器

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 :

這裡出錯了 待補充....