SpringMVC核心、兩種視圖解析方法、過濾器攔截器 “ / “ 的意義

SpringMVC的執行流程

1. Spring MVC 的視圖解析機制

Spring MVC 的核心職責之一是將數據綁定到視圖并呈現給用戶。它通過 視圖解析器(View Resolver) 來將邏輯視圖名稱解析為具體的視圖文件(如 HTML、JSP)。

核心流程

  1. Controller 處理請求

    • Controller 方法可以通過返回 邏輯視圖名稱ModelAndView 對象來決定視圖和數據。
  2. 視圖解析器解析視圖名稱

    • 視圖名稱由 ViewResolver 解析為實際視圖文件路徑。
  3. 模型數據綁定到視圖

    • 數據由 ModelModelAndView 提供,Spring MVC 會將數據傳遞給視圖引擎渲染。

常見視圖解析器

  1. Thymeleaf 視圖解析器

    • Spring Boot 默認集成了 Thymeleaf,只需配置模板路徑:

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

  1. JSP 視圖解析器

    • 通過 InternalResourceViewResolver? 或者xml配置文件配置:
    • @Bean
      public InternalResourceViewResolver jspViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;
      }
      


2. ModelModelAndView 的作用與區別

2.1 Model 的作用

  • 職責:僅負責傳遞數據。
  • 特點
    • Model 是一個數據容器。
    • 不能直接設置視圖名稱。
    • Spring 自動將 Model 中的數據綁定到視圖。
  • 常用場景
    • 數據簡單,視圖名稱固定,返回視圖邏輯名稱。
@RequestMapping("/exampleModel")
public String example(Model model) {model.addAttribute("message", "Hello from Model");return "viewName"; // 返回邏輯視圖名稱
}

2.2 ModelAndView 的作用

  • 職責:同時封裝視圖名稱和數據。
  • 特點
    • 既可以設置視圖名稱,也可以傳遞數據。
    • 可以動態調整視圖名稱和數據,靈活性更高。
  • 常用場景
    • 視圖名稱需要動態確定,或者需要同時設置多個數據。
@RequestMapping("/exampleModelAndView")
public ModelAndView exampleModelAndView() {ModelAndView mav = new ModelAndView();mav.setViewName("viewName"); // 設置視圖名稱mav.addObject("message", "Hello from ModelAndView");return mav;
}

2.3 ModelModelAndView 的對比

特性ModelModelAndView
職責傳遞數據傳遞數據并設置視圖名稱
視圖名稱設置通過返回值設置通過 setViewName 設置
靈活性較低較高
適用場景固定視圖名稱,數據傳遞較簡單的場景動態視圖名稱或需要同時傳遞多個數據的場景

3. ModelModelAndView 配合視圖解析的用法

以下分別說明 ThymeleafJSP 的用法。


3.1 配合 Thymeleaf

(1)使用 Model

通過 Model 傳遞數據,并返回視圖的邏輯名稱。

@RequestMapping("/thymeleaf/model")
public String useModel(Model model) {model.addAttribute("message", "Hello from Model");model.addAttribute("title", "Thymeleaf Example");return "example"; // 解析為 /templates/example.html
}

對應 Thymeleaf 模板文件 (example.html):

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title th:text="${title}">Default Title</title>
</head>
<body><h1 th:text="${message}">Default Message</h1>
</body>
</html>

(2)使用 ModelAndView

通過 ModelAndView 同時設置視圖名稱和數據。

@RequestMapping("/thymeleaf/modelAndView")
public ModelAndView useModelAndView() {ModelAndView mav = new ModelAndView();mav.setViewName("example"); // 解析為 /templates/example.htmlmav.addObject("message", "Hello from ModelAndView");mav.addObject("title", "Thymeleaf Example with ModelAndView");return mav;
}

3.2 配合 JSP

(1)使用 Model

通過 Model 傳遞數據,并返回視圖的邏輯名稱。

@RequestMapping("/jsp/model")
public String useModel(Model model) {model.addAttribute("message", "Hello from Model");model.addAttribute("title", "JSP Example");return "example"; // 解析為 /WEB-INF/views/example.jsp
}

對應 JSP 文件 (example.jsp):

<!DOCTYPE html>
<html>
<head><title>${title}</title>
</head>
<body><h1>${message}</h1>
</body>
</html>

(2)使用 ModelAndView

通過 ModelAndView 同時設置視圖名稱和數據。

@RequestMapping("/jsp/modelAndView")
public ModelAndView useModelAndView() {ModelAndView mav = new ModelAndView();mav.setViewName("example"); // 解析為 /WEB-INF/views/example.jspmav.addObject("message", "Hello from ModelAndView");mav.addObject("title", "JSP Example with ModelAndView");return mav;
}

3.3 總結

特性ThymeleafJSP
視圖路徑配置classpath:/templates//WEB-INF/views/
支持數據傳遞支持 ModelModelAndView支持 ModelModelAndView
模板引擎風格現代化 HTML5傳統 Java 模板
性能高效較低

4. 綜合總結

4.1 ModelModelAndView 的選擇

  1. 簡單場景:使用 Model 配合返回視圖邏輯名稱。
  2. 復雜場景:使用 ModelAndView 同時設置視圖名稱和數據。

4.2 配合視圖解析器

  • ThymeleafJSP 均支持 ModelModelAndView,用法完全一致。
  • 如果是新項目,推薦使用 Thymeleaf。

4.3 推薦實踐

  • 優先使用 Model 和邏輯視圖名稱返回方式,更簡潔清晰。
  • 在需要動態調整視圖名稱或復雜數據傳遞時,使用 ModelAndView

過濾器、攔截器、路徑匹配規則與應用

以下是關于 過濾器(Filter)攔截器(Interceptor) 的核心內容,以及路徑匹配中 //*/** 的使用規則和場景總結。


1. 過濾器(Filter)

1.1 定義

  • 屬于 Servlet 規范的一部分,運行在 Servlet 容器中。
  • 用于對所有 HTTP 請求和響應進行預處理和后處理。

1.2 特點

  • 作用范圍廣:可以作用于動態資源(如 API 請求)和靜態資源(如 HTML、CSS、JS)。
  • 生命周期:由 Servlet 容器管理,啟動時初始化過濾器,容器銷毀時釋放過濾器。
  • 使用場景:適用于跨域處理、編碼設置、訪問日志記錄、請求參數過濾等基礎功能。

1.3 示例

  • 典型實現
    @WebFilter("/*")
    public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("Filter: Before processing request");chain.doFilter(request, response); // 執行后續邏輯System.out.println("Filter: After processing request");}
    }
    


2. 攔截器(Interceptor)

2.1 定義

  • 屬于 Spring 框架的一部分,運行在 Spring MVC 的 DispatcherServlet 內部。
  • 用于攔截由 Spring 處理的動態資源(如控制器方法)。

2.2 特點

  • 作用范圍窄:僅作用于 Spring MVC 控制的請求(動態資源)。
  • 生命周期:由 Spring 容器管理,在 Spring 啟動時加載,關閉時銷毀。
  • 使用場景:適用于業務權限校驗、登錄校驗、動態數據封裝等業務邏輯。

2.3 示例

  • 典型實現

    public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("Interceptor: Before handling request");return true; // 返回 false 會中斷請求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception {System.out.println("Interceptor: After handling request");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("Interceptor: After rendering view");}
    }
    

  • 攔截器注冊

    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/api/**") // 攔截所有 /api 的請求.excludePathPatterns("/static/**"); // 排除靜態資源}
    }
    


3. 過濾器與攔截器的區別

特性過濾器(Filter)攔截器(Interceptor)
作用范圍全局,包含靜態資源和動態資源僅作用于 Spring MVC 處理的動態資源
觸發時機DispatcherServlet 之前運行DispatcherServlet 內部運行
適用場景跨域、編碼設置、日志記錄、IP 限制等基礎功能登錄校驗、權限校驗、業務邏輯處理等
生命周期管理由 Servlet 容器管理由 Spring 容器管理
實現方式實現 Filter 接口實現 HandlerInterceptor 接口
路徑匹配能力通過 /* 等規則匹配所有請求路徑支持 /**,匹配所有路徑,包括多級子路徑
靜態資源支持支持靜態資源(如 HTML、CSS、JS)不支持靜態資源,只作用于動態請求

4. 路徑匹配規則與應用

4.1 匹配規則

規則匹配范圍適用場景
/僅匹配根路徑 /網站首頁、主路徑請求
/*匹配當前路徑下的一級子路徑靜態資源過濾、一級子路徑匹配
/**匹配當前路徑及其所有層級子路徑攔截器配置、遞歸匹配所有子路徑

5. 綜合推薦

  1. 過濾器(Filter)

    • 如果需要對所有請求(包括靜態資源)進行操作,使用 /*
    • 常見場景:日志記錄、編碼設置、跨域處理。
  2. 攔截器(Interceptor)

    • 如果需要對動態請求(如 API 請求)進行操作,使用 /**
    • 常見場景:登錄校驗、權限控制、封裝業務邏輯。
  3. 路徑匹配規則

    • /:適用于根路徑請求。
    • /*:適用于當前路徑的一級子路徑。
    • /**:適用于所有子路徑的遞歸匹配。

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

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

相關文章

抽象類和接口的區別是什么?

抽象類和接口在編程中都是用來定義對象的公共行為的重要概念&#xff0c;但兩者之間存在顯著的區別。以下是對抽象類和接口的詳細比較&#xff1a; 一、定義與關鍵字 抽象類&#xff1a;使用abstract關鍵字定義&#xff0c;表示該類是抽象的&#xff0c;不能被實例化。抽象類…

html+css+js網頁設計 美食 美拾9個頁面

htmlcssjs網頁設計 美食 美拾9個頁面 網頁作品代碼簡單&#xff0c;可使用任意HTML輯軟件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html編輯軟件進行運行及修改編輯等操作&#xff09;。 獲取源碼 1&#xff0…

Linux下PostgreSQL-12.0安裝部署詳細步驟

一、安裝環境 postgresql-12.0 CentOS-7.6 注意&#xff1a;確認linux系統可以正常連接網絡&#xff0c;因為在后面需要添加依賴包。 二、pg數據庫安裝包下載 下載地址&#xff1a;PostgreSQL: File Browser 選擇要安裝的版本進行下載&#xff1a; 三、安裝依賴包 在要安…

『VUE』vue-quill-editor設置內容不可編輯(詳細圖文注釋)

目錄 預覽思路調用代碼借助Props添加isDisable屬性控制 是否內容可編輯總結 歡迎關注 『VUE』 專欄&#xff0c;持續更新中 歡迎關注 『VUE』 專欄&#xff0c;持續更新中 預覽 思路 禁用焦點事件和內容改變事件 調用代碼 <quillEditorclass"editor":class"…

python 和go 語法對比

Python 和 Go 是兩種設計哲學和應用場景有所不同的編程語言&#xff0c;它們在語法、類型系統、并發模型等方面存在顯著差異。以下是 Python 和 Go 語法特點的詳細對比&#xff1a; 語法簡潔性與結構 Python 的語法以其簡潔易讀而著稱。它使用縮進來表示代碼塊的層次結構&…

我們來學activiti -- bpmn

bpmn 題記bpmn結余 題記 在《Activiti很難學》提到學習知識點需要面對的思想鋼印問題 按常見步驟&#xff0c;先展示下官方的客套話 BPMN&#xff08;Business Process Model and Notation&#xff09;是一種業務流程建模符號&#xff0c; 它是一種圖形化的語言&#xff0c;用…

【MuJoCo和PhysX】

MuJoCo 與 Unity 的 PhysX 引擎的主要區別 應用領域&#xff1a; MuJoCo&#xff1a;主要用于機器人學、強化學習、生物力學等領域&#xff0c;擅長處理多自由度、復雜動力學問題&#xff0c;尤其適合進行高精度的物理仿真。 Unity PhysX&#xff1a;主要用于游戲開發、虛擬現…

LeetCode:257. 二叉樹的所有路徑

跟著carl學算法&#xff0c;本系列博客僅做個人記錄&#xff0c;建議大家都去看carl本人的博客&#xff0c;寫的真的很好的&#xff01; 代碼隨想錄 LeetCode&#xff1a;257. 二叉樹的所有路徑 給你一個二叉樹的根節點 root &#xff0c;按 任意順序 &#xff0c;返回所有從根…

十二月第五周python

第一個程序&#xff0c;熟悉轉換器&#xff0c;把加法計算器變成exe# // 1,制作加法計算器&#xff0c; # 輸入兩個數字得到相加結果并輸出aint(input("輸入數字&#xff1a;"))#int()是把輸入的內容轉換成整數&#xff0c; bint(input("輸入數字&#xff1a;&…

FFmpeg 的常用API

FFmpeg 的常用API 附錄&#xff1a;FFmpeg庫介紹 庫介紹libavcodec音視頻編解碼核心庫編碼 (avcodec_send_frame, avcodec_receive_packet)。解碼 (avcodec_send_packet, avcodec_receive_frame)。libavformat提供了音視頻流的解析和封裝功能&#xff0c;多種多媒體封裝格式&…

關于最新MySQL9.0.1版本zip自配(通用)版下載、安裝、環境配置

一、下載 從MySQL官網進行下載MySQL最新版本&#xff0c;滑到頁面最下面點擊社區免費版&#xff0c;&#xff08;不是企業版&#xff09; 點擊完成后選擇自己想要下載的版本&#xff0c;選擇下載zip壓縮&#xff0c;不用debug和其他的東西。 下載完成后進入解壓&#xff0c;注…

vulnhub靶場 Empire LupinOne

使用命令查看靶機ip,訪問ip arp-scan -l 使用御劍掃描一下子域名&#xff0c;但是沒有獲取到什么有用的信息 這是一個Apache文檔&#xff0c;沒有什么用 緊接著我們嘗試暴力破解&#xff0c;這里推薦使用ffuf工具暴力破解目錄&#xff0c;kali自帶的ffuf掃描速度賊快 參數解釋…

Kubernetes# Helm工具使用

目錄 概念 核心組件 Helm客戶端 Tiller Chart Repository Release Helm安裝 Helm使用 創建Helm Chart 定義Chart元數據 定義Template模板 定義values參數 打包和部署 Helm Chart 推送到遠程倉庫 Helm常用命令 概念 Helm 是一個 Kubernetes 的包管理工具&#…

Mirror網絡框架-從入門到精通之Mirror簡介

前言 在現代游戲開發中&#xff0c;網絡功能日益成為提升游戲體驗的關鍵組成部分。Mirror是一個用于Unity的開源網絡框架&#xff0c;專為多人游戲開發設計。它使得開發者能夠輕松實現網絡連接、數據同步和游戲狀態管理。本文將深入介紹Mirror的基本概念、如何與其他網絡框架進…

Yocto 項目中的交叉編譯:原理與實例

Yocto 項目是一個強大的工具集&#xff0c;它專注于為嵌入式系統生成定制的 Linux 發行版。交叉編譯在 Yocto 項目中扮演著核心角色&#xff0c;它使得開發者能夠在功能強大的宿主機上構建適用于資源受限目標設備的軟件系統。這篇文章將從運行原理、實際案例和工具鏈組成等角度…

python學opencv|讀取圖像(二十二)使用cv2.polylines()繪制多邊形

【1】引言 前序學習進程中&#xff0c;已經掌握了使用pythonopencv繪制線段、矩形和圓形的基本操作&#xff0c;相關鏈接包括且不限于&#xff1a; python學opencv|讀取圖像&#xff08;十八&#xff09;使用cv2.line創造線段-CSDN博客 python學opencv|讀取圖像&#xff08;…

教師管理系統

大概功能&#xff1a; 1.顯示所有教師 2.按姓名查找教師 3.按工號查找教師 4.增加教師 5.刪除教師 6.退出 數據會保存到 txt 文件里面 姓名&#xff1a;必須是中文 手機號碼&#xff1a;必須是11位&#xff0c;必須是數字 效果展示&#xff1a; 代碼展示&#xff1a; Teache…

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段&#xff1a;定義小程序頂部、底部 tab 欄&#xff0c;用以實現頁面之間的快速切換&#xff1b;可以通過 tabBar 配置項指定 tab 欄的表現&#xff0c;以及 tab 切換時顯示的對應頁面&#xff1b; 在上面圖中&#xff0c;標注了一些 tabBar …

[Wireshark] 使用Wireshark抓包https數據包并顯示為明文、配置SSLKEYLOGFILE變量(附下載鏈接)

wireshark 下載鏈接&#xff1a;https://pan.quark.cn/s/eab7f1e963be 提取碼&#xff1a;rRAg 鏈接失效&#xff08;可能會被官方和諧&#xff09;可評論或私信我重發 chrome與firefox在訪問https網站的時候會將密鑰寫入這個環境變量SSLKEYLOGFILE中&#xff0c;在wireshark…

Android筆記(四十一):TabLayout內的tab不滾動問題

背景 假設二級頁面是上面圖片的布局&#xff0c;當進來時TabLayout和ViewPager2綁定完就馬上調setCustomItem&#xff0c;跳轉到最后一個tab頁面時&#xff0c;會發現tab不滾動&#xff0c;手動滑一下ViewPager2時才會滾動tab到正確的位置 原因分析 調用TabLayoutMediator.at…