本文源碼:GitHub·點這裏 || GitEE·點這裏前端
MVC是一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個組件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯,MVC分層有助於管理和架構複雜的應用程序java
Model
模型就是數據,應用程序的核心。git
View
回顯數據的界面,例如JSP就是用來展現模型中的數據。程序員
Controller
控制器的做用就是根據入參,把不一樣的響應數據(Model
),顯示在不一樣的視圖(View
)上。github
SpringMVC
是一種基於Java
實現的MVC
設計模式的請求驅動類型的輕量級Web
框架,出自Spring
框架全家桶,與Spring
框架無縫整合,使用了MVC
架構模式的思想,將Web
層進行職責解耦。web
結構鬆散,幾乎能夠在SpringMVC
中使用各種視圖,各個模塊分離並且耦合度很是低,且易於擴展。與Spring
無縫集成,且簡單,靈活,容易上手。spring
(1)、發起請求到前端控制器DispatcherServlet
;segmentfault
(2)、前端控制器請求HandlerMapping
查找,Handler
能夠根據xml
配置、註解進行查找;後端
(3)、處理器映射器HandlerMapping
向前端控制器返回Handler
;設計模式
(4)、前端控制器調用處理器適配器去執行Handler
;
(5)、處理器適配器去執行Handler
;
(6)、Handler
執行完成給適配器返回ModelAndView
;
(7)、處理器適配器向前端控制器返回ModelAndView
,ModelAndView
是springmvc
框架的一個底層對象,包括Model
和view
;
(8)、前端控制器請求視圖解析器去進行視圖解析,根據邏輯視圖名解析成真正的視圖 ;
(9)、視圖解析器向前端控制器返回View
;
(10)、前端控制器進行視圖渲染,視圖渲染將模型數據(在ModelAndView
對象中)填充到request
域中;
(11)、前端控制器向用戶響應結果 ;
DispatcherServlet
:請求離開瀏覽器後,最早到達的就是DispatcherServlet,是整個流程控制的中心,做用接收請求,響應結果,至關於轉發器,中央處理器。減小各個組件之間的耦合度。
HandlerMapping
:根據請求的url路由到指定接口,用戶請求找到Handler處理器,springmvc提供不一樣類型映射器,例如:Xml配置方式,註解方式等。
HandlerAdapter
:按照特定規則去執行Handler,SpringMvc支持多種處理器,各類處理器中的處理方法各不相同,爲了解決適應多種處理器,就出現了處理器適配器。
Handler
:處理用戶請求,涉及具體業務邏輯,須要程序員根據業務需求開發。編寫Handler時按照HandlerAdapter的規則開發,這樣適配器才能夠正確執行Handler。
ViewResolver
:負責將請求的響應結果生成View,根據邏輯視圖名解析成物理視圖名,就是具體頁面地址,生成View視圖對象,對View進行渲染,經過頁面展現給用戶。
View
:SpringMvc框架提供不少的View視圖類型的支持,包括:jsp、freemarker、pdf等。經過頁面標籤或頁面模版解析模型數據回顯到頁面,須要根據業務開發具體頁面。
<!-- 掃描文件 --> <context:component-scan base-package="com.spring.mvc.controller" /> <!-- MVC默認的註解映射的方式 --> <mvc:annotation-driven /> <mvc:default-servlet-handler/> <!-- 視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/page/" /> <property name="suffix" value=".jsp" /> </bean>
<servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
@Controller public class HelloController { @RequestMapping("/getInfo") public @ResponseBody String getInfo (String name){ return name ; } }
@Controller
標記一個類是Handler,也就是開發的Controller,而後使用@RequestMapping或其餘相關注解(@GetMapping、@PostMapping、@PutMapping、@DeleteMapping),用來關聯請求和Controller方法之間的映射關係,這樣的Controller 就能夠被請求訪問。
@RequestMapping
處理請求地址映射的註解,可做用於類或方法上。用於類上,表示類中的全部響應請求的方法都是以類上標註地址做爲父路徑。
@requestParam
主要用於在SpringMvc框架的控制層獲取參數,三個經常使用參數:defaultValue表示設置默認值,required 經過boolean設置是不是必需要傳入的參數,value值表示傳入的參數名稱。
@RequestBody
接收請求體中傳遞給後端的Json字符串數據的,GET方式無請求體,因此使用@RequestBody接收數據時,不能使用GET方式提交數據,須要用POST方式進行提交。
@ResponseBody
該註解用於方法的返回對象,能夠經過配置轉換器爲指定數據響應格式,若是但願返回的數據不是View試圖頁面,而是指定數據格式的時候使用,例如:Json、Xml等。
@Autowired
按照類型(byType)裝配依賴對象,默認狀況下它要求依賴對象必須存在,若是容許null值,能夠設置它的required屬性爲false。若是想使用按照名稱(byName)來裝配,能夠結合@Qualifier註解一塊兒使用。
@Resource
按照ByName自動注入,須要導入包javax.annotation.Resource。@Resource有兩個重要的屬性:name和type,而Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。
@PathVariable
用於將請求URL中的模板變量映射到功能處理方法的參數上,即取出uri模板中的變量做爲參數。
@RequestMapping("/getSum") public Integer getSum (int a,int b){ return a+b ; }
測試:
http://localhost:6003/getSum?a=1&b=2
傳參名稱和方法參數保持一致。
@RequestMapping("/getInfo") public String getInfo (@RequestParam("name") String var1, @RequestParam("say") String var2){ return var1+":"+var2 ; }
測試:
http://localhost:6003/getInfo?name=cica&say=hello
傳參名和 @RequestParam 指定的參數名要對應。
@GetMapping("/getArray") public String getArray (String[] ids){ return ids[0]+"-"+ids[1] ; }
測試:
http://localhost:6003/getArray?ids=2&ids=3
傳遞並解析數組類型的參數格式。
@RequestMapping("/getMap") public String getMap (@RequestParam Map<String,String> paramMap){ return paramMap.get("name") ; }
測試:
http://localhost:6003/getCityEntity?province=浙江&name=杭州
這裏以Post方式將相關參數傳遞CityEntity實體對象中。
@PostMapping("/getCityEntity") public CityEntity getCityEntity (CityEntity cityEntity){ return cityEntity ; }
測試:
http://localhost:6003/getCityEntity?province=浙江&name=杭州
這裏以Post方式將相關參數傳遞CityEntity實體對象中。
@GetMapping("/getId/{id}") public String getId (@PathVariable("id") Integer id){ return "id="+id ; }
測試:
http://localhost:6003/getId/1
RestFul 風格參數映射。
GitHub·地址 https://github.com/cicadasmile/spring-mvc-parent GitEE·地址 https://gitee.com/cicadasmile/spring-mvc-parent