Spring MVC 視圖解析器(JSP、Thymeleaf、Freemarker、 JSON/HTML、Bean)詳解

Spring MVC 視圖解析器詳解


1. 視圖解析器概述

視圖解析器(ViewResolver)是 Spring MVC 的核心組件,負責將控制器返回的視圖名稱(如 success)轉換為具體的 View 對象(如 Thymeleaf 模板或 JSP 文件)。Spring 提供了多種視圖解析器,支持不同的模板引擎和渲染方式。


2. 常用視圖解析器詳解

1. InternalResourceViewResolver

作用:解析 JSP 或其他服務器端包含(JSP/Servlet)的視圖,默認用于傳統 JSP 開發

配置方式

@Configuration
public class WebConfig implements WebMvcConfigurer {@Beanpublic InternalResourceViewResolver internalResourceViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/"); // 視圖文件路徑前綴resolver.setSuffix(".jsp");            // 視圖文件后綴resolver.setOrder(1);                  // 設置優先級(數值越小優先級越高)return resolver;}
}

使用示例

@Controller
public class MyController {@GetMapping("/jsp")public String jspView() {return "hello"; // 實際路徑:/WEB-INF/views/hello.jsp}
}

2. ThymeleafViewResolver

作用:解析 Thymeleaf 模板文件,需配合 Thymeleaf 依賴。

依賴:需添加 Thymeleaf 依賴:

<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version>
</dependency>

配置方式

@Configuration
public class ThymeleafConfig {@Beanpublic SpringTemplateEngine templateEngine() {SpringTemplateEngine engine = new SpringTemplateEngine();engine.setTemplateResolver(templateResolver());return engine;}@Beanpublic SpringResourceTemplateResolver templateResolver() {SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();resolver.setPrefix("classpath:/templates/"); // 模板文件路徑resolver.setSuffix(".html");resolver.setTemplateMode("HTML5");return resolver;}@Beanpublic ThymeleafViewResolver thymeleafViewResolver() {ThymeleafViewResolver resolver = new ThymeleafViewResolver();resolver.setTemplateEngine(templateEngine());resolver.setCharacterEncoding("UTF-8");resolver.setOrder(0); // 設置優先級return resolver;}
}

使用示例

@Controller
public class MyController {@GetMapping("/thymeleaf")public String thymeleafView() {return "hello"; // 實際路徑:src/main/resources/templates/hello.html}
}

3. FreeMarkerViewResolver

作用:解析 FreeMarker 模板文件。

依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

配置方式(Spring Boot 自動配置):

# application.properties
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.suffix=.ftl

使用示例

@Controller
public class MyController {@GetMapping("/freemarker")public String freemarkerView() {return "hello"; // 實際路徑:src/main/resources/templates/hello.ftl}
}

4. ContentNegotiatingViewResolver

作用:根據請求的 Accept 頭或擴展名動態選擇視圖解析器,常用于 RESTful API 多媒體格式支持

配置方式

@Configuration
public class WebConfig implements WebMvcConfigurer {@Beanpublic ContentNegotiatingViewResolver contentNegotiatingViewResolver() {ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();List<ViewResolver> resolvers = new ArrayList<>();resolvers.add(new InternalResourceViewResolver()); // JSPresolvers.add(new ThymeleafViewResolver());        // Thymeleafresolver.setViewResolvers(resolvers);return resolver;}
}

使用場景

  • 請求 /api/data.json → 返回 JSON 格式。
  • 請求 /api/data.html → 返回 HTML 模板。

5. BeanNameViewResolver

作用:根據視圖名稱直接查找 BeanFactory 中的 View Bean,無需配置前綴/后綴

配置示例

@Bean
public View myView() {InternalResourceView view = new InternalResourceView();view.setUrl("/WEB-INF/views/custom.jsp");return view;
}@Bean
public BeanNameViewResolver beanNameViewResolver() {BeanNameViewResolver resolver = new BeanNameViewResolver();resolver.setOrder(2); // 優先級最低return resolver;
}

使用示例

@Controller
public class MyController {@GetMapping("/bean")public String beanView() {return "myView"; // 直接匹配 Bean 名稱}
}

3. 核心屬性說明

視圖解析器的通用屬性:

屬性說明示例
prefix視圖文件的路徑前綴(如 /WEB-INF/views/)。resolver.setPrefix("/templates/")
suffix視圖文件的后綴(如 .jsp, .html)。resolver.setSuffix(".ftl")
order優先級(數值越小優先級越高)。resolver.setOrder(0)
viewClass指定視圖實現類(如 InternalResourceView)。resolver.setViewClass(ThymeleafView.class)

4. 視圖解析流程
  1. 請求處理:控制器方法返回視圖名稱(如 success)。
  2. 解析匹配:Spring 按 order 從小到大順序調用視圖解析器。
  3. 生成 View:第一個匹配的解析器將名稱轉換為具體 View 對象(如 Thymeleaf 模板)。
  4. 渲染響應View 對象填充數據并生成最終 HTML。

5. 總結表格
視圖解析器適用場景核心配置屬性
InternalResourceViewResolverJSP 或傳統 Servlet 開發prefix, suffix, viewClass = InternalResourceView
ThymeleafViewResolverThymeleaf 模板開發templateResolver, templateEngine
FreeMarkerViewResolverFreeMarker 模板開發prefix, suffix
ContentNegotiatingViewResolver動態選擇視圖格式(如 JSON/HTML)viewResolvers(集合其他解析器)
BeanNameViewResolver直接綁定 Bean 名稱到 Vieworder(通常最低優先級)

6. 常見問題與解決方案
  • 視圖文件找不到
    • 檢查 prefix/suffix 配置是否正確。
    • 確認視圖文件路徑(如 src/main/resources/templates)。
  • 多個解析器沖突
    • 通過 order 屬性調整優先級。
    • 確保不同解析器的 prefix 不重疊。
  • Thymeleaf/Freemarker 配置失敗
    • 添加對應依賴并檢查模板引擎配置(如 templateResolver)。

關鍵總結

  1. 選擇解析器:根據項目使用的模板引擎(如 Thymeleaf、FreeMarker)選擇對應解析器。
  2. 配置優先級:通過 order 確定解析器處理順序,避免沖突。
  3. 路徑規范:確保 prefix/suffix 正確指向視圖文件位置。
  4. 混合使用:通過 ContentNegotiatingViewResolver 支持多格式響應(如 RESTful API)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76233.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76233.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76233.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

# 爬蟲技術的實現

手把手教你網絡爬蟲&#xff1a;從入門到實踐 一、網絡爬蟲簡介 網絡爬蟲&#xff08;Web Crawler&#xff09;是一種自動化獲取互聯網數據的程序&#xff0c;廣泛應用于搜索引擎、數據分析、市場調研等領域。通過模擬瀏覽器行為&#xff0c;爬蟲可以高效地從網頁中提取結構化…

【HarmonyOS 5】鴻蒙中@State的原理詳解

一、State在鴻蒙中是做什么的&#xff1f; State 是 HarmonyOS ArkTS 框架中用于管理組件狀態的核心裝飾器&#xff0c;其核心作用是實現數據驅動 UI 的響應式編程模式。通過將變量標記為 State&#xff0c;開發者可以確保當狀態值發生變化時&#xff0c;依賴該狀態的 UI 組件…

influxdb數據導出筆記

influx query ‘from(bucket: “byt-grid-data”) |> range(start: 2025-04-01T00:00:00Z, stop: 2025-04-02T23:59:59Z) |> filter(fn: > r[“_measurement”] “byt-gzsn-hsxn-sc-dcs”) |> filter(fn: > r[“_field”] “F_ACT_FZZ02_FB_O”) |> filt…

HTTP Content-Type:深入解析與應用

HTTP Content-Type:深入解析與應用 引言 在互聯網世界中,數據傳輸是至關重要的。而HTTP協議作為最常用的網絡協議之一,其在數據傳輸過程中扮演著關鍵角色。其中,HTTP Content-Type頭字段在數據傳輸中發揮著至關重要的作用。本文將深入解析HTTP Content-Type,并探討其在實…

使用SQL查詢ES數據

使用SQL查詢ES數據 32 進階&#xff1a;使用SQL查詢ES數據環境準備利用腳本導入測試數據 SQL學習基本查詢排序查詢過濾查詢范圍查詢分組查詢(group)分組過濾查詢(grouphaving)聚合函數統計limit查詢分頁查詢 32 進階&#xff1a;使用SQL查詢ES數據 環境準備 需要首先安裝ES8.…

禁止頁面滾動的方法-微信小程序

在微信小程序中&#xff0c;有幾種方法可以禁止頁面滾動&#xff1a; 一、通過頁面配置禁止滾動 在頁面的JSON配置文件中設置&#xff0c;此方法完全禁止頁面的滾動行為&#xff1a; {"disableScroll": true }二、通過 CSS 樣式禁止滾動 在頁面的WXSS文件中添加&…

用戶畫像(https://github.com/memodb-io/memobase)應用

1.下載項目的源代碼,我們要先啟動后端,用docker啟動 cd src/server cp .env.example .env cp ./api/config.yaml.example ./api/config.yaml 這里我的配置內容如下config.yaml(因為我是調用的符合openai格式的大模型,所以我沒改,如果要是別的大模型的話,需要自己再做兼容…

微信小程序生成某個具體頁面的二維碼

微信小程序&#xff0c;如果要生成某個具體頁面&#xff0c;而非首頁的二維碼&#xff0c;體驗和正式的生成方法如下&#xff1a; 1、體驗版二維碼&#xff1a; 管理---版本管理---修改頁面路徑&#xff0c;輸入具體頁面的路徑以及參數&#xff0c;生成的是二維碼 2、正式小程…

【今日三題】小樂樂改數字 (模擬) / 十字爆破 (預處理+模擬) / 比那名居的桃子 (滑窗 / 前綴和)

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;每日兩三題 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 小樂樂改數字 (模擬)十字爆破 (預處理模擬&#xff09;比那名居的桃子 (滑窗 / 前綴和) 小樂樂改數字 (模擬) 小樂樂改數字…

四旋翼無人機手動模式

無人機的手動模式&#xff08;Manual Mode&#xff09;是指飛手完全通過遙控器手動控制無人機的飛行姿態、高度、方向和速度&#xff0c;?無需依賴自動穩定系統或輔助功能?&#xff08;如GPS定位、氣壓計定高、視覺避障等&#xff09;。這種模式賦予操作者最大的操控自由度&a…

C++高精度算法(加、減、乘)

首先聲明&#xff0c;沒有除法是因為我不會&#xff08;手動狗頭_doge&#xff09; 簡介 顧名思義&#xff0c;高精度算法是用來算一些超級大的數&#xff0c;比如長到 longlong 都存不下的那種&#xff0c;還有就是小數點后好多位&#xff0c;double都存不下的那種&#xff…

思科交換機配置

以下是交換機配置的詳細步驟指南&#xff0c;適用于Cisco交換機&#xff0c;其他品牌需調整命令&#xff1a; 1. 初始連接與基本配置 連接方式&#xff1a;使用Console線連接交換機&#xff0c;通過終端軟件&#xff08;如PuTTY&#xff09;登錄。波特率&#xff1a;9600&…

數據質量問題中,數據及時性怎么保證?如何有深度體系化回答!

數據治理&#xff0c;數據質量這快是中大廠&#xff0c;高階大數據開發面試必備技能&#xff0c;企業基于大數據底座去做數倉&#xff0c;那么首先需要保障的就是數據質量。 數據質量的重要性在現代企業中變得越發突出。以下是數據質量的幾個關鍵方面&#xff0c;說明其對企業…

【學習筆記】CPU 的“超線程”是什么?

1. 什么是超線程&#xff1f; 超線程&#xff08;Hyper-Threading&#xff09;是Intel的技術&#xff0c;讓一個物理CPU核心模擬出兩個邏輯核心。 效果&#xff1a;4核CPU在系統中顯示為8線程。 本質&#xff1a;通過復用空閑的硬件單元&#xff08;如ALU、FPU&#xff09;&a…

閉包的理解

一、閉包的概念 當通過調用外部函數返回的內部函數后&#xff0c;即使外部函數已經執行結束了&#xff0c;但是被內部函數引用的外部函數的變量依然會保存在內存中&#xff0c;我們把引用了其他函數作用域變量的函數和這些被引用變量的集合&#xff0c;稱為閉包&#xff08;Clo…

從小米汽車事故反思 LabVIEW 開發

近期&#xff0c;小米汽車的一起嚴重事故引發了社會各界的廣泛關注。這起事故不僅讓我們對智能汽車的安全性產生了深深的思考&#xff0c;也為 LabVIEW 開發領域帶來了諸多值得汲取的知識與領悟。 在智能汽車領域&#xff0c;尤其是涉及到智能駕駛輔助系統時&#xff0c;安全是…

項目進度延誤的十大原因及應對方案

項目進度延誤主要源于以下十大原因&#xff1a;目標不明確、需求頻繁變更、資源配置不足或不合理、溝通不暢、風險管理不足、缺乏有效的項目監控、技術難題未及時解決、團隊協作效率低下、決策鏈過長、外部因素影響。其中&#xff0c;需求頻繁變更是導致延誤的關鍵因素之一&…

AI 賦能 DBA:如何用 DeepSeek 等大模型簡化數據庫管理工作

AI 賦能 DBA:如何用 DeepSeek 等大模型簡化數據庫管理工作 摘要: 數據庫管理員(DBA)的工作涉及 SQL 優化、故障排查、性能監控等復雜任務。而 DeepSeek、ChatGPT 等大模型可以大幅減少重復勞動,提高 DBA 的工作效率。本文將結合真實案例,介紹如何利用 AI 優化 DBA 工作流…

vxe-table4.6 + vue3.2 + ant-design-vue 3.x 實現對列的顯示、隱藏、排序

概要 vxe-table中的vxe-toolbar沒有拖拽功能&#xff0c;故自己實現 源碼 <template><a-popover v-model:visible"open" placement"bottomRight" trigger"click"><template #content><div class"content">…

c++基礎知識二

1.面向對象 1.1 定義 面向對象編程是一種程序設計方法,它將數據和操作數據的方法封裝在一起,形成類。類是一種用戶自定義的數據類型,它包含了數據和對數據的操作方法。面向對象編程的特點包括封裝、繼承、多態 1.2 訪問控制符 public 公有屬性,方法。都可以訪問 prot…