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