(一)Spring MVC
Spring MVC 是一個典型的MVC框架,是Spring內置的Web框架,可以作爲應用項目的展示層,繼Spring 2.0對Spring
MVC進行重大升級後,Spring 2.5又爲Spring MVC引入了註解驅動功能,再到3.0時代,全面支持REST的網絡服務和更容易的網
絡編程(Spring MVC 3.0)(最新Spring MVC 4.0)
Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裏面,Spring MVC 分離了控制器、模型對
象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定製,適用在我們的表現層到action模塊中,是MVC架構模式
中真正的Controller,在流程處理方面更加靈活,可以很容易的進行擴展,可以和Spring框架進行無縫集成
(二)SpringMVC 架構
Spring Web MVC框架也是一個基於請求驅動的Web框架,並且也使用了前端控制器模式來進行設計,再根據請求映射規
則分發給相應的頁面控制器(動作/處理器)進行處理。首先讓我們整體看一下Spring Web MVC處理請求的流程:
* Spring Web MVC處理請求的流程
* Spring Web MVC架構
(1)Spring MVC的核心是DispatcherServlet,當客戶端發送一個請求時,這個請求經過一系列過濾器處理,然後
DispatcherServlet會接收到這個請求;
(2)DispatcherServlet會從HandlerMapping對象中查找與請求匹配的Controller,並將結果返回給
DispatcherServlet;
(3)DispatcherServlet將請求轉發給目標Controller,如果定義有攔截器,則會經過這些攔截器處理;
(4)標Controller處理完成業務邏輯後,會返回一個結果給DispatcherServlet;
(5)DispatcherServlet根據結果查詢ViewResolver,找到與之對應的視圖對象,同樣將結果返回給
DispatcherServlet;
(6)DispatcherServlet根據指定的顯示結果,調用模板對象渲染view;
(7)將view返回給客戶端;
根據上面的說明,可以很很明顯的看出,Spring MVC的核心是Servlet,並且創建的Controller其實也是一個Servlet
(三)SpringMVC 優勢
1、清晰的角色劃分:前端控制器(DispatcherServlet)、請求到處理器映射(HandlerMapping)、處理器適配器
(HandlerAdapter)、視圖解析器(ViewResolver)、處理器或頁面控制器(Controller)、驗證器( Validator)、命令對
象(Command,請求參數綁定到的對象就叫命令對象)、表單對象(Form Object,提供給表單展示和提交到的對象就叫表單
對象);
2、分工明確,而且擴展點相當靈活,可以很容易擴展,雖然幾乎不需要;
3、由於命令對象就是一個POJO,無需繼承框架特定API,可以使用命令對象直接作爲業務對象;
4、和Spring 其他框架無縫集成,是其它Web框架所不具備的;
5、可適配,通過HandlerAdapter可以支持任意的類作爲處理器;
6、可定製性,HandlerMapping、ViewResolver等能夠非常簡單的定製;
7、功能強大的數據驗證、格式化、綁定機制;
8、利用Spring提供的Mock對象能夠非常簡單的進行Web層單元測試;
9、本地化、主題的解析的支持,使我們更容易進行國際化和主題的切換。
10、強大的JSP標籤庫,使JSP編寫更容易;還有比如RESTful風格的支持、簡單的文件上傳、約定大於配置的契約式編程
支持、基於註解的零配置支持等等
(四)SpringMVC 註解(Controller與Requestmapping)
@Controller
@RequestMapping("/helloworld")
public class Helloworld {
@RequestMapping(method=RequestMethod.GET)
public ModelAndView hello() {
ModelAndView mv = new ModelAndView();
mv.setViewName("helloworld");
return mv;
}
}
@Requestmapping的可選參數:
(1)value:表示需要匹配的url的格式
(2)method:表示所需處理請求的http 協議(如get,post,put,delete等),可選值爲RequestMethod這個enum的值。
(3)params:格式爲”paramname=paramvalue” 或 “paramname!=paramvalue”。不帶參數則表示paramvalue可以爲
任意值。如params = {"param1=1","param2!=2","param3"},表示對應的url必須包括param1,param2,param3三個參數,其中
param1的值必須爲1,param2的值不能爲2,param3的值可以爲任意值。
(4)headers:用來限定對應的reqeust請求的headers中必須包括的內容,例如headers={"Connection=keep-alive"}, 表
示請求頭中的connection的值必須爲keep-alive
(五)SpringMVC 總結
Spring mvc處理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void
(1)ModelAndView(模型視圖)
通過ModelAndView構造方法可以指定返回的頁面名稱,也可以通過setViewName()方法跳轉到指定的頁面 , 使用
addObject()設置需要返回的值,addObject()有幾個不同參數的方法,可以默認和指定返回對象的名字。 調用addObject()方法
將值設置到一個名爲ModelMap的類屬性,ModelMap是LinkedHashMap的子類, 具體請看類
@RequestMapping("show1")
public ModelAndView show1(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("/demo2show");
mav.addObject("account", "account -1");
return mav;
}
小結:
1、使用 String 作爲請求處理方法的返回值類型是比較通用的方法,這樣返回的邏輯視圖名不會和請求 URL 綁定,具有很
大的靈活性,而模型數據又可以通過 ModelMap 控制。
2、使用void、map、Model 時,返回對應的邏輯視圖名稱真實url爲:prefix前綴+視圖名稱 +suffix後綴組成。
3、使用String、ModelAndView返回視圖名稱可以不受請求的url綁定,ModelAndView可以設置返回的視圖名稱。