WEB MVC 框架領(lǐng)域中有一款叫做 Struts MVC 的前輩,曾經(jīng)也風(fēng)光無(wú)限。當(dāng)然,現(xiàn)在還是有很多企業(yè)在使用。Struts MVC 和 Spring MVC 是功能類型相同的框架,本體功能是一樣的。Struts MVC 相比較 Spring MVC, 沒(méi)有自己的生態(tài)圈。MVC 框架與其它框架有一個(gè)顯著的不同點(diǎn),MVC 是一個(gè)項(xiàng)目級(jí)別的架構(gòu)思想,MVC 框架用于程序的整體架構(gòu)設(shè)計(jì),Struts MVC 很多功能需要借助于 Spring 實(shí)現(xiàn),很顯然沒(méi) Spring MVC 與 Spring 的吻合度好。Spring MVC 后面是 Spring 這個(gè)靠山。愛(ài)屋及烏、就近原則會(huì)讓開(kāi)發(fā)者更趨向于選擇 Spring MVC。
Spring MVC 是什么?答案很簡(jiǎn)單,它是一個(gè) WEB MVC 框架。
使用 JAVA 作為開(kāi)發(fā)語(yǔ)言,Spring MVC 自然知道數(shù)據(jù)以對(duì)象的形式存在是正道。對(duì)于如何把后端的對(duì)象數(shù)據(jù)傳遞給前端,Spring MVC 有一套優(yōu)雅的解決方案。只需要簡(jiǎn)簡(jiǎn)單單的 2 步操作,便可以讓開(kāi)發(fā)者省心省力的把 OOP 數(shù)據(jù)序列化成 JSON 格式后響應(yīng)給瀏覽器。打開(kāi)項(xiàng)目中的 WebConfig 類文件,在其中添加如下代碼;@Beanpublic MappingJackson2HttpMessageConverter mappConverter() { MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter=new MappingJackson2HttpMessageConverter(); return mappingJackson2HttpMessageConverter;}Tips: 顧名思義,MappingJackson2HttpMessageConverter 就是一個(gè)消息轉(zhuǎn)換器,其作用就是把數(shù)據(jù)映射成 JSON 格式。Spring MVC 默認(rèn)情況下使用的是 jackson 插件完成具體的 JSON 格式序列化。打開(kāi) pom.xml 文件,在其中添加 jackson 依賴。<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.0</version></dependency>有了上面配置后,幾乎不需要再做任何多余的事情,便能夠把控制器中的 OOP 數(shù)據(jù)以 JOSN 方式序列化給瀏覽器。測(cè)試下面的控制器方法實(shí)例:@RequestMapping("/test02")@ResponseBodypublic User testJson02() { return new User("mk", "123");}控制器方法中直接返回一個(gè)對(duì)象,不用擔(dān)心,Spring MVC 會(huì)自動(dòng)轉(zhuǎn)換成 JOSN 格式后發(fā)送給瀏覽器,不信,可以試一下。在瀏覽器中輸入 http://localhost:8888/sm-demo/json/test02 。再查看瀏覽器中的結(jié)果。是不是顯示的很漂亮。
這部分需要配合 Spring MVC 的集成測(cè)試模塊。
MVC 是分離思想,對(duì)程序分層僅僅只是提供了指導(dǎo)性的想法,并沒(méi)有具體的可實(shí)施的方案。不同的項(xiàng)目中,具體的分層細(xì)節(jié)可由架構(gòu)師把控。經(jīng)過(guò)時(shí)間檢驗(yàn)后,行業(yè)中會(huì)存留一些事實(shí)上的標(biāo)準(zhǔn)。Spring MVC 就是一款為 WEB 項(xiàng)目提供的 MVC 分層框架,在基于 Spring 的基礎(chǔ)功能或借助于 Spring 生態(tài)圈中的其它功能模塊,為 WEB 項(xiàng)目提供了具體的 MVC 分層方案。隨著課程內(nèi)容的展開(kāi),大家會(huì)逐步體會(huì)到 Spring MVC 是如何使用 MVC 理念 撐起整個(gè) WEB 項(xiàng)目,以及如何簡(jiǎn)化開(kāi)發(fā)者的工作。但是,要真正了解 Spring MVC 的功能,則要先從理解 MVC 開(kāi)始。
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = SecurityConfig.class)@WebAppConfigurationpublic class CsrfShowcaseTests { @Autowired private WebApplicationContext context; private MockMvc mvc; @Before public void setup() { mvc = MockMvcBuilders .webAppContextSetup(context) .apply(springSecurity()) .build(); }...
本章節(jié)繼續(xù)和大家一起講解 Spring MVC 支持的視圖技術(shù)。其實(shí)除了有服務(wù)器端的視圖技術(shù),還有客戶端的視圖技術(shù)。區(qū)別在于,服務(wù)器端視圖技術(shù)的模板引擎采用服務(wù)器端語(yǔ)言,客戶端的視圖技術(shù)采用客戶端語(yǔ)言。兩者各有優(yōu)勢(shì)。主流開(kāi)發(fā)模式更偏向于客戶端的視圖技術(shù)。在客戶端對(duì)頁(yè)面進(jìn)行渲染,有效地減少了對(duì)服務(wù)器端的依賴,可以降低服務(wù)器端的承受壓力。這并不是絕對(duì)的,最后的選擇還是要根據(jù)項(xiàng)目的運(yùn)行場(chǎng)景做決定。在 Spring MVC 項(xiàng)目中使用 Thymeleaf ,配置過(guò)程并不復(fù)雜。跟著流程走,你將體驗(yàn)到 Thymeleaf 的魅力。視圖技術(shù)至少需要提供模板和模板引擎,Thymeleaf 也不例外。如果要在 Spring MVC 中使用 Thymeleaf ,需要告訴 Spring MVC 模板存放在哪里?模板引擎是誰(shuí)?Tips: 本章節(jié)使用純 JAVA 方法進(jìn)行配置。
要了解 Spring MVC 的功能特性,就需要從 WEB 應(yīng)用開(kāi)發(fā)的源頭說(shuō)起。WEB 應(yīng)用程序的主流開(kāi)發(fā)技術(shù)有 3 種:servlet;php;.net。Servlet 是基于 Java 語(yǔ)言的動(dòng)態(tài) web開(kāi)發(fā)技術(shù),Servlet 指的是 J2EE 中所提出來(lái)的企業(yè)級(jí)服務(wù)器開(kāi)發(fā)規(guī)范。原生 Servlet 構(gòu)建的 MVC 開(kāi)發(fā)模式有幾個(gè)缺點(diǎn):Servlet 本身采用單例設(shè)計(jì)模式,生命周期由服務(wù)器維護(hù),存在線程安全隱患的問(wèn)題;理論上講,每一次不同的 http 請(qǐng)求需要一個(gè) Servlet 組件來(lái)響應(yīng),當(dāng)請(qǐng)求類型比較多時(shí),Servlet 就會(huì)相應(yīng)增加,也意味著每一個(gè) Servlet 都可以成為進(jìn)入服務(wù)器的入口。想想你家里對(duì)外開(kāi)了好多扇門(mén),小偷終能找到破綻;隨著 Servlet 數(shù)量的增加,對(duì)服務(wù)器的存儲(chǔ)空間也會(huì)產(chǎn)生壓力;使用 Servlet 響應(yīng)用戶請(qǐng)求時(shí),每一個(gè)響應(yīng)邏輯都需要開(kāi)發(fā)者不厭其煩地做些重復(fù)的事情,如,解析請(qǐng)求包中的數(shù)據(jù)、構(gòu)建響應(yīng)包、設(shè)置頁(yè)面跳轉(zhuǎn)等等。這些問(wèn)題,在 Spring MVC 中都得到了很好的解決。使用 Spring MVC 時(shí),就只有一個(gè)門(mén)可以進(jìn)入應(yīng)用程序,這個(gè)門(mén)叫前端(中央)控制器,所有請(qǐng)求統(tǒng)一經(jīng)過(guò)這個(gè)前端控制器分流到具體的內(nèi)部響應(yīng)組件;Spring MVC 是 Spring 家族中的一員,有句話叫做“近水樓臺(tái)先得月”。使用 Spring MVC 時(shí)所需要的 WEB 組件也好、其它的邏輯組件也好,都經(jīng)由 Spring IOC 創(chuàng)建,Spring IOC 容器對(duì)組件的生命周期可進(jìn)行伸縮性設(shè)置管理,可根據(jù)組件特性保證其線程安全性;Spring MVC 和 Spring 有直屬血緣的關(guān)系,兩者完美結(jié)合,使得程序的安全性和穩(wěn)定性有一定的保證;Spring MVC 利用 Spring 的自動(dòng)注入功能,能輕松地裝配好各組件之間的依賴,開(kāi)發(fā)者只需要關(guān)注編寫(xiě)自己的業(yè)務(wù)邏輯便可,和所有框架理念一樣,解放雙手,釋放大腦。Spring MVC 設(shè)計(jì)的初衷,就是要做成一款輕量級(jí)框架,其內(nèi)在的原力讓我們一起在后續(xù)課程中慢慢釋放。
要真正理解、掌握 Spring MVC 的使用 ,前提是要有 Spring 的知識(shí)儲(chǔ)備。為什么?因?yàn)樗鼈兪且患胰?。大家都學(xué)過(guò) Spring ,知道 Spring 剛出世時(shí),提供了 IOC & DI 和 AOP 兩大核心功能模塊,這兩大核心模塊不亞于是編程界的倚天、屠龍,對(duì)企業(yè)項(xiàng)目開(kāi)發(fā)過(guò)程產(chǎn)生了巨大的影響。對(duì)初學(xué)者而言,所謂學(xué)習(xí) Spring ,其課程的主要內(nèi)容就是講解 IOC 和 AOP 的概念及其使用。后來(lái),Spring 在這 2 大核心功能的的基礎(chǔ)之上,延伸出更多的功能模塊,由這些功能模塊為企業(yè)項(xiàng)目開(kāi)發(fā)提供了較完整的、全方位的解決方案。spring 模塊體系總結(jié)一下,其實(shí) Spring 這個(gè)概念有 2 層含義:狹義角度: Spring 指的是 Spring Core 核心功能模塊。是一個(gè)個(gè)體概念;廣義角度: Spring 是一個(gè)提供了眾多功能模塊的生態(tài)圈。是一個(gè)整體概念。Spring MVC 和 Spring 的關(guān)系,也可以從 2 個(gè)方面理解:水平角度: Spring MVC 是 Spring 生態(tài)圈中的一個(gè)功能模塊。兩者是包含與被包含的關(guān)系;垂直角度: Spring MVC 是建立在 Spring 核心基礎(chǔ)功能之上的一個(gè)實(shí)用性的 WEB MVC 框架,是 Spring 的延伸和擴(kuò)展。Spring MVC 的版本是跟著 Spring 走的,Spring 3.X 是一個(gè)分水嶺,此版本提供更多實(shí)用性的功能,現(xiàn)在最新版本是 5.X 。本課程使用的是 5.1.13.RELEASE 。Tips: 學(xué)習(xí)時(shí),你可以根據(jù)需要更改版本號(hào),從使用角度來(lái)講,版本微調(diào)沒(méi)有多大區(qū)別。
直接使用 HttpServletRequest 封裝請(qǐng)求作用域級(jí)別的數(shù)據(jù),不能說(shuō)不好。但是,Spring MVC 存在的目的,就是為了簡(jiǎn)化開(kāi)發(fā)者的工作,動(dòng)不動(dòng)就要 Spring 把底層的原生 API 弄出來(lái),Spring MVC 存在的意義就不大了。HttpServletRequest 的功能是全方面的,存儲(chǔ)數(shù)據(jù)可以說(shuō)是它的副業(yè),為了一個(gè)數(shù)據(jù)存儲(chǔ),把它搬出來(lái),好像有點(diǎn)大材小用。其實(shí),你可以告訴 Spring MVC ,我只要 HttpServletRequest 的存儲(chǔ)功能。也就是說(shuō),只要 Spring MVC 引用出 HttpServletRequest 內(nèi)置的 map 對(duì)象就可以了。好了!現(xiàn)在重構(gòu)一下上面的實(shí)例,僅僅修改控制器 login()方法的代碼。@RequestMapping(value="/login",method=RequestMethod.POST)public String login(User user,Map map) { if("mk".equals(user.getUserName()) && "123".equals(user.getUserPassword())) { map.put("loginUser", user); return "index"; } return "fail";}還是 2 個(gè)參數(shù),user 參數(shù)就不啰嗦了。map 參數(shù)則是一個(gè)神奇的存在。在方法中一站,等于通知 Spring MVC ,幫我把某個(gè)作用域中的 map 對(duì)象引用出來(lái)。如前言中所述,作用域有 3 個(gè)級(jí)別,Spring MVC 怎么知道你要哪一個(gè)層面的作用域。既然沒(méi)有明說(shuō),Spring MVC 引用出來(lái)的是請(qǐng)求作用域也就是 HttpServletRequest 的內(nèi)置 map 對(duì)象。好了,你可以放心的和前面一樣測(cè)試代碼,在 index.html 頁(yè)面中你將看到登錄者的信息。搞了半天了,其實(shí)本質(zhì)上是一樣:一個(gè)直接把 HttpServletRequest 交給你用,一個(gè)僅僅只是把實(shí)現(xiàn)了存儲(chǔ)的那一部分功能交給你。有句話叫做透過(guò)現(xiàn)象看本質(zhì),Spring MVC 只是對(duì)原生 Servlet 開(kāi)發(fā)做了高級(jí)封裝。如同端午節(jié)吃棕子,禮品盒再怎么高級(jí)、漂亮,打開(kāi)后還是棕子。
一個(gè)應(yīng)用程序,當(dāng)功能越來(lái)越龐大、邏輯越來(lái)越復(fù)雜、代碼越來(lái)越多時(shí),必然會(huì)采用分而治之的方案。分,容易,如何分才能分得清晰、便于維護(hù),這是一個(gè)與管理有關(guān)的學(xué)問(wèn)。MVC 提出了一種分離的策略,這種想法或思想一問(wèn)世,便讓世人茅塞頓開(kāi)。MVC 的分離思想:把整個(gè)應(yīng)用程序中和用戶進(jìn)行交互的功能代碼歸納在一起,這部分代碼整體稱為 V (View 或叫視圖層);把專門(mén)用來(lái)進(jìn)行數(shù)據(jù)傳遞或數(shù)據(jù)邏輯處理的功能代碼歸納在一起,稱其為 M(Model 或叫l(wèi)模型層)。C 指的是哪一部分功能代碼呢?因?yàn)閂 和 M 是要經(jīng)常交流、溝通的,V 需要展示 M 處理過(guò)的數(shù)據(jù),同時(shí),M 也可能需要 V 提供的用戶交互時(shí)輸入的數(shù)據(jù)。雖然分了,但兩者之間存在依賴關(guān)系。我們不讓 V 和 M 直接交流,而是在兩者之間引入了一個(gè)叫做 C(控制器)的對(duì)象,所以說(shuō) C 就是 V 和 M 之間的橋梁!這個(gè) C(控制器)對(duì)象感覺(jué)在硬生生的拆散別人,不過(guò)這種拆分是善意且友好的。為什么這么說(shuō)?滿足 OOP 中的低耦合性原則,解耦 V 和 M 之間的關(guān)系;M 需要用戶交互時(shí)輸入的數(shù)據(jù)時(shí),可以不用管 V 是誰(shuí),只要有控制器傳數(shù)據(jù)就可以;同時(shí),V 也不用關(guān)心 M 在哪里,只要有數(shù)據(jù)提供給自己就可以。如果現(xiàn)在要編寫(xiě)一個(gè) WEB 視圖和 Swing 視圖的雙客戶端應(yīng)用程序時(shí),只需要換一個(gè) C 就可以,M 可以重用。
在 Web 框架中,架構(gòu)模式是其一個(gè)重要的特點(diǎn),往往一個(gè) Web 框架會(huì)在設(shè)計(jì)之初選定好一種架構(gòu)模式,然后開(kāi)始該模式設(shè)計(jì)和編寫(xiě)相關(guān)代碼,而 Django 則是基于 MTV 架構(gòu)的模式 。另一種流行的架構(gòu)模式為 MVC,它在 Java Web 框架中非常流行。MVC 全稱 Model View Controller,即模型 - 視圖 - 控制器。MTV 的全稱是 Model Templates View,即模型 - 模板 - 視圖。MTV 中的名詞解釋如下:模型:在程序中用于處理數(shù)據(jù)邏輯的部分,大部分情況下是對(duì)數(shù)據(jù)庫(kù)的增刪改查的操作;視圖:該層包含存取模型及調(diào)取恰當(dāng)模板的相關(guān)邏輯。用于封裝負(fù)責(zé)處理用戶請(qǐng)求及返回響應(yīng)的邏輯;模板 :用于處理用戶顯示部分的內(nèi)容,和 MVC 中的 V 是一樣的,通過(guò) HTML 展示。它使用模板方法可以動(dòng)態(tài)地生成 HTML。模板包含所需 HTML 輸出的靜態(tài)部分,以及一些特殊的語(yǔ)法,描述如何將動(dòng)態(tài)內(nèi)容插入。MTV 和 MVC 模式并沒(méi)有本質(zhì)上的區(qū)別,都是為了實(shí)現(xiàn)應(yīng)用的解耦,只是定義上有些不同。在 MTV 模式的 Web 框架中,沒(méi)有 Controll 層,這個(gè)是由框架內(nèi)部實(shí)現(xiàn),我們需要做的就是將 URL 對(duì)應(yīng)到視圖即可,通過(guò)這樣的 URL 配置,系統(tǒng)將一個(gè)請(qǐng)求發(fā)送到一個(gè)合適的視圖進(jìn)行處理。在 Django 框架中就實(shí)現(xiàn)了這樣一個(gè) URL 分發(fā)器,它幫助分發(fā) URL 請(qǐng)求到對(duì)應(yīng)的視圖。
從本節(jié)課開(kāi)始和大家一起學(xué)習(xí) Spring MVC。WEB MVC 框架有很多,但是,Spring MVC 卻有著其它 WEB MVC 框架無(wú)可比擬的優(yōu)勢(shì),本節(jié)課將從 以下幾個(gè)方面簡(jiǎn)要介紹 Spring MVC ,讓大家對(duì)它有一個(gè)初步印象。Spring MVC 與 Spring 的關(guān)系;Spring MVC 的功能;Spring MVC 的特性;Spring MVC 和其它 MVC 開(kāi)發(fā)框架的比較。
Spring MVC 提供有一個(gè)名為 CharacterEncodingFilter 過(guò)濾器組件,可以直接配置使用。在 WebInitializer 類的 onStartup() 方法中使用 CharacterEncodingFilter 替代自己的過(guò)濾器。@Overridepublic void onStartup(ServletContext servletContext) throws ServletException { super.onStartup(servletContext); CharacterEncodingFilter charEncodingFilter=new CharacterEncodingFilter(); charEncodingFilter.setEncoding("utf-8"); FilterRegistration.Dynamic register= servletContext.addFilter("encdoing", charEncodingFilter); register.addMappingForUrlPatterns( EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE), false, "/*"); }同樣的在瀏覽器中發(fā)送中文登錄請(qǐng)求,經(jīng)過(guò)過(guò)濾器的過(guò)濾后,中文亂碼問(wèn)題得到了很好的解決。CharacterEncodingFilter 很完美的解決了請(qǐng)求包的中文問(wèn)題,也解決了響應(yīng)瀏覽時(shí)的中文亂碼問(wèn)題。
spring-mvc.xml 用來(lái)配置與 Spring MVC 相關(guān)的組件信息,用來(lái)提供給 web 上下文對(duì)象進(jìn)行組件維護(hù)。這些組件包括 Spring MVC 核心組件和用戶控制器組件。<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 啟動(dòng)注解支持 --> <mvc:annotation-driven/> <!--靜態(tài)資源交給 tomcat default servelt 處理--> <mvc:default-servlet-handler /> <!--掃描組件位置--> <context:component-scan base-package="com.mk.web.action"></context:component-scan> <!-- 視圖解析器 --> <mvc:view-resolvers> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp"></property> <property name="suffix" value=".jsp"></property> </bean> </mvc:view-resolvers></beans>元素解釋說(shuō)明:mvc:annotation-driven: 啟動(dòng)注解支持,完全使用 XML 進(jìn)行 Spring MVC 項(xiàng)目維護(hù),并不是很方便。即使在使用 XML 時(shí),建議還是結(jié)合注解一起使用,這也是 Spring MVC 官方建議的;context:component-scan: 指定哪些組件由 Spring MVC 的上下文對(duì)象負(fù)責(zé)。除了 Spring MVC 內(nèi)部組件外,再就是用戶控制器;mvc:view-resolvers: 配置具體的視圖解析器。Tips: 映射器、適配器等組件可以不用顯示配置,采用 Spring MVC 默認(rèn)配置即可。
本節(jié)課程和大家講解了 Spring MVC 的驗(yàn)證框架,需要知道以下 2 點(diǎn):Spring MVC 驗(yàn)證框架采用的是服務(wù)器端驗(yàn)證模式;Spring MVC 框架集成了 JSR 驗(yàn)證框架,并沒(méi)有提供具體的實(shí)現(xiàn),本課程使用的是 Hibernate 提供的 JSR 具體實(shí)現(xiàn)模塊。Spring MVC 驗(yàn)證框架以注解的方式對(duì)數(shù)據(jù)進(jìn)行規(guī)則限制,方便,簡(jiǎn)潔,但因是服務(wù)器端驗(yàn)證,所以,對(duì)于一般性的、常規(guī)性的驗(yàn)證建議放在客戶端完成。
本節(jié)課和大家一起講解 Spring MVC 與 Spring 的關(guān)系,Spring 是基礎(chǔ),Spring MVC 是 Spring 向 WEB 應(yīng)用開(kāi)發(fā)方向的延伸。背靠 Spring 強(qiáng)大的基礎(chǔ)核心功能,讓 Spring MVC 快速崛起,成為現(xiàn)代企業(yè)開(kāi)發(fā)的標(biāo)配。Spring MVC 的具體功能是什么?本文從 MVC 聊起,意在讓大家明白 Spring MVC 為 WEB 項(xiàng)目提供了一種優(yōu)秀的 MVC 分層實(shí)現(xiàn)方案。
要把 MyBatis 集成到 Spring MVC 項(xiàng)目中,首先要做的第一件事情,便是添加 MyBatis 依賴包。僅僅添加 MyBatis 依賴包還不夠 ,因?yàn)?Spring MVC 并不直接支持 MyBatis,所以,需要借助于第三方的 mybatis-spring 插件包充當(dāng) MyBatis 和 Spring MVC 之間的橋梁。既然要連接到數(shù)據(jù)庫(kù),數(shù)據(jù)源是不能少的,本節(jié)課程使用 DBCP 做數(shù)據(jù)庫(kù)連接池,使用 MySql 做臺(tái)臺(tái)數(shù)據(jù)存儲(chǔ)系統(tǒng)。
經(jīng)過(guò)這一番折騰后,Spring MVC 項(xiàng)目的基礎(chǔ)架構(gòu)就完成了,把項(xiàng)目部署到服務(wù)器(tomcat)中。查看 tomcat 啟動(dòng)時(shí)的輸出日志中是否存在下面的信息。如果存在,表示 Spring MVC 項(xiàng)目初始化成功。在瀏覽器的地址欄中輸入:http://localhost:8888/sm-demo/Tips: 我的端口號(hào)是 8888。如果瀏覽器中輸出 Hello World ,恭喜,咱們?nèi)〉昧耸褂?Spring MVC 第一階段的成功。
Spring Boot 非常好用,但是并不是 0 基礎(chǔ)就可以直接上手的。Java 語(yǔ)言基礎(chǔ)是必備的,這個(gè)不必贅述。在學(xué)習(xí) Spring Boot 之前,最好是已經(jīng)對(duì) Spring 及 Spring MVC 框架有一定的了解。Spring Boot 是一個(gè)快速開(kāi)發(fā)框架,其技術(shù)基礎(chǔ)幾乎全部來(lái)源自 Spring 。所以本系列教程的學(xué)習(xí)基礎(chǔ),是 Java 、 Spring 及 Spring MVC 。其中 Spring MVC 是 Spring 大家庭的非常重要的一員,所以此處單獨(dú)拿出來(lái)強(qiáng)調(diào)下。
在 WEB 應(yīng)用程序中,經(jīng)常會(huì)以表單的方式提交數(shù)據(jù)。使用 Spring MVC 或其它 WEB MVC 框架開(kāi)發(fā)時(shí),框架本身會(huì)提供以對(duì)象為單位自動(dòng)封裝表單中數(shù)據(jù)的功能。本節(jié)課通過(guò)一個(gè)用戶注冊(cè)的小例子,和大家聊聊 Spring MVC 是如何優(yōu)雅的以對(duì)象的方式封裝表單中的數(shù)據(jù)。本節(jié)課程的重點(diǎn)就是請(qǐng)你一定要跟著課程案例練習(xí)一遍。
本節(jié)課程和大家一起聊了聊如何使用純 JAVA 的方式搭建 Spring MVC 項(xiàng)目 。通過(guò)本章節(jié)的學(xué)習(xí),大家一定要記住 DispatcherServlet 這個(gè)核心組件,并要理解 Spring MVC 項(xiàng)目中為什么需要 2 個(gè) WebApplicationContext 一起工作的。并深深地記住 JAVA 配置相關(guān)的幾個(gè)注解。
本節(jié)課程將向大家講解 Spring MVC 項(xiàng)目中如何處理中文信息。通過(guò)本節(jié)課程你也將學(xué)習(xí)到如何使用 JAVA 方式動(dòng)態(tài)配置過(guò)濾器。中文亂碼的解決方式可以自定義過(guò)濾器,也可以使用 Spring MVC 自帶的過(guò)濾器。本章節(jié)的重點(diǎn)是掌握過(guò)濾器的使用。
Spring MVC 為了解決 HTTP 協(xié)議的無(wú)狀態(tài)性,提供了很多能適用于不同作用域需求的模型對(duì)象,從而保證程序中的數(shù)據(jù)能在開(kāi)發(fā)者需要的地方出現(xiàn)。本節(jié)課繼續(xù)和大家聊聊 Spring MVC 中的數(shù)據(jù)模型組件。Model;ModelMap;ModelAndView。
本節(jié)課程將和大家講解在 Spring MVC 項(xiàng)目中如何集成 MyBatis 。Mybatis 為 Spring MVC 項(xiàng)目提供了數(shù)據(jù)庫(kù)訪問(wèn)能力,通過(guò)本次課程,你需要重點(diǎn)掌握集成的流程。本節(jié)課程通過(guò)一個(gè)登錄小案例引出對(duì) MyBatis 的使用。
本節(jié)課將和大家一起聊聊 Spring MVC 中的幾大核心組件,通過(guò)對(duì)這些組件的了解,你將對(duì) Spring MVC 的工作機(jī)制有更深入的理解,能更容易地編寫(xiě) Spring MVC 項(xiàng)目,也能輕松地解決程序運(yùn)行過(guò)程的問(wèn)題。本節(jié)課程,你將學(xué)習(xí)到:Spring MVC 的核心組件及其功能。對(duì)核心組件功能的理解將是本節(jié)的重點(diǎn);Spring MVC 核心組件的配置。本章節(jié)難點(diǎn)在于理解組件之間的依賴關(guān)系。Tips: 本主題內(nèi)容分上、下兩個(gè)章節(jié)講解。
本章節(jié)和大家一起講解了在 Spring MVC 項(xiàng)目中如何使用 MyBatis JDBC 框架。整個(gè)過(guò)程和單獨(dú)使用 MyBatis 沒(méi)有什么太多不同。差異在于,需要引入一個(gè)中間模塊,作為 MyBatis 和 Spring MVC 之間的橋梁。 引入的中間模塊提供有專用于 Sprig MVC 項(xiàng)目的 2 大組件:SqlSessionFactoryBean;MapperScannerConfigurer。利用這 2 大組件便能在 Spring MVC 中構(gòu)建起和 MyBatis 核心模塊之間的連接。
Spring MVC 項(xiàng)目可以真正意義上實(shí)現(xiàn)零 XML 配置,注意不是不配置,而是可以不使用 XML 配置。Spring MVC 提供了大量的注解,讓 JAVA 開(kāi)發(fā)者以自己最擅長(zhǎng)的 JAVA 語(yǔ)法編寫(xiě)配置信息。本節(jié)課程,將向大家介紹如何使用純 JAVA 的方式搭建 Spring MVC 項(xiàng)目,通過(guò)本節(jié)課程,你將學(xué)習(xí)到:了解搭建 Spring MVC 的流程。這既是本章節(jié)的難點(diǎn)也是重點(diǎn);了解純 JAVA 配置的重要注解。
原生 Servlet 開(kāi)發(fā)中,需要在 web.xml 中注冊(cè)、映射 Servlet 后瀏覽器才能請(qǐng)求到。 基于 Spring MVC 的 WEB 項(xiàng)目,用戶如何在瀏覽器中請(qǐng)求到用戶控制器?使用注解 2 步就可以搞定:在類前面添加 @Controller 注解,此注解的作用是通知 Spring MVC 的上下文對(duì)象(WebApplicationContext), 控制器的創(chuàng)建交給你了;@Controllerpublic class HelloAction { //省略……}在控制器的方法前面添加 @RequestMapping 注解。使用此注解可提供一個(gè)邏輯名向用戶映射此方法。@RequestMapping("/hello")public String hello() { System.out.pirntln("hello"); return "hello";}難道就這么簡(jiǎn)單,是的,要不咱們測(cè)試一下:重新向服務(wù)器發(fā)布 Spring MVC 項(xiàng)目;打開(kāi)瀏覽器,輸入 http://localhost:8888/sm-demo/hello 。然后,你會(huì)看到:Tips: 404 ?頁(yè)面資源沒(méi)找到,為什么會(huì)是這個(gè)樣子?哦!那是因?yàn)檫€沒(méi)有告訴 Spring MVC 當(dāng)控制器響應(yīng)瀏覽器請(qǐng)求時(shí),如何找到頁(yè)面視圖,這是視圖解析器組件的工作。好吧,等會(huì)兒,我們就會(huì)聊到視圖解析器。Tips: 怎么證明控制器被請(qǐng)求到,很簡(jiǎn)單,你將在控制臺(tái)上看到 hello 字符的輸出。
本節(jié)課程和大家一起聊聊在 Spring MVC 中如何使用原生 Servlet API。通過(guò)本節(jié)課程,你將學(xué)習(xí)到:使用 Servlet API 作為控制器方法的入?yún)?;使?Spring MVC 的 Servlet API 代理類作為控制器方法的入?yún)ⅲ皇褂?IO 流對(duì)象作為控制器方法的入?yún)?。本章?jié)重點(diǎn)在于理解 Spring MVC 高級(jí)組件與低級(jí)組件之間的關(guān)系。