Spring MVC研究與學習

1        前言

Spring MVC 是spring提供的一種web框架,也是一種很成熟的MVC框架。我們平時大多數時間用的都是struts,對於struts做過web的程序員相信都不陌生。Spring MVC的出現主要和struts進行抗衡,對於我們來說掌握spring mvc 不但拓展了一下知識面而且爲以後的工作打好基礎並且可以對spring 框架有進一步的瞭解與掌握,所以學習spring mvc技術還是有必要的。

2        Spring MVC簡介

Spring MVC 主要圍繞分發器(DispatcherServlet)設計的,DispatcherServlet將web請求分發給不同的處理器來進行處理。框架包括可配置的處理器映射、視圖解析,本地化,主題解析等等。默認的處理器是一個簡單的控制器(Controller)接口,我們可以實現這個接口來進行生成應用的控制器,使用spring自帶的一些控制器更好一些。比如AbstractController,SimpleFormController等,在應用的時候我們根據據需要來繼承這些類即可。Spring MVC框架主要有以下特點:

 

l  角色劃分詳細清晰:控制器、驗證器、命令對象、表單對象和模型對象;分發器、視圖解析器和處理器映射等。

 

l  可適應性強,但不具有強制性:根據不同的情況,使用使用任何你需要的控制器子類,而不像struts那樣任何控制器類都需要從某一個類繼承。

 

l  可定製的處理器映射,可定製的視圖解析:靈活模型可以根據名字/值映射,處理器映射和視圖解析使用應用從簡單過渡到複雜。

 

l  直接將框架類和應用類都作爲javabean配置,包括通過應用上下文配置中間層的引用,例如從web控制器到業務對象和驗證器的引用。

 

以上大致是spring mvc最主要的特點,本人根據查閱資料以及親自實踐,對於spirng  mvc

有了一些瞭解,本文檔主要對於spring 中的幾個重要的概念以及我們在web開發中會常用到的知識進行說明,主要面向應用,至於更深入的掌握,需要大家自行研究。

 

3        Spring MVC核心概念

Spring mvc 也是一種成熟的mvc web框架,所以mvc涉及的概念都會包含與struts是有所區別的,初次之外,spring提供自己獨特的一些概念。

3.1    分發器(DispatcherServlet

Spring mvc框架類似於struts也是一個請求驅動的web框架其設計圍繞一個能將請求分發到控制器的servlet,它和spring的ApplicationContext完全集成在一起,允許你使用spring的其他功能。DispatcherServlet需要定義在web.xml文件中,DispatcherServlet能夠處理的請求必須定義在同一個web.xml中使用url-mapping進行映射,這一點類似於servlet。同時也和struts類似,struts2中有攔截器的概念,所有請求都由FilterDispathcer類進行攔截之後再尋找控制器。如圖:


  

                         圖  A -1

上圖中以.htm結尾的請求都會被DispatcherServlet來進行處理。每一個DispatcherServlet需要有一個應用上下文,它包含了DispatcherServlet配置所需要的bean。DispatcherServlet在初始化時會默認在你的web-inf目錄下找[servlet-name]-servlet.xml文件,這個默認值可以使用初始化參數修改,通常我們修改成爲applcationContext.xml文件。DispatcherServlet需要配置的bean包括處理器映射、控制器、視圖解析器等等,稍後我們逐一介紹。

3.2    控制器

控制器的概念是MVC模式的一部分,使用過struts的人相信都一定不陌生。Spring 以一種抽象的模式實現了控制器,使得不同類型的控制器得意創建。Spring包含表單控制器,命令控制器以及執行嚮導邏輯控制器等。Spring mvc控制器的基礎是org.springframework.mvc.Controller接口。其中生命了一個方法:handleRequest,返回ModelAndView類型,返回一個模型和視圖。Spring還提供了許多包含特定功能的控制器,這些控制器都有以上共同的功能。

3.2.1AbstractController和WebContentGenerator

只有一個控制器接口是不夠的,spring提供了一套基礎設施,所有的spring控制器都從AbstractController來繼承,當使用AbstractController作爲你的控制器基類時,只需重載它的handleRequestInternal方法,並返回一個ModelAndView對象。如圖:


                    圖  A – 2

WebContentGenerator是AbstractController的超類。

3.2.2 命令控制器

Spring的CommandControllers是MV C 的重要部分。命令控制器提供了一種和數據對象交互的方式,並動態地將來自請求參數綁定到你指定的數據對象上,和struts1的actonForm相比,在spring中你不需要實現任何接口來實現數據綁定。Spring中有以下命令控制器可以使用:

l  AbstractCommandController  你可以繼承這個類來實現你自己的控制器,它可以提供驗證功能,並且讓你在控制器中定義如何處理包含請求參數的數據對象。

l  AbstractFormController   使用這個控制器,你可以定義表單,並使用你從控制獲取的數據對象構建表單。當用戶輸入表單時這個類將用戶輸入的內容綁定到數據對象並進行驗證,將對象提交給控制器。如果你想提交表單,並且不想在應用上下文中指定顯示給用戶的視圖,便可使用這個類。

l  SimpleFormController 它能用相應的數據對象幫你創建表單。SimpleFormController讓你指定一個命令對象,表單試圖名,當表單提交成功後顯示給用戶的視圖名等。

l  WizardFormController 功能最強的控制器,允許你以嚮導風格處理數據對象,當使用大的數據對象時,這樣的方式相當方便。

 

3.3    處理器映射

所謂處理映射,你可以將web請求映射到正確的處理器(控制器)上,也就是什麼樣的請求需要使用哪種處理器來處理。

當收到請求時分發器將請求交給處理器映射,讓它檢查請求並獲得一個正確的HandlerExcutionChain(執行鏈),然後執行定義在執行鏈中的處理器。

Spring mvc 中兩個常用的處理器映射:

 

l  BeanNameUrlHandleMapping  它是一個簡單強大的處理器,收到http請求後映射到應用上下文中的bean名字上,例如,以下的配置能將http://samples.com/editaccount.form的http請求映射到合適的FormController上,如圖:


                             A – 3

如果使用這個處理器映射,你不必在應用上下文中定義它。缺省情況下,上下文中沒有找到處理器映射,分發器會爲你創建一個BeanNameUrlHandleMapping。

 

l  SimpleUrlHandleMapping  這是一個更爲強大的處理器映射,配置如圖:


                          A – 4

 

這個處理器首先將所有目錄文件中名爲help.html的請求傳遞給helpContrller,所有ex目中資源名以view開始,.html爲結尾的請求都會被傳遞給控制器。

 

3.4    視圖與視圖解析

所有MVC 框架都會有自己的處理視圖的方式,spring提供了視圖解析器,處理視圖的兩個重要的類是ViewResolver和View 。View接口將請求傳遞給某個視圖技術,ViewResolver提供了一個視圖名和實際視圖之間的映射。Spring mvc 的每個控制器都返回一個ModelAndView實例,spring 中的視圖由視圖名識別,解析器解析。Spring中提供很多視圖解析器,如下圖:


         圖  A - 5

當使用jsp時,可以使用UrlBasedViewResolver。這個視圖解析器將視圖名翻譯成URL,並將請求傳遞給RequestDispatcher顯示視圖。


                      圖  A – 6

當返回test作爲視圖名時,這個視圖解析器將請求傳遞給RequestDispatcher,RequestDispatcher再將請求傳遞給/WEB-INF/jsp/test.jsp。“prefix”爲視圖名字test的前綴,“suffix”爲後綴。

當在一個web應用中使用不同的視圖技術時,你可以使用ResourceBunndleViewResolver。

 

3.5    處理異常

Spring提供了HandlerExceptionResolvers來幫助處理控制器處理請求時發生的異常。HandlerExceptionResolvers會通知你拋出異常時如何處理。HandlerExceptionResolvers中有一個resolveException方法並返回ModelAndView。

 

4        總結

Springl mvc 中還有一些其他的概念例如使用本地化信息、主題使用、文件上傳的支持等,這裏就不一一介紹了。本文檔的目的主要給大家梳理下spring mvc 中比較長用的概念,希望對大家能有個入門的幫助,至於更深入的研究,大家自己可以查閱互聯網以及spring的相關文檔。用過struts的人再學習spring不是特別的費力,因爲好多概念都是大同小異的。相比之下spring mvc 概念劃分的比較清晰詳細,這個既是優點,也是它的一個缺點,在項目中採用哪種框架,因人而宜。大家只要親自動手做一個小demo就可以瞭解並掌握了,謝謝大家捧場!

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章