亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
2. 前期準備

欲善其功,必先利其器。使用 Spring MVC 之前,準備好一系列的工具軟件。操作系統: 可以選擇 WIndows 或 Liunx 、MAC 。本課程選擇 WIndows 操作系統;IDE 工具: 本課程選擇 eclipse。這不是唯一、強制的要求,你可以選擇自己喜歡的開發工具;JAVA JDK : 這個不用多說,它是必須的。本文選擇 JDK 1.8+;服務器組件: 本文選擇 tomcat 8.X?;?Spring MVC 的開發本質還是編寫 JAVA 程序,區別在于 Spring MVC 提供了更高級層面的 API 組件。所以,開發時需要在項目中添加 Spring MVC 相關的 API 包。有 2 種方案可獲取這些 JAR 依賴包:進入 https://repo.spring.io/release/org/springframework/spring/5.1.13.RELEASE/,下載相對應的 JAR 包。除了要在項目中添加 Spring MVC 相關 JAR 包外,還需要添加 Spring 相關 JAR 包。對于初學者來講有一定的難度;Tips: 本課程采用 Spring Framework 5.1.13 版本。使用 Maven 依賴管理功能自動添加 Spirng MVC 項目所需要的依賴包。本課程使用此方案。

Spring MVC 簡介

spring 官方 logo

4.1 編寫控制器

Spring MVC 提供了很靈活的用戶控制器編寫方案。通過實現 Spring MVC 提供的 org.springframework.web.servlet.mvc.Controller 接口;public class HelloAction implements org.springframework.web.servlet.mvc.Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("Bean URL "); return null; }}Spring MVC 支持 POJO (普通 JAVA 類)充當控制器。public class HelloAction { public String hello() { return "hello"; }}Tips: 使用 POJO 充當用戶控制器,顯然要簡潔很多。這是常見的編寫方案。

3.2 調度中心

一次請求、響應的完成,需要多個組件通力合作。如何協調各個組件的工作,保證請求、響應過程有條不紊的進行,則需要一個指揮者或說一個核心靈魂組件。DispatcherServlet 就是每一次請求、響應過程中的組織者、調度者。Tips: DispatcherServlet 本質就是一個和 Spring MVC 程序一起啟動的 Servlet 。在現有的 MVC 框架,如 Struts MVC 中使用過濾器作為前端控制器。

3. Django 簡介

Django 是一個開放源代碼的 Web 應用框架,由 Python 寫成,它最初是被開發來用于管理一些以新聞內容為主的網站,即是CMS(內容管理系統)軟件。Django 是一個遵循 MVC 設計模式的框架。MVC 是 Model、View、Controller 三個單詞的簡寫,分別代表模型、視圖、控制器。Django 也是一個 遵循 MVC 設計模式的框架。MTV 是 Model、Template、View 三個單詞的簡寫,分別代表模型、模版、視圖 。

2. 適配器

所謂適配器組件,其本質就是運用適配器設計模式,匹配不兼容的接口規范。如上圖,調用者只能識別接口 2 類型,但是 A 提供的是接口 1 類型。適配器可以把接口 1 轉換成接口 2。這樣使用者就能使用 A 提供的功能了。為什么要使用適配器組件?欲解答這個問題,則先要了解如果不使用適配器組件,則如何編寫用戶控制器。既然稱為用戶控制器,則是開發者根據需要在框架外部定義的一個組件,Spring MVC 不可能未卜先知它的存在。如果要讓 Spring MVC 識別這個控制器,有一種方案 :預先定義好接口,強制性要求開發者在設計控制器時遵循接口規范。比如說實現 Controller 接口編寫控制器。@Controllerpublic class HelloAction implements org.springframework.web.servlet.mvc.Controller {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { return null;}}除此之外,Spriing MVC 提供有更靈活的用戶控制器設計方案,可使用 “ 普通 JAVA 類” 充當控制器,控制器中的方法也可由開發者隨性命名。此時,就需要適配器組件把這些不符合規范的控制器以統一的接口方式告訴給 Spring MVC 。Spring MVC 提供了 3 個默認適配器:org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter這些適配對象都實現了 HandlerAdapter 接口,此接口就有一個統一的內部調用方法。@NullableModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;簡要描述 3 個適配器的應用場景:SimpleControllerHandlerAdapter: 簡單的控制器處理器適配器,支持實現了 Controller 接口的控制器;HttpRequestHandlerAdapter: http 請求處理器適配器,要求編寫的控制器時實現 HttpRequestHandler 接口。此類控制器可以很方便的獲取請求包中的相關信息。但,真正使用的并不多;RequestMappingHandlerAdapter: 注解處理器適配器,適配使用了注解的用戶控制器。本課程中的就是使用了此適配器,此適配器的實現比前兩個都復雜。因為有適配器的存在,可以讓控制器的設計變得靈活。Tips: 這 3 類適配器都是 Spring MVC 默認提供的,可以不用顯示配置,除非有定制需求。

1. 前言

本章節將和大家一起聊聊 Spring MVC 是如何處理異常的。Spring MVC 框架中,將異常處理從業務邏輯中解耦出來,既保證了業務邏輯高度內聚性,又能實現了異常信息的統一處理和維護。很優雅的解決了異常的問題。通過本章節內容的學習,你將了解到 Spring MVC 內置的異常處理機制。將異常映射成 HTTP 狀態碼;全局異常處理器的使用。這個將是本章節的重點;與異常有關的注解。

4. 小結

本章節和大家一起講解視圖技術。每一種視圖技術都會有自己的模板語法,且模板需要經過模板引擎解析后才能輸送給瀏覽器。Spring MVC 支持多種視圖技術,本章節向大家介紹了在 Spring MVC 中如何使用 FreeMarker 視圖。一般在配置過程中需要指定模板文件的位置,以及指定具體的模板引擎實現。在本章節內容環節中也告訴了大家在 Spring MVC 中如何混合使用 JAVA 和 XML 兩種配置方案。

3. 前端控制器

深入了解前端控制器之前,先拋出一個問題:控制器是什么?別被控制器這個名字嚇住。其實和原生 Servlet 開發中開發者自定義的 Servlet 的功能是一樣的。當然,因為有 Spring 的加持,使用起來,是非常之輕量級的。Spring MVC 中的控制器有 2 類:中央控制器,或叫前端控制器: 由 Spring MVC 框架提供,對所有請求進行分流;用戶控制器,或叫響應控制器: 由開發者實現,用來響應用戶的具體請求。如登錄請求、注冊請求……前端控制器(DispatcherServlet)是 Spring MVC 中最核心的組件,相當于整個程序中的行政、調度中心。其它的組件都是它的附庸,為前端控制器提供相關的服務。Tips: DispatcherServlet 必須在 Spring MVC 項目啟動時被創建。DispatcherServlet 的純 JAVA 配置請查閱《純 JAVA 搭建 Spring MVC 項目》章節內容。DispatcherServlet 的基本功能。

2. Servlet API

使用 Spring MVC 框架,可以給開發者帶來諸多便利性,如自動綁定請求包中的數據、自動數據驗證……在 Spring MVC 構建的 WEB 項目中,其實也可以直接使用原生的 Servlet API 。但在真實項目中,還是少用為好,畢竟項目是有工期的??焖俚乾F代項目開發所追求的目標,這也是開發過程中選擇框架的目的。但是,了解本章節的知識,對于更好的理解 Spring MVC 有很大的幫助。先一起回憶幾個常用的 Srevlet API:HttpServletRequest: 用來處理請求包;HttpServletResponse: 用來處理響應包;HttpSession: 會話對象;ServletConfig: 配置對象;ServletContext: Servlet 上下文對象。這幾個 API 應該很熟悉。因為 Spring MVC 對原生 Servlet API 進行了高級封裝,使用 Spring MVC 開發時,開發者不需要直接使用原生 API ,但并不意味著我們不再需要它們,只是換了一種方式使用而已,由 Spring MVC 內部組件使用它們。Spring MVC 雖然封裝了底層 Servlet API 的使用,但并沒有切斷開發者直接對原生 Servlet API 的調用之路。對于需要使用原生 Servlet API 的場景,Spring MVC 提供了各種方便。只需要在控制器的方法中聲明需要使用的原生 API 類型做參數即可。@RequestMapping("/testApi01")public String hello(HttpServletRequest request,HttpServletResponse response) { return "success";}這一切都應該要感謝 Spring 強大的依賴注入功能??梢哉f,在 Spring 的世界里,你想要什么就有什么。調用上面方法時,Spring 就會注入你所需要的 API 對象。至于在方法中如何使用它,相信你一定已經游刃有余。如果你需要使用更多的原生 API。如上面代碼一樣,在方法參數中告訴 Spring 你所需要的 API 類型就可以了。@RequestMapping("/testApi02")public String hello(HttpSession session) { return "success";}

1. 前言

本節課和大家一起聊聊 Spring MVC 支持的主流視圖技術。通過本章節內容的學習,你將對視圖解析器有更本質的理解。也將了解到 Spring MVC 支持哪些主流視圖解析器。重點是要掌握各種視圖解析器的配置。

1. 前言

本章節將向大家講解 Thymeleaf 視圖技術 。Thymeleaf 和 Spring MVC 或 Spring Boot 有著較完美的契合度,是 Spring 官方建議的首選視圖技術。通過本節章節,你將學習到:Spring MVC 中如何使用 Thymeleaf 。這是本章節的重點也是難點;Thymeleaf 的特點;

1. 前言

本節課,將和大家一起聊聊 Spring MVC 在不同的作用域中如何封裝數據。繼續之前,先理解本節課程提出的數據模型概念:Spring MVC 提供的在特定作用域內封裝數據的組件。掌握理解數據模型組件的使用便是全文重點。

3.2 配置視圖解析器

視圖解析器需要在 Spring MVC 項目中顯示配置,Spring MVC 雖然提供了視圖解析器,但它不可能知道開發者會把物理視圖放在哪個位置,所以,需要通過配置指定物理視圖的真正位置。配置 InternalResourceViewResolver 很簡單。打開 WebConfig 配置類,在配置類中添加如下代碼;@Beanpublic InternalResourceViewResolver viewResolver() { InternalResourceViewResolver inResolver=new InternalResourceViewResolver(); inResolver.setPrefix("/WEB-INF/jsp/"); inResolver.setSuffix(".jsp"); return inResolver;}解釋一下上面的代碼:@Bean 注解表示此對象由 Spring 容器創建;inResolver.setPrefix ("/WEB-INF/jsp/") 表示 JSP 頁面視圖所在物理位置;inResolver.setSuffix (".jsp") 表示 JSP 視圖的后綴。Tips : 如果控制器中返回的是 “hello” 字符串,經視圖解析器解析后,則認為對應的物理視圖是 “/WEB-INF/jsp/hello.jsp”需要保證存在這個文件,否則瀏覽器上就會出現 404 錯誤。Ok 按要求在項目的 WEB-INF 目錄下創建 jsp 目錄,再在此目錄下創建名為 hello.jsp 文件,并編輯內容。再次在瀏覽器中輸入:http://localhost:8888/sm-demo/hello 。你會看到:Spring MVC 除了支持 JSP 視圖,還支持其它如:freemarker、thymeleaf 等視圖技術。會另設專題講解。

2.1 CAS 服務端

CAS 服務端是一套基于 Spring 框架構建的應用系統,是實現 SSO 的核心構成。其軟件層面可分為三個層次:Web 服務(Spring MVC、Spring Webflow)票據認證系統

2.1 攔截器的工作位置

Spring MVC 中的攔截器和 Servlet 中的過濾器的生命周期、以及服務的目標有差異性。過濾器的生命周期由服務器維護,當請求包進入服務器或響應包即將離開服務器時,過濾器將起作用。過濾器是在 DispatcherServlet 之前或之后工作,攔截器是請求經過 DispatcherServlet 后進行攔截。攔截器屬于 Spring MVC 組件,生命周期由 Spring 上下文容器對象維護。從細節上講,攔截器可以在用戶控制器之前、之后或視圖渲染完成之后行使攔截工作。

1. 前言

本節課程和大家一起講解 Spring MVC 框架是如何跨請求傳遞數據的,讓數據在重定向期間能被讀出來。你需要重點掌握對 RedirectAttributes 組件的使用。

2. 組件概述

現代企業項目,都是基于模塊或組件開發。Spring MVC 項目也是嚴格遵循這種約定和規范。WEB 應用程序的交互模式是基于請求與響應的。在請求、響應過程中,Spring MVC 不是一個人在戰斗,而是提供了眾多的組件一起協調工作。先請出 Spring MVC 中的 5 大核心組件,并用一句話概括其功能?;靷€眼熟,具體功能描述及使用方式在后面慢慢展開。前端控制器: 類似于超市的入口;用戶控制器: 類似于不同類型的貨品架,為用戶提供具體的商品買賣;映射器: 類似于超市里的導購員。請問,我要的這個牌子的辣椒醬在哪里,哦,在這里;適配器: 統一控制器,讓其有一致對外的接口;視圖解析器: 找到視圖,并負責渲染視圖。除了這幾大核心組件,還有其它的諸多輔助性組件,當使用到時再逐一介紹。

3.1 視圖解析器的功能

要講解視圖解析器,則需要回溯到用戶控制器上。@RequestMapping("/hello")public String hello() { return "hello";}用戶控制器中的方法的返回值可以是字符串,如果沒有視圖解析器的解析,這個字符串就是一個字符串。如果有了視圖解析器,則會把這個字符串當成一個視圖的邏輯名,并映射到真正的物理視圖。Tips:視圖解析器和映射器的有相似之處,映射器是入口時根據請求控制器邏輯名找到物理控制器,視圖解析器是出口時根據視圖邏輯名找到物理視圖。Spring MVC 默認使用的 InternalResourceViewResolver 作為視圖解析器, 提供對 JSP 視圖的支持。org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver無論是 Spring MVC 默認提供的、還是開發者自行定義的視圖解析器,都必須實現 ViewResolver 接口:public interface ViewResolver { @Nullable View resolveViewName(String viewName, Locale locale) throws Exception;}為什么不在用戶控制器的方法中直接返回物理視圖(完整資源路徑描述),而是使用視圖解析映射物理位置?答案很簡單:控制器中的響應代碼不需要知道視圖的具體物理位置,通過視圖解析器解耦控制器對視圖物理位置的依賴;通過獨立的視圖解組件可以擴展 Spring MVC 對各種不同視圖技術的支持。Spring MVC 就支持多達 13 種視圖技術;簡化控制器中的響應代碼;

1. 前言

實現文件上傳有很多方案。如使用原始的 IO 流或者使用第三方上傳插件。Spring MVC 自帶有文件上傳組件,能很容易地實現文件上傳功能。本節課程將和大家一起講解 Spring MVC 是如何處理文件上傳的。通過本章節內容的學習,你將掌握使用 MultipartResolver 相關組件簡單的實現文件上傳。

1. 前言

本章節將和大家一起講解如何使用 XML 方式搭建 Spring MVC 項目。雖然現在的快速開發平臺越來越好用,零 XML 配置的理念逐漸流行,但還是有些項目組還在延用或習慣使用 XML 方式。本節課的重點是你需要掌握使用 XML 配置的流程,最好和本系列的《純 JAVA 搭建 Spring MVC 項目》對比學習。

1. 前言

Spring MVC 框架的目的是為了解放開發者,讓開發者更專注于核心邏輯,它提供了很多輔助性功能模塊,來提高開發者的開發效率。本節課將和大家一起講解 Spring MVC 是如何使用下面的幾個注解解析請求包中的數據。@RequestParam ;@CookieValue;@RequestHeader;@PathVariable 。本章節的重點就是你要記住它們的使用場景。

3.3 兩個上下文對象

Spring 提供了很厲害的 IOC & DI 工廠,這個工廠對象在 web 項目中的具體名稱叫 WebApplicationContext,也稱其為上下文對象,用來創建 Spring MVC 項目中的各色功能組件。所以,欲使用 Spring MVC,則先要想辦法創建上下文對象。Spring 建議 Spring MVC 項目中提供 2 個 WebApplicationContext 對象:一個 WebApplicationContext 對象用來創建 Spring MVC 相關的組件,稱其為 Web 上下文對象 ;一個用來創建程序中其它的具體功能組件(如邏輯組件、數據層訪問組件……),稱其為 Root (根)上下文對象 。兩個上下文對象各自負責的組件范圍如果只創建一個 WebApplicationContext 對象會產生什么結果?如果僅僅是測試、學習,從初期來看,沒有什么不可。從長遠來看,建議還是聽從建議。Tips: 這兩個 WebApplicationContext對象存在底層上的差異性。一個支持事務,另一個不支持。有各自的職責。Spring MVC 提供了一個叫 DispatcherServlet 的組件(本質就是一個 Servlet),此組件用來作為進入程序的唯一入口。是 Spring MVC 項目的“門神”。Tips: 可稱 DispatcherServlet 為中央控制器或前端控制器。好了!現在理一下頭緒:一定要在整個項目運作之前先讓 DispatcherServlet 組件開始工作,DispatcherServlet 除了充當門神外,還會創建一個與自己有關聯的 WebApplicationContext 工廠對象,即 Web 上下文對象;Spring 另提供有名為 ContextLoaderListener 的監聽器組件,它可以監聽程序的啟動過程,并在程序啟動時創建另一個 WebApplicationContext 工廠對象,即 Root 上下文對象。

3. 自定義攔截器

Spring MVC 內置有很多攔截器。這些攔截器提供的功能,基本上能夠滿足開發者完成常規開發。但是,需求總是瞬息變化的,開發者可以根據自己的業務需求自定義攔截器。

6. 小結

本節課和大家一起講解了 Spring MVC 中的 前端控制器、用戶控制器、映射器的功能及使用方式 。其它的幾個核心組件將在下一章節中和大家一一展開。一個完整的 Spring MVC 項目不僅僅只依靠這幾大組件,還有更多的組件在后臺默默地付出著。隨著學習的深入,這些組件也將會逐步出現在大家面前。

2.1 返回字符串

給出一個控制器的實例代碼,這個代碼很普通,不同之處在于方法前面使用了 @ResponseBody 注解。 于是,這個方法的命運被改變了。@Controller@RequestMapping("/json")public class JsonAction { @RequestMapping("/test01") @ResponseBody public String testJson() { return "Hello"; }}控制器方法有 @ResponseBody 注解和沒有此注解,Spring MVC 對控制器方法的返回值的理解迥然不同。沒有 @ResponseBody 注解:Spring MVC 會把返回值 “hello” 理解為視圖邏輯名,通過視圖解析器找到視圖物理位置;有 @ResponseBody 注解: Spring MVC 會把返回值直接寫入響應包后交給瀏覽器。意味著不需要視圖解析器的參與。測試一下上面實例。打開瀏覽器,在地址欄上輸入:http://localhost:8888/sm-demo/json/test01 。你在瀏覽器將看到如下圖所示結果:

3. 小結

本節課和大家一起學習了 Spring MVC 中的數據模型。所謂數據模型,就是用來裝數據的組件,當然,因 WEB 應用程序的特殊性,更多是要討論存放在這個組件中的數據在一個什么樣的范圍之內能夠被使用。本節課學習到了,可以直接使用原生的 HttpServletRequest 完成請求作用域數據的存儲,觸類旁通,當然,你也可以直接使用原生 HttpSession 對象,保存會話作用域級別數據的保存。有時,不需要為了吃一個桃子,砍掉一棵樹。開發者可以使用 Spring MVC 引用出內部的存儲對象,這樣更小巧實用。是的,本節課程中出現的 map 是 Spring MVC 中的數據模型組件。

5. 映射器

映射器的作用就是檢查用戶的請求路徑中是否存在對應的控制器組件。Tips: 有點類似于導購員??蛻魣笠粋€商品名,然后告訴你真正的商品所在位置。使用 Spring MVC 時,如果開發者沒有顯示配置映射器,Spring MVC 會啟動默認的映射器組件。在 DispatcherServlet 所在包的根目錄下有名為 DispatcherServlet.properties 的文件,已經配置了很多默認組件信息,開發者不用做任何配置,便能啟動這些組件工作。打開此文件可以看到有 2 種類型的映射器信息:org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping這兩個映射器分別為哪一種請求尋找控制器了?回答這個問題之間,先了解用戶控制器的映射方式。前面提到可使用 @RequestMapping 注解對外映射控制器組件。其實 Spring MVC 還可以使用 @Bean 注解實現相同的功能 。先假設存在如下的控制器:public class HelloAction { public String hello() implements Controller{ System.out.println("hello"); return "hello"; }}@Bean 注解映射: 打開項目中的 WebConfig 配置類,添加如下代碼; @Bean(name = "/hello") public HelloAction hello() { return new HelloAction(); }Tips: “hello” 前面一定要加上 “/” 。如果使用 @Bean 注解的方式映射控制器,則用戶控制器需要實現 org.springframework.web.servlet.mvc.Controller 接口, 意味著必須是一個標準的控制器。此處的 @Bean 的作用就是告訴 Spring MVC:你要創建它,其名字被當成一個訪問控制器的 URL。BeanNameUrlHandlerMapping 映射器的功能就是查找有沒有哪一個 Bean 的名字和用戶請求的路徑相匹配。RequestMappingHandlerMapping 映射器就是查找由 @RequestMapping 注解映射的控制器。無論使用這 2 種映射器的哪一種,理論上都無需顯示配置。Spring 會根據你的請求信息選擇對應的映射器。顯然,使用 @RequestMapping 映射更直接、可觀。所以,RequestMappingHandlerMapping 映射器使用的更多。

4. 小結

本章節和大家一起講解 Spring MVC 框架的重定向過程中是如何實現數據傳遞的,傳遞方式歸納起來就 2 種:通過 URL 附加數據的方式傳遞數據;使用 Spring MVC 提供的 RedirectAttributes 組件實現數據的傳遞。兩種方式各有屬于自己的應用場景,數據量不多時可以使用第一種方案。數據以對象方式進行傳遞時可使用第二種方案。

2. MultipartResolver 組件

多數情況下,頁面中的數據都是以字符串格式發送給服務器。但有時,用戶需要上傳自己的個人頭像或者上傳文件,或者說以二進制的方式進行數據傳送。這時就不能使用字符串的方式傳遞數據了。Spring MVC 提供有 MultipartResolver 相關組件實現文件上傳,不需要特別引入第三方模塊。默認情況下,Spring MVC 沒有啟用文件上傳組件,使用前需要做些簡單的配置。

直播
查看課程詳情
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號