idea設置maven在下載依賴的同時把對應的源碼下載過來。圖0:
主要實現零配置來完成springMVC環境搭建,固然如今有了springBoot也是零配置,可是不少同仁都是從spring3.x中的springMVC直接過渡到springBoot的,spring3.x的MVC大部分都是經過xml配置文件來完成(xml配置文件這種方式如下簡稱schema-based),其實在SpringBoot以前springMVC也是能夠實現零配置文件(經過javaConfig和annotation實現0配置,如下簡稱code-based)。①而且在spring的官方文檔裏面的QUICK START裏面的例子也是基於code-based的。後面會給出文檔的附圖。本文的重點在於經過spring官方文檔來學習spring技術,而不去討論schema-based與code-based孰優孰劣。
spring的兩個重要的術語:html
1)、若是你的程序主要是經過配置文件(xml)來構建了,spring稱這種編碼風格爲Schema-based。
這個能夠在官方文檔來解釋。②如spring對於AOP也提供兩種風格實現,即Schema-based和@AspectJ-based(也就是xm方法l和Aspectj註解的方法)。java
2)、若是你的代碼是基於spring javaConfig來實現的spring稱這種代碼風格爲code-based。
搞清這個對閱讀本文以及閱讀spring文檔都很重要。spring官網程序員
圖1:
web
spring官網首頁(截圖不全)。首頁介紹了spring公司的主要項目,其中有幾個咱們耳熟能詳的,譬如springBoot,springData,springCloud等等。能夠點開每一個項目看看基本的介紹,好比咱們點開上面的spring framework項目。能夠看到 圖2:面試
這是spring Framework項目的主頁,上面有個Introduction,就是產品介紹。大概意思就是spring framework是一個綜合的程序,能夠作企業級開發,是輕量級的等等。在Introduction上面有個QUICK START的按鈕,意思是快速開始spring Framework的技術開發,點擊後能夠看到一個簡單的應用。圖3:ajax
首先spring提供兩種方法來開發spring Framework項目spring
①第一種是maven ②第二種是Gradle 上圖紅線標記地方能夠切換,看不一樣方法的代碼
默認是maven,使用maven開發spring framework入門項目只須要經過maven去依賴spring-context(spring最核心的文件)。繼而就可使用基本的spring Framework技術了。從官方的這個quick start例子(紅箭頭標記的地方)能夠看出spring仍是推薦咱們使用code-based這種編碼風格的(解釋了文章開頭用①那段文字)。spring的code-based這種編碼風格是基於spring javaConfig(springJavaConfig 若是沒記錯應該spring2.5之後的技術,這裏不作討論)。編程
這個QUICK START例子很簡單,咱們只須要看看,看看spring怎麼編碼的就夠了。再回到這個頁面的上面,能夠看到咱們所謂的spring framework到底包含了那些技術呢?就好比咱們經常說J2EE,那麼所謂的J2EE包含了那些技術呢?J2EE只是一個標準,包含了XML,JSP,SERVLET,JDBC等等等等技術,那麼這裏的spring framework只是一個項目,他也包含了不少技術。這些技術在文檔裏面已經說得很是清楚了。(在我從業的生涯當中也面試過很多程序員,不少初入行業的一問及spring便說:spring核心就是IOC和AOP。甚至不少程序員認爲spring就只是AOP和IOC,這種認知是大錯特錯的),經過一張圖來講明。
json
紅色箭頭地方說明了spring framework的核心構成:api
一、Dependency Injection
簡稱DI,依賴注入,不少人說這個就是IOC,嚴格來講是錯的,官方叫作DI,那麼DI和IOC的是什麼關係呢?ICO叫作控制反轉。是一種編程思想,也便是一種須要達到的目標(和spring無關,那麼spring framework實現這種編程思想或者實現這種目標的技術手段叫作DI,也就是依賴注入。譬如小明說要發財,那麼怎麼實現發財呢?賣腎就能實現,這裏的IOC至關於發財,賣腎至關於DI,小明至關於springframework)。
二、Aspect Oriented Programming.........
(AOP技術,面向切面編程技術,AOP也是一種思想,spring framework實現AOP是基於AspectJ的技術。記得在spring早先他本身有一套AOP技術,可是貌似比較雞肋就放棄了,引入了AspectJ技術來實現,關於AOP的一些東西,後續的文章再討論)。
三、springMVC(本文要討論的重點,下面會詳細討論)。 四、咱們能夠看到還有什麼JDBC,JPA,JMS等等
最後Much more表示還有更多。so,當之後有人問咱們對spring的理解的時候千萬別再說就是AOP和IOC,spring這家公司開發了不少項目,包括了springBoot,spring Framewok,spring Cloud……..,而IOC和AOP只是spring framewrok裏面的兩個核心技術。固然若是想學習更多的spring framework技術僅僅看這個quick start例子確定不行,顧名思義,所謂quick start只是快速開始。若是須要查閱更多的spring framework文檔——顯然spring做爲業界標杆,文檔毋庸置疑確定提供的很全面。文檔——-圖5:
點擊紅色箭頭能夠查閱詳細的spring framework文檔(5.x和4.x有一點點區別),5.x點進去以後會有一個小分類,小分類裏面提供各類技術的文檔連接。4.x點進去以後就是全部技術的文檔,博主更習慣4.x的文檔。如下是5.x的文檔—圖6:
5.x點進來以後會有一個小分類,好比上面的CORE一欄就包含了IOC,validation和AOP的文檔,假設你想查閱spring MVC的文檔能夠點擊Web Servlet那個連接
這裏先點擊Core,驗證文章開頭②處粗斜體所述。圖7:
能夠從左邊的導航中找到AOP相關的文檔(紅色箭頭),若是想系統的學習AOP能夠查閱這個文檔,很是詳細。
spring爲AOP提供了兩種代碼風格來實現,Schema-based---也就是XML方式,以及@AsepectJ----也就是基於ApsectJ的註解來實現
固然本文主要討論SpringMVC,因此須要查閱springMVC的文檔,點擊圖6當中的Web Servlet連接,進入到spring Web文檔頁面。圖8
進入SpringMVC的文檔首頁,紅色箭頭的Introduction(介紹)簡單說明了springMVC技術基本信息。大概意思:
springMVC 依賴servlet API(說白了就是開發springMVC必須下載servlet-api.jar) 而且springMVC一開始就包含在spring framework體系裏面。 springMVC的全稱叫作Spring Web MVC。這個名字是來自其中一個叫作spring-webmvc 的模塊(pom裏面常常配置的一個依賴),可是常見的名字叫作spring MVC。。。。。。。
繼而便開始介紹springMVC裏面很是重要的一個類DispatcherServlet。圖9:
上圖首先簡單介紹了一下這個類,繼而給出了這個類在springMVC項目當中的配置,一共有兩種方法,也就是文章開頭說的基於code-based(javaConfig零配置,上圖紅色標記的)和schema-based(xml配置,黑色標記)。在springMVC的文檔裏面幾乎給大部分的配置都列出了這兩種風格的代碼(有一些只有一種),可是全部的都是先介紹code-based。不知道可不能夠理解爲spring推薦咱們使用code-based的coding風格,姑且這麼認爲吧。上圖那種基於schema-based風格的配置是如今大部分的springMVC的都在用的。
再次說明一下,這兩種風格無高下之分,更無優劣之別,就算有也不是本文討論的。本文主要來討論基於code-based的風格來實現springMVC。
這樣可以更好的去理解、學習springBoot(直接從schema-based跳到springBoot有點很差,可是如今網上對於springMVC code-based的資料比較少)。
重點是讓初學者學會看spring文檔,能夠快速學習一些spring的技術。根據上圖咱們能夠創建一個項目來作實驗(本文使用idea來coding),pom文件裏面添加相應的依賴。圖10:
創建項目複製官網的代碼:寫一個類來實現WebApplicationInitializer
。圖11:
附圖12(繼上圖,代碼過長一次截圖不完):
MyWebApplicationInitializer
這個類(如下簡稱Initializer
)的主要做用就是來代替schema-based
風格中的web.xml
,熟悉spring web開發的人確定知道web.xml
主要作兩個事情。
①配置一個listener來load spring的配置文件(就是一般取名叫作applicationContext.xml) 根據配置文件裏面的信息來初始化spring的上下文環境。 ②、配置一個servlet(DispatcherServlet)來load springMVC的配置文件。 而且根據springMVC的配置文件信息來完成對springWEB的環境初始化。
觀察Initializer
這個類的代碼—-它實際上是經過spring javaConfig
的技術一樣來完成了上述的兩件事情。具體代碼能夠下載文末提供的demo自行查看。
其實對於這個類,spring官網提供兩種寫法,第一種即是圖11(也便是下圖粉紅色圈圈標記),另一種寫法(圖中黑色箭頭)附圖:N
圖N裏面粉紅色標記的代碼也就是本例使用的,跟着下面這段文字spring解釋了還有另外一種寫法,除了這種基於ServletContext
API的寫法以外還有一種即是去繼承
(紅色箭頭標記)AbstractAnnotationConfigDispatcherServletInitializer
這個抽象類。點擊黑色箭頭標記的鏈接,spring給出了第二種寫法的相應代碼,
而且作了一段很長的說明,還把類之間的關係圖給出來了。能夠自行翻譯(關於這種方法的寫法本文沒有實現,有興趣的能夠和我討論哈)。N1(圖有點長兩次截):
續上圖N2
再次說明這種方式本文不作討論.回到圖12的內容。其中的AppConfig.class
至關於schame-based
裏面的spring和SpringMVC的配置文件。
簡單說就是之前用xml
來配置spring mvc的一些信息,如今用這個類AppConfig
來替代那兩個文件,這種技術就是開頭咱們說的spring javaConfig
技術。他的主要代碼。圖13:
上文提到這個類Appconfig
就至關於schema-based
裏面的springMVC的配置文件和spring核心的配置文件,由於他徹底代替了這兩個配置文件,故而這個類的代碼纔是本文討論的重點。
若是熟悉`spring javaConfig`技術的話就會知道這個類能夠任意命名。 並且他能夠是沒有任何依賴的(官網和本文中這個類是實現了一個`WebMvcConfigurer`接口)。
爲何這裏咱們會去實現一個接口呢?這是spring爲了方便程序員開發,其實若是熟悉spring javaConfig
技術徹底能夠沒必要要實現這個接口。
我看過很關於springBoot
的文章就是沒有實現這個接口,自行寫的代碼。這裏附圖一張我在百度找的一篇文章(討論springBoot
實現SpringMVC
視圖技術的文章,
他的`Appconfig`類就沒有去實現任何接口) 圖:14
圖14中就是經過code-based
的方法配置了一個視圖解析器,至關於schema-based
中的下圖代碼。圖15:
這是隻是爲了說明那個接口其實沒必要要去實現,能夠徹底自行寫spring javaConfig
,可是spring已經提供一個方便的接口那麼最好仍是實現一下。
implements
這個接口後有18個方法須要去實現,這個18個方法能夠完成絕大部分的環境配置。
標記①:若是有一些特殊的環境是這18個接口沒法實現的, 那麼你能夠就在`Appcinfig`類當中自行經過`spring JavaConfig`的技術去實現 本文中就有一個對象是自行實現的,一個關於上傳的配置,後面會有說起。
那麼這18個方法的做用和意義本文不會所有來討論,只會討論到一些在項目中會涉及到的和一些重要的方法,下一篇博客打算再來討論。誠如上文所說如今這個Appconfig
類就是爲了替代spring的配置文件,那麼怎麼來替代呢?咱們能夠依次來分析。對於spring環境而言
❶掃描類,而後經過DI來完成注IOC。
在schema-based中咱們通常會在xml中寫一個配置來完成<context:component-scan base-package="org.example.web"/>
。那麼在code-based的實現spring 官網已經給出很是詳細的代碼 圖16:
在spring mvc的文檔1.4節裏面———-黑色箭頭,spring提到:開啓一個自動檢測、搜索全部Controller
bean,你須要在你的java config
添加一個搜索組件。
繼而給出了兩種方案,分別是code-based
(紅色箭頭)和schema-based
(藍色箭頭)。本文的實驗代碼即是參考官網的這段code-based。
如此便完成了❶------自動掃描spring bean
❷、開啓對springMVC
的支持,在springMVC
的文檔的1.11中有關於springMVC
的全部配置說明 圖17:
一樣是兩種方案,首先是code-based
(藍色箭頭)
spring官網重要的說明:in javaconfig use the @EnableWebMvc annotaion
繼而是schame-based
(黑色箭頭)
spring官網重要的說明:in xml use the<mvc:annotaion-driven> element
對於熟悉schame-based
的程序員來講黑色箭頭處的代碼應該已經很是親切了。
如此便完成了第❷步,開啓springMVC的支持這裏稍微作點說明所謂開啓springMVC的支持意思讓程序員可以使用springMVC技術 好比springMVC中的視圖轉換、視圖檢測等等,最直觀的:博主本身測試過,好比不加@EnableWebMvc這個annotation 程序能夠正常啓動而且可以訪問,可是當controller中的方法返回一個XXX的字符串時候,程序員是沒法跳轉到XXX.jsp. 即便程序員配置了視圖解析器也不行,可是加上@EnableWebMvc以後即可以。
❸、配置springmvc
的視圖解析器。通常javaweb
項目裏面使用都是jsp,因此咱們首先配置一個jsp的視圖解析器。查閱springmvc
的文檔的第1.12節—View Technologies
圖N3
查閱1.12節—View Technologies(箭頭1),展開後其實springmvc
提供了不少視圖技術,好比圖中的Freemarker
、tiles
、jsp
等等。
目前只須要配置對jsp
的視圖解析。
so 點擊箭頭2,繼而點擊View Resolvers
(視圖解析),看到spring給出了schema-based
風格的jsp
解析器配置代碼。可是spring
沒有給出code-based
的代碼,其實spring
的文檔裏面也有提到,只是在這裏沒有。仔細看這段xml
配置,無非就是聲明、註冊了一個bean
而已,若是換成code-based
無非就是利用spring javaConfig
的方法去聲明、註冊一個bean
。這對熟悉spring javaconfig
的人來講很簡單。文章中圖14裏面的代碼(網上我找的)就是經過spring javaconfig
的方法,在Appconfig
這個類中聲明、註冊了一個InternalResourceViewResolver
的對象
注意,圖14的代碼是沒有實現接口的
圖14的代碼的效果至關於此處圖N3紅色箭頭xml
代碼的效果。但是如今的程序中AppConfig
類實現了一個接口。其實spring提供的這個接口當中有一個方法就是專門來註冊視圖解析器的。查閱這個類的源碼註釋有一個方法 configureViewResolvers
這個方法就是使用spring javaconfig
技術專門來實現對視圖解析器的聲明、註冊用的。
關於這個方法的解釋和說明(很重要)本文提供的代碼有詳細註釋說明。能夠下載代碼查閱demo會在文章末尾提供的地址
圖18:
上圖代碼其實和圖14的效果是同樣的,
再次說明,圖14沒有實現接口
上圖的代碼是實現了WebMvcConfigurer
這個接口,經過接口中的一個方法來完成對象的聲明、註冊。查閱registry.jsp
方法的源碼,能夠看到spring的代碼其實和圖14的幾乎同樣。
如此咱們便完成了第❸步,對spring視圖解析器的註冊
圖19(spring的源碼,能夠對比一下圖14百度上找的代碼):
對於一個springmvc
的項目而言,完成以上三步就完成了基本的配置,程序員能夠定義controller,而且返回字符串,會跳轉到對應的頁面。因而便把項目發佈tomcat
跑起來看看結果。
本文的demo是經過maven的tomcat 插件來配置的,博主也推薦使用這種maven plugs的方法來開發web項目
至此項目的結構圖以下。圖20
程序中定義了一個IndexController
其中有一個index
方法,最後返回字符串」index」,而且web.xml
是沒有任何代碼的。講道理髮布、啓動tomcat
後,訪問index.xhtml
程序會跳轉到index.jsp
。圖21:
此處的index.xhtml是一個request請求,而非一個文件。博主以前開發程序便習慣把請求後綴取名.xhtml
至此便完成了一個基於code-based
的springmvc程序,就是所謂的零配置。其實和springBoot
很相像了。經過這種查閱官方文檔的方式去學習spring
我以爲很是好,這樣就會加深對spring
體系的認知。固然咱們僅僅是完成了對jsp
視圖的解析,一般項目當中還會對json
處理。
當方法加了@ResponseBody後消息會自動轉換成JSON格式響應給客戶端。譬如在controller中定義了一個返回Map的方法。 若是給方法加上@ResponseBody,繼而請求該方法,最後服務器會響應一個段JSON,就是由spring 轉換的,不須要程序員寫代碼去轉。
springmvc
的官網給出了利用jackson技術來處理JSON
和XML
。圖22,分兩次截圖
繼上圖
若是使用jackson
只須要加上上圖中的配置,繼而依賴好jackson
的幾個jar包便能處理JSON
了。但是在國內通常都是用馬雲爸爸開發的fastJson
居多,因此本文就來討論在springmvc code-based中如何使用fastJson
來處理JSON
一、首先在pom當中添加fastjson的依賴 二、查閱官方文檔,消息轉換(Message Converters,姑且這麼翻譯吧)這一節。圖23:
上圖紅色標記區的信息已經說的很是詳細了———若是咱們須要使用自定義的轉換器,那麼必須去覆蓋Appconfig
當中的configureMessageConverters
方法,而且以jackson
爲例,給出了重寫configureMessageConverters
方法的代碼,從上圖能夠看出,spring
官網代碼的Appconfig
類也是實現了WebMvcConfigurer
接口的,和本文的例子同樣。咱們只須要在Appcnfig
這個類中找到這個方法,繼而重寫而後定義、註冊fastJson
的轉換器就能夠了。上圖的jackson
的轉換器叫作MappingJackson2XmlHttpMessageConverter
那麼若是咱們重寫這個方法,fastJson
的轉換器叫什麼名字呢?其實比較簡單。
文檔有一段很是重要的話Customization of HttpMessageConverter can be achieved in Java config by overriding
這段描述中能夠猜spring要求自定義的轉換器必去實現HttpMessageConverter這個接口。且事實就是如此。能夠找到這個接口,在org.springframework.http.converter
包下面就定義了這個接口,程序員也能夠經過MappingJackson2XmlHttpMessageConverter
這個類去找。
按住ctrl點擊一路找過去就能找到HttpMessageConverter
。
找到這個接口後在idea下面打開這個類,繼而選中接口名字。
idea中按ctrl+alt+b,能夠查看該接口的全部實現類圖24:
只要fastJson
的依賴,講道fastjson
若是想springmvc
中處理方法放JSON那麼
fastJson確定提供了一個符合
spring`標準的消息轉換類
上文提到spring的要去實現HttpMessageConvter接口
這就是標準的魅力,一流公司賣標準,二流公司賣服務,三流公司賣產),像spring這種準一流公司,開發標準可謂輕車熟路,馬雲爸爸在電商界呼風喚雨,但是在code方面只能去實現spring的標準了,這樣也好,程序員卻是很歡喜,試想若是沒有這個標準,那麼程序員在spring項目中用不一樣公司提供的技術去實json
支持那麼API徹底就不會不一樣。。。。。。。。言歸正常。
圖24用藍色標記的2箭頭能夠看到有一個叫FastJsonHttpMessageConverter的類
,顯然就是馬雲爸爸開發的,因而程序就變得簡單了,咱們只須要把圖23中jackson
的轉換器改爲fastJson
的轉換器即可。
注意的是圖23中jackson處理的不只僅是JSON。
還對xml
和bihernate
作了處理,故而代碼有點複雜(這個文檔上有說明的,我想不到爲何還要對hibernate
作處理,講道理hibernate
如今已經不怎麼用了),本例中只需對JSON
進行處理,代碼相對就簡單的多。圖25
誠然fastJson
也有也有不少配置,好比對於key是否加雙引號啊等等配置,不在本文討論的,能夠查閱fastJson
的文檔。上圖的代碼註釋裏面就有一些fastJson
的基本配置,其實這個轉換器的默認配置已經能夠知足基本開發需求了,好比字符集的處理,查閱源碼能夠看到他有默認的字符集設置UTF-8。圖26
:
有小插曲,博主在查閱fastJson的源碼過程中發覺一個特別有趣的事,附圖:N4
天地良心,這是阿里巴巴的程註釋
至此code-baseds
的springmvc
項目對 fastjson
支持已經配置好,能夠啓動tomcat
檢查一下是否可以正常處理json
圖27:
在index.jsp
頁面用jQuery
去發了一個ajax
請求,能夠看到在IndexController
中json.xhtml
是一個加了@ResponseBody
的方法,而且返回了一個map
。
注意map當中是有中文的
最後在客戶端的JavaScript
的success
方法中打印了服務器響應的消息。講道理會正常返回JSON
數據給瀏覽器。圖28:
能夠看到中文也是能夠正常顯示的,至此咱們經過code-based
的方式完成了對jsp
和json
的處理。固然通常項目裏面還會涉及到上傳,因爲篇幅緣由,本文接下來只會對上傳進行介紹,還有他的好比類型轉換,驗證等等下一篇博客再來介紹。關於springmvc
的上傳,文檔中已經說得很是很是清楚了。查閱spring
的文檔,其中有一節就是專門講文件處理。圖29:
這段文字的大概意思是spring內置Mulitipart Request
技術就包含了文件上傳的處理,其中有一個可插拔的對象叫MultipartResolver
能夠支持文件上傳請求。可是這個類只是一個接口,說白了就是一個標準,實現這個標準有兩種方法,第一種(箭頭標記‘第一種
’)commons-fileupload
這也是如今廣泛用的方法。第二種(箭頭標記‘第二種
’)即是基於servlet3.0
。
對於servlet3.0,若是我沒記錯tomcat7以上就是servlet3.0了。
對於這兩種方法spring文檔中都給了很是詳細的說明。圖30:
Ⅰ、commns-fileuplod
實現,須要把相應的依賴寫到pom中,而後在聲明、註冊一個作叫CommonsMultipartResolver
(1藍色箭頭)的對象。
而且名字必定叫作multipartResolver(2藍色箭頭)
這樣就完成了對commons-fileupload
的配置,意思是一個上傳文件的請求就會由commons-fileupload
的技術來處理。
這裏說去註冊一個CommonsMultipartResolver 對像,上文說過一個對象的聲明、註冊spring有兩種方法`schema-based`和`code-based`
本文討論的是code-based
,文章下面有經過code-based
來註冊、聲明CommonsMultipartResolver
的詳細說明
Ⅱ、servlet3.0的方式就比較複雜,文檔的大概意思❶須要咱們在web.xml中的DisptcherServlet
的節點中配置一個Multipart-config
的節點。❷或者去配置一個叫作MultipartConfigElement
類的對象,而且把這個對象給Servlet Registration
這裏❷有點繞,下面會詳細說明
❸再或者你本身定義一個servlet
在定義的servlet
類上面加上@MultipartConfig
。
也就是有三個或者。。。spring真的牛逼呀,三個呀!!
可是ⅠCommons-fleUpload
和Ⅱservlet3.0
最大的不一樣
註冊處理文轉件上傳的轉換器不一樣 Ⅰ、須要註冊CommonsMultipartRver Ⅱ、須要StandardServletMultipartResolveresolver 可是名字都須要同樣叫作multipartRelover(2藍色箭頭) 爲何須要叫這個名字,下次再討論
首先討論Ⅰcommons-fileupload
上文所述,首先須要去註冊、聲明一個CommonsMultipartResolver 對象,若是是用schema-based
的方式就很簡單,直接在springmvc的配置文件中聲明一個bean。
<bean id="xxx" class="xxx"> 對於`code-based`方式,spring的文檔中並未說明,其實去查閱`Appconfig`類中的那18個方法發現也沒有一個方法提供了對該類`CommonsMultipartResolver` 的註冊。回到上文說的。 若是接口中提供的方法不能知足程序開發需求了,則須要程序員自行經過spring javaConfig的技術去實現。
對於這個類CommonsMultipartResolver
的註冊,使用sping javaconfig
技術來實現註冊仍是比較簡單,查閱源碼:
該類有一個不帶參數的構造方法,便可以直接new圖CommonsMultipartResolver 源碼。圖31:
既然該類提供了無參的構造方法那麼程序員只須要在Appconfig
類當中經過spring javaConfig
技術簡單註冊一下即可,代碼比較簡單。圖(本文demo中的代碼)32:
如此便完成了CommonsMultipartResolver
的註冊,關於上傳文件的其餘設置,好比文件大小的限制的等等如何設置呢?schema-based
的方式是經過xml配置的。那麼code-based
的設置也比較簡單的,查閱CommonsMultipartResolver的源碼能夠看到他提供各類API來設置這些信息,其中就有關於文件大小限制的設置。附圖33:
查閱CommonsMultipartResolver
源碼,該類繼承了一個CommonsFileUplaodSupport
的父類,查看這個父類。圖34:
這個父類裏面提供了不少上傳文件的設置,setMaxUploadSIze
。。。。顧名思義、設置文件最大上限。因此咱們能夠在實例化CommonsMultipartResolver
以後調用這些方法去作相應的設置。圖35:
能夠根據具體的應用去設置具體的值,本文再也不作討論了。
至此,關於springmvc
第Ⅰ種方案處理文件上傳請求的對象CommonsMultipartResolver
的註冊已經完成了。那麼剩下咱們的controller中的代碼如何寫呢?查閱springmvc
文檔1.4.3節中能夠看到對應代碼。圖36:
上述代碼表示,咱們HTML頁面須要提供一個上傳的表單,繼而controller中提供一個方法。文檔上面有一段話很是的精髓。
The next step is to create a controller that handles the file upload. This controller is very similar to a normal annotated @Controller, except that we use MultipartHttpServletRequest or MultipartFile in the method parameters:
大概的意思就是-建立一個處理文件上傳的controller
。這個controller
和一個正常加了@Controller
的controller
沒很大區別,無非就是這個處理文件上傳的controller須要使用MultipartHttpServletRequest
或MultipartFile
做爲方法參數而已。
是把文件當成一個普通參數,繼而加上指定的註解即可以了。同時也體現了spring性感到骨子裏的特色:
無侵入性,不破壞封裝,輕量級,低耦合等等....
我記得struts2的文件上傳須要程序員定義幾個全局變量,而且對於這些全局變量要有規定的方法與之對應,這樣程序員的代碼便有了依賴了。比起spring的這種處理,spring仍是作得好多了)。。。。言歸正傳,寫完這些以後啓動tomcat測試一下文件上傳。圖37:
至此已經完全完成了springmvc
處理jsp
,處理JSON
,處理文件,處理正常參數。固然文件上傳是基於ⅠCommons-fileUpload
的這種方式。記得上文提到還有第Ⅱ種方式來。
基於servlet3.0
Ⅱ、基於Servlet3.0來處理文件上傳,首先給出一個schema-based的代碼
在web.xml中配置對應擋標籤 圖38:
這種配置其實和spring沒有關係,意思就是就算開發一個servlet+jsp項目也能夠用這個配置。然而這種方法須要去配置xml與spring的code-based不符,故而本文再也不作討論。
直接用code-base方式實現springmvc基於servlet3.0的文件上傳的程序
上文說到實現spring上傳的方法有3個或者,第❶個或者就是如上圖配置(不是零配置),第❷和❸種其實都差很少。本文重點在第❷個。可是第❷個或者spring只是簡單的說明了一下,並無詳細的代碼,須要咱們本身去查閱spring的源碼。
一、MultipartConfigElement
查閱這代碼的源碼發現他有三個構造方法
仔細查閱源碼,其實三個構造方法無非就是對上傳信息的設置,好比第一個構造方法要求咱們提供文件保存的位置,第二個構造方法的四個參數spring源碼的註釋寫的很是清楚了,這裏稍微解釋一下。圖:
具體用哪一種方法程序員本身考慮,本文例子代碼使用的第一個構造方法,僅僅傳入了一個文件保存路徑。
若是這個類被實例化出來了,跟着要怎麼辦呢?直觀的看spring文檔對於這個類的說明比較模糊如圖40:
就簡單的一句話便描述完了,意思是把這個對像給一個Servlet Registration。很迷茫?到底意思呢?大膽的猜一下,在程序初始化的時候MyWebApplicationInitializer
中的onStartup
方法程序不是經過ServletRegistration.Dynamic
去add了一個servlet
?
查閱源碼發現ServletRegistration.Dynamic是一個接口。
他的真實對象是經過servletContext
對象的一個方法servletContext.addServlet
返回來的。這個對象的定義是沒有的,由於ServletContext
也是一個接口,程序中的servletContxt
對象是由tomcat
在啓動建立的。
這個若是要討論就要討論tomat的實現原理了,這個放到之後討論
也就是這個servlet-api.jar
把接口寫好了供程序員調用,真實的實現都是基於tomcat的。這麼理解吧:
假設servlet-api.jar裏面有一個UserDao的接口,裏面有各類查詢方法,add方法啊;可是他只是接口。 真正實現這個UserDao的類是不在jar中,是由容器啓動時把這個接口的對象給程序,因此程序有userDao的對象。
再因而猜測所謂的Servlet Registration
就是這個ServletRegistration.Dynamic
接口的對象。 查閱源碼,還真發現他有一個方法setMultipartConfig
的方法,而且參數類型就是MultipartConfigElemen
圖41:
爲了驗證這個猜測就在初始化那個方法MyWebApplicationInitializer.onStartup
裏面裏面把這個MultipartConfigElement
set一下。圖42:
最後根據文檔的說明,serlvet3.0須要註冊的文件轉換器叫作StandardServletMulti
因而把
partResolverAppconfig
類裏面MultipartResolver
改爲返回StandardServletMultipartResolver
。圖42:
啓動tomcat 運行程序 圖last:
至此兩種上傳文件的方法都完成了,第一種依賴commons-fileUpaload,第二種能夠不須要這個jar了。介於篇幅緣由本文就到此殺青了。
文的目的不是爲了搭建springMVC code-based框架,僅僅是博主感嘆一下spring公司編寫的性感的開發文檔。一下兩個都是代碼地址 代碼:http://download.csdn.net/download/java_lyvee/10162574 代碼:http://dl.iteye.com/topics/download/a6e61837-4236-364d-8c22-5eeb848fea2e
末了打個廣告http://lubanedu.ke.qq.com/魯班學院,每晚八點都有免費的java試聽課,都是面向高級開發的課堂內容,很是不錯