JavaShuo
欄目
標籤
springMVC翻譯
時間 2019-12-01
標籤
springmvc
翻譯
欄目
Spring
简体版
原文
原文鏈接
springMVC的特色
清晰的角色定位--每個模塊contorller,vaildator,command object,from object,model object,DispatcherServlet,handler mapping, view resolver等等都有指定的對象來完成。
基於框架和應用級別強大又簡單的配置--這些配置能包涵跨上下文的引用,好比從controller到業務對象和過濾器。
適應性,非侵入式,靈活性--定義controller方法的時候,只要給定場景,就能夠用好比@RequestParam(從請求中取值),@RequestHeader(從header中取值),@PathVariable(從url中取值)等。
可重用的業務代碼,無需複製--將已經存在的業務對象做爲命令或form對象,無需將它們映射成一個指定的框架基類。
可定製的綁定和驗證機制--類型不符做爲應用層錯誤,把錯誤的值、固定日期、號碼綁定等,來取代字符串形式的form對象來手動解析和轉換成業務對象。
可定製的處理匹配和視圖方案--路由匹配和視圖解析策略能從簡單的基於url的配置,到複雜的專用的解析策略。Spring都比其餘要求特定的技術的mvc框架更加靈活。
靈活的model轉換器--鍵值對的轉換支持和任何視圖技術的集成。
可定製的本地化,時區和主題方案,Spring tag lib支持JSP,支持JSTL,支持Velocity且無需其餘bridge。
簡單但強大的Spring tag lib提供支持的功能,如數據綁定和主題--自定義標籤容許最大的靈活性標記代碼。
JSP form lib讓在JSP編寫form更加容易。
Beans的整個生命週期範圍做用在當前http請求和http session--這不是springmvc特有的,這是WebApplicationContext容器的特性。
springMVC的插拔性
非springMVC實現也能夠是某些項目的優先選擇,不少團隊都但願利用他們現有的投資技巧和工具,好比用JSF。
若是你想用springMVC,你也能夠很容易地用spring來集成其餘web MVC框架,經過ContextLoadListener來啓動spring的根應用上下文,能夠在任何一個action中經過ServletContext屬性來獲取到這個上下文,沒有相似於插件來干涉,因此無需專用集成。從整個web層面來看,spring是一個庫,root application context是庫的入口。
無需springMVC,你註冊的bean和服務你也能夠唾手可得,spring和其餘框架沒有任何衝突。它只是簡單地去解決了不少其餘純MVC框架沒有涉及到的領域,不管是bean的配置到數據的獲取再到事務的處理等等,因此你能夠經過利用spring的中間層或數據獲取層來豐富你的應用,即便你只是想用到jdbc或hibernate的事務抽象。
springMVC的核心
springMVC和其餘mvc框架同樣,是請求驅動的,圍繞一箇中心Servlet來分發請求到contorller並提供其餘功能和服務。然而spring的DispatcherServlet要作的事情更多,它徹底和spring的ioc容器進行了集成,這樣就能夠享受到spring的全部特性。
WebApplicationInitializer是springMVC提供的一個
springMVC的請求處理流程圖以下:
該圖能夠看出來DispatcherServlet是一個前端控制器(front controller)設計模式。DispatcherSerlvet是一個實體類(繼承自HttpServlet),而且要在web.xml中聲明,而後指定它要處理的url模式,這是JavaEE Servlet的標準配置,以下:
固然在spring3.0以後,就能夠利用java來配置,以下:
WebApplicationInitializer是springMVC提供的一個接口,用來保證基於java的配置能被檢測到並自動用於初始化Servlet 3 容器。它有一個抽象的實現類AbstractDispatcherServletInitializer,用它來實現java配置還更加簡單,只要配置servlet mapping就足夠了。
上面只是配置springMVC的第一步,下面要配置各類各樣要用到的bean,DispatcherServlet自己也是一個bean。
除了WebApplicationContext以外,springMVC有它本身的WebApplicationContext,它默認繼承了在WebApplicationContext中註冊的全部bean,這些bean能夠在指定serlvet範圍內被覆蓋,也能夠新定義bean來指定它的範圍。
在初始化完DispatcherServlet以後,springMVC會去WEB-INF目錄下找一個[servlet-name]-serlvet.xml的文件來建立在那裏面定義的bean,若是在那裏面定義和全局同樣id的bean,那麼全局bean會被覆蓋。
若是在web.xml中有以下所示:
那麼在WEB-INF下就須要一個golfing-servlet.xml,在這裏面須要定義全部mvc將要用到的組件或bean,固然你也能夠經過servlet的init-parameter來改變這個文件存儲位置,以下:
WebApplicationContext(根應用上下文)是ApplicationContext的一個擴展,它添加不少在web應用中必要的屬性,它和通常的ApplicationContext的不一樣之處在於它可以解析主題,而且它知道它本身是被關聯在哪一個servlet上(經過持有一個ServletContext的鏈接),WebApplicationContext是和ServletContext結合在一塊兒的,經過RequestContextUtils的靜態方法能夠查看WebApplicationContext的信息。
WebApplicationContext特定的bean配置
spring的DispatcherServlet使用特定bean來處理請求和渲染視圖,這些bean是springmvc的一部分,你能夠經過在WebApplicationContext中簡單的配置來指定bean。固然你也能夠不用指定,由於springMVC包涵一系列默認的beans。以下:
默認的DispatcherServlet配置,上面提到springMVC提供一系列的默認配置,在用org.springframework.web.servlet的DispatcherServlet.properties文件中,全部指定的bean均可以由咱們本身來替換,好比最經常使用到的ViewResolver:
若是這樣配置後,那麼默認的就會被覆蓋掉。
DispatcherServlet處理順序
當你啓動好一個DispatcherServlet以後,過來一個請求,這時會發生:
找到WebApplicationContext,將它做爲一個attribute綁定在request上,這樣controller和其餘元素就可使用了,默認綁定的Key是DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE.
那些本地化解析器也將被綁定在request上,以便後面的用來處理請求(渲染視圖,準備數據等等),若是你不想要本地解析,那麼就不須要這步了。
主題解析器也會被綁定在request上,用來決定使用哪一個主題,能夠忽略這一步。
若是你指定了多媒體解析器,那麼request會被檢驗是不是多媒體請求,若是經過,那麼HttpRequest會被包裝成MultipartHttpRequest,以便後面的進一步處理。
查找處理器(Handler),若是找到,execution chain關聯上Handler(preprocessors, postprocessors,controllers)就被執行來準備數據模型或視圖。
若是數據返回,則視圖被渲染。若是沒有數據(可能因爲preprocessors, postprocessors或者安全緣由)返回,則視圖不會被渲染,由於請求已經完成了。
下面是整個渲染過程:
異常處理Handler也是在WebApplcationContext聲明的,若是在處理請求的過程當中遇到問題會拋出這個異常。利用這個handler你也能夠在拋出異常時自定義處理行爲。
因爲servlet api中指定的,DispatcherServlet也支持返回last-modification-date,肯定處理指定請求的last modification date很是明確:DispatcherServlet查找適當的handler並測試它是否實現了LastModified接口,若是現實了,能夠經過getLastModified(request)方法來返回。
經過在web.xml中添加servelt initialization parameters,你能夠自定義DispatcherServlet實例
實現Controller
controller提供一個平臺來讓那些定義在application中的service組件獲得應用。它能將用戶輸出轉化成一個視圖呈現給用戶,springmvc提供的controller高度抽象,最大程度保證了使用者建立各類controller時候的靈活性。
在spring2.5以後,就一直推薦使用基於註解的編程方式,好比@Controller,@RequestParam,@RequestMapping等等,這種形式省去了繼承指定基類或實現指定接口的麻煩,以下:
這些註解讓你徹底能夠自定義類名和方法名(注意struts)。
@Controller註解代表該類是controller角色的類,固然要注意啓用自動檢測,以下:
經過@RequestMapping來分發請求,若是做用在類上,請求或被引導進入類中,在配合做用在方法上的註解,來肯定惟一的請求方法,以下:
還能夠以下獲取url中的參數,以下:
還能夠經過method和consumes(匹配request中的Content-Type)和produces(匹配request中的Accept)來縮小請求範圍,以下:
甚至還能夠將consumes設置爲"!application/json"來匹配除該類型以外的請求。
再甚至能夠在@RequestMapping中添加正則表達式來屏蔽不適合的url,以下:
還能夠對request或head請求中的參數做要求,"myParsm"、"!myParam"這兩個表示這個參數要不要存在,"myParam=myValue"表示該參數要等於指定值,以下:
spring3.2以後更有@MatrixVariable來匹配各式各樣的url,能夠說springmvc對分發url作了大量優化。
定義@RequestMapping處理方法
上面咱們講解不少分發url的方法,那麼最後請求會進入方法中,下面介紹方法參數類型:
Servlet API中的對象,HttpServletRequest,HttpServletResponse
Session對象,好比HttpSession,這個參數要求相應的Session對象存在,不存在則建立,一旦建立以後會一直存在,而且在多請求環境下,修改session可能照成線程不安全問題,能夠將RequestMappingHandlerAdapter的synchronizedOnSession設置成true便可。
@RequestBody能夠利用HttpMessageConverter將body轉換成方法的參數,HttpMessageConverter還能將Http請求轉換成對象,還能夠將對象轉成Http響應。RequestMappingHandlerAdapter經過以下默認的HttpMessageConverter來支持@RequestBody註解:
其餘註解使用見
spring註釋學習筆記
;
異步請求處理
springMVC 3.2就能夠處理基於異步的請求,和同步請求不一樣,controller會返回一個Callable對象,而後主線程(Servlet Container thread)被釋放(返回線程池用於處理其餘請求),springMVC獲取到Callable對象,而後啓動另一個線程池來執行這個對象,執行完以後,再去Servlet Container中繼續找一個線程來處理Callable的返回值:
另一種方式是controller返回一個DeferredResult,這種方式,其返回值也是經過啓動另一個線程來完成這個任務,可是springMVC是不知道的,好比在JMS中,或定時器任務中。
這裏若是不瞭解Serlvet 3的異步處理特性是比較難理解的,下面來稍微講解一下:
一個ServletRequest能夠經過調用request.startAsync()來啓動異步模式,這樣作的做用是讓Servlet或者Filter能夠在response沒有被關閉的狀況下退出(不然是不行的),返回到Serlvet Container中,response繼續等待其餘線程完成處理。
調用request.startAsync()以後,會返回AsyncContext,它能夠被用來控制後面的異步處理,好比它提供了方法調度,應用線程能夠調用它來將請求返回給Servlet Container,異步調度和和forword比較類似。
ServletRequest提供了當前DispatcherType,能夠用來區分是Servlet仍是Filter正在處理初始化請求。
有了上面的講解,再來看一下springmvc的異步請求:
返回Callable
controller發回Callable
springMVC開啓異步處理,並將Callable提交到另外開啓的TaskExecutor的線程中處理
DispatcherServlet和全部Filter退出request處理線程,可是response仍是打開狀態
Callable處理完成返回result,springMVC將request調度到Servlet Container
DispatcherServlet再次被調用,來繼續處理Callable返回的異步請求結果
返回DeferredResult
返回一個DeferredResult,保存在內存隊列或數組中,等待被獲取
springMVC啓動異步處理
DispatcherServlet和全部Filter退出request處理線程,可是response仍是打開狀態
Callable處理完成返回result,springMVC將request調度到Servlet Container
DispatcherServlet再次被調用,來繼續處理Callable返回的異步請求結果
Handler匹配
經過HandlerInterceptor攔截請求
spring的handler匹配機制包括handler攔截器,若是你須要在某些請求上加上一些指定的功能會非有用,好比驗證權限。
攔截器必須實現HandlerInterceptor,這個接口定義了3個方法,分別是preHandle(處理請求以前)、postHandle(處理請求以後)、afterCompletion(request請求完成以後)。preHandle方法返回一個boolean值,你能夠用它來繼續或打斷執行鏈的處理,當這個方法返回true,則繼續handle,當它返回false,DispatcherServlet就認爲攔截器自己已經搞定了請求(如:渲染好了視圖),就再也不執行其餘攔截器以及handler
上面能夠看到經過繼承HandlerInterceptorAdapter來實現攔截器其實更加方便,由於能夠只實現本身想要的方法。
視圖解析
全部web MVC框架都提供一套視圖解析機制,spring提供的是視圖解析器,它能讓數據模型渲染到視圖上而不須要指定的視圖技術,從大的方面來看,spring可讓你使用JSP,Velocity模版和XSLT視圖。
spring的視圖解析有兩個很是重要的接口,ViewResolver和View,以下:
ViewResolver提供從視圖名稱到視圖對象的映射(就是根據到WEB-INF下找viewName.jsp文件),View則是完成request的準備工做並將request交給視圖技術。
ViewResolver是如何解析視圖的
全部在controller裏面的handler方法,都必須返回一個邏輯視圖名稱,不論是明確地經過String,view,modelandview,或不明確地經過轉換器,在spring中,視圖是經過名稱來獲取,經過解析器來解析,spring提供的解析器以下:
若是視圖技術是JSP,那麼能夠用UrlBasedViewResolver,這個解析器會將視圖名稱解析成url,並將對應的request交給DispatcherServlet來渲染視圖:
若是指定的視圖解析器沒有解析出來結果,spring會查找是否存在其餘解析器,若是存在就會用其餘解析器繼續解析,直到有結果爲止,若是仍是沒有結果,則拋出ServletException。
重定向到視圖
以前提到過,一個controller通常返回一個邏輯視圖名稱,而後經過特定的視圖解析器解析,好比JSP視圖技術,是經過Serlvet或JSP引擎來解析的,這部分是在InternalResourceViewResolver和InternalResourceView
基於代碼的Servlet container初始化
在servlet 3.0+的環境下,你能夠經過編程的方式來配置Servlet container,以下:
springMVC提供了WebApplicationInitializer接口來保證明現類被檢測到,並自動用於初始化任何Servlet 3容器,還有一個抽象基類實現類這個接口,叫作AbstractDispatcherServletInitializer,繼承它能夠更加容易的註冊DispatcherServlet,只須要覆蓋方法來指定url匹配模式和DiapatcherServlet配置類(基於java配置)。
基於XML配置:
AbstractDiapatcherServletInitializer也提供了方便的添加Filter實例並將它們自動映射到DispatcherServlet:
相關文章
1.
翻譯
2.
翻譯哪家強?谷歌翻譯對比百度翻譯!!!
3.
對比Google翻譯、百度翻譯和有道翻譯
4.
【機器翻譯】機器翻譯入門
5.
Google翻譯(谷歌翻譯) Chrome插件
6.
中英翻譯(基於百度翻譯)
7.
GitHub 翻譯之 'Hello-world' 翻譯
8.
百度翻譯vs谷歌翻譯
9.
翻譯概論——(二)佛經翻譯
10.
man netstat 中文翻譯(簡單翻譯)
更多相關文章...
•
Eclipse 編譯項目
-
Eclipse 教程
•
Kotlin 使用命令行編譯
-
Kotlin 教程
•
Docker容器實戰(七) - 容器眼光下的文件系統
•
Scala 中文亂碼解決
相關標籤/搜索
翻譯
機器翻譯
翻譯筆記
Medium翻譯
翻譯貼
官網翻譯
原創翻譯
iOS翻譯
翻譯階段
論文翻譯
Spring
MySQL教程
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
升級Gradle後報錯Gradle‘s dependency cache may be corrupt (this sometimes occurs
2.
Smarter, Not Harder
3.
mac-2019-react-native 本地環境搭建(xcode-11.1和android studio3.5.2中Genymotion2.12.1 和VirtualBox-5.2.34 )
4.
查看文件中關鍵字前後幾行的內容
5.
XXE萌新進階全攻略
6.
Installation failed due to: ‘Connection refused: connect‘安卓studio端口占用
7.
zabbix5.0通過agent監控winserve12
8.
IT行業UI前景、潛力如何?
9.
Mac Swig 3.0.12 安裝
10.
Windows上FreeRDP-WebConnect是一個開源HTML5代理,它提供對使用RDP的任何Windows服務器和工作站的Web訪問
本站公眾號
歡迎關注本站公眾號,獲取更多信息
相關文章
1.
翻譯
2.
翻譯哪家強?谷歌翻譯對比百度翻譯!!!
3.
對比Google翻譯、百度翻譯和有道翻譯
4.
【機器翻譯】機器翻譯入門
5.
Google翻譯(谷歌翻譯) Chrome插件
6.
中英翻譯(基於百度翻譯)
7.
GitHub 翻譯之 'Hello-world' 翻譯
8.
百度翻譯vs谷歌翻譯
9.
翻譯概論——(二)佛經翻譯
10.
man netstat 中文翻譯(簡單翻譯)
>>更多相關文章<<