SpringMVC ViewResolver視圖解析器組件
Spring MVC的視圖解析器 ViewResolver 是框架中一個重要的組件,用于將控制器返回的邏輯視圖名稱解析為具體的視圖實現(xiàn)對象,最終呈現(xiàn)給用戶的是具體的視圖實現(xiàn),例如 JSP、FreeMarker 模板、Thymeleaf 模板、JSON 等等。本文將介紹 Spring MVC 的視圖解析器的作用、類型、以及源碼實現(xiàn)。
作用
在 Spring MVC 中,控制器處理完請求之后需要將生成的模型數(shù)據(jù)和視圖名稱返回給 DispatcherServlet,DispatcherServlet 會將模型數(shù)據(jù)和視圖名稱交給 ViewResolver 進行解析,ViewResolver 將對應的視圖解析出來,并返回給 DispatcherServlet,由 DispatcherServlet 進行渲染,最終將渲染后的結果返回給客戶端。因此,ViewResolver 的作用是將控制器返回的邏輯視圖名稱解析為具體的視圖實現(xiàn)對象。
類型
Spring MVC 中提供了多種 ViewResolver 類型,不同類型的 ViewResolver 會使用不同的解析策略和算法,下面介紹幾種常見的 ViewResolver 類型。
InternalResourceViewResolver
InternalResourceViewResolver 是 Spring MVC 中最常用的視圖解析器,它用于解析 JS P或 HTML 等資源文件。該解析器會將邏輯視圖名稱加上前綴和后綴,例如將邏輯視圖名稱 “hello” 解析為 “/WEB-INF/views/hello.jsp”。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class AppConfig {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
FreeMarkerViewResolver
FreeMarkerViewResolver 用于解析FreeMarker 模板,它會將邏輯視圖名稱加上前綴和后綴,例如將邏輯視圖名稱 “hello” 解析為 “/WEB-INF/views/hello.ftl”。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class AppConfig {
@Bean
public FreeMarkerViewResolver viewResolver() {
FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".ftl");
return viewResolver;
}
}
TilesViewResolver
TilesViewResolver 用于解析 Tiles 布局,它會將邏輯視圖名稱解析為 Tiles 布局,并返回給 DispatcherServlet 進行渲染。Tiles 是一個基于模板的布局框架,可以將頁面分成多個部分,每個部分都是一個獨立的模板,最終組合成一個完整的頁面。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class AppConfig {
@Bean
public TilesConfigurer tilesConfigurer() {
TilesConfigurer tilesConfigurer = new TilesConfigurer();
tilesConfigurer.setDefinitions(new String[] { "/WEB-INF/tiles.xml" });
return tilesConfigurer;
}
@Bean
public TilesViewResolver viewResolver() {
TilesViewResolver viewResolver = new TilesViewResolver();
return viewResolver;
}
}
ContentNegotiatingViewResolver
ContentNegotiatingViewResolver 是一個復合視圖解析器,它可以根據(jù)請求的 Accept 頭信息來判斷客戶端需要的數(shù)據(jù)類型,并選擇對應的視圖解析器進行解析。例如客戶端請求的 Accept 頭信息為 “application/json”,則選擇使用 MappingJackson2JsonView 解析器將模型數(shù)據(jù)渲染成 JSON 格式返回給客戶端。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class AppConfig {
@Bean
public ContentNegotiatingViewResolver viewResolver() {
ContentNegotiatingViewResolver viewResolver = new ContentNegotiatingViewResolver();
List<ViewResolver> viewResolvers = new ArrayList<>();
viewResolvers.add(jsonViewResolver());
viewResolver.setViewResolvers(viewResolvers);
return viewResolver;
}
@Bean
public MappingJackson2JsonViewResolver jsonViewResolver() {
MappingJackson2JsonViewResolver jsonViewResolver = new MappingJackson2JsonViewResolver();
return jsonViewResolver;
}
}
源碼實現(xiàn)
Spring MVC 中的視圖解析器是通過 ViewResolver 接口來實現(xiàn)的,該接口定義了兩個方法:
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throws Exception;
String REDIRECT_URL_PREFIX = "redirect:";
String FORWARD_URL_PREFIX = "forward:";
}
其中,resolveViewName 方法接收一個邏輯視圖名稱和一個 Locale 對象作為參數(shù),返回一個 View 對象。如果找不到對應的 View 對象,則返回 null。
對于 InternalResourceViewResolver 而言,它的 resolveViewName 方法實現(xiàn)如下:
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
String prefix = getPrefix();
String suffix = getSuffix();
if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
RedirectView redirectView = new RedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible());
String[] hosts = StringUtils.toStringArray(getRedirectHosts());
if (hosts.length > 0) {
redirectView.setHosts(hosts);
}
return redirectView;
}
if (viewName.startsWith(FORWARD_URL_PREFIX)) {
String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length());
InternalResourceView forwardView = new InternalResourceView(forwardUrl);
forwardView.setApplicationContext(getApplicationContext());
forwardView.setServletContext(getServletContext());
forwardView.setAttributesMap(getAttributesMap());
return forwardView;
}
if (!viewName.startsWith(prefix) && !viewName.endsWith(suffix)) {
viewName = prefix + viewName + suffix;
}
return buildView(viewName);
}
在上面的代碼中
首先判斷邏輯視圖名稱是否以 redirect: 或 forward: 開頭,如果是就返回 RedirectView 或 InternalResourceView 對象。
如果不是,則根據(jù) prefix 和 suffix 屬性將邏輯視圖名稱轉換為物理視圖名稱。
總結
Spring MVC 的視圖解析器 ViewResolver 是一個重要的組件,它將控制器返回的邏輯視圖名稱解析為具體的視圖實現(xiàn)對象,最終呈現(xiàn)給用戶的是具體的視圖實現(xiàn)。
Spring MVC提供了多種 ViewResolver 類型,不同類型的ViewResolver會使用不同的解析策略和算法,例如 InternalResourceViewResolver 用于解析JSP或HTML等資源文件,F(xiàn)reeMarkerViewResolver 用于解析 FreeMarker 模板,TilesViewResolver 用于解析 Tiles 布局,ContentNegotiatingViewResolver 則是一個復合視圖解析器,可以根據(jù)請求的 Accept 頭信息來選擇對應的視圖解析器進行解析。
ViewResolver 的源碼實現(xiàn)遵循了 ViewResolver 接口的規(guī)范,即將邏輯視圖名稱解析為具體的視圖實現(xiàn)對象。
到此這篇關于SpringMVC ViewResolver視圖解析器組件的文章就介紹到這了,更多相關SpringMVC ViewResolver內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Dependency ‘XXX:‘ not found問題的三步解決
這篇文章主要介紹了Dependency ‘XXX:‘ not found問題的三步解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
springboot+jersey+tomcat實現(xiàn)跨域方式上傳文件到服務器的方式
這篇文章主要介紹了springboot+jersey+tomcat實現(xiàn)跨域方式上傳文件到服務器,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03

