在個人Spring ——簡介及環境搭建跑通Hello提到關於Spring的基本結構與功能html
SpringMVC前端
先上一張SpringMVC的流程圖web
Spring MVC 是一個模型 - 視圖 - 控制器(MVC)的Web框架創建在中央前端控制器servlet(DispatcherServlet),它負責發送每一個請求到合適的處理程序,使用視圖來最終返回響應結果的概念。Spring MVC 是 Spring 產品組合的一部分,它享有 Spring IoC容器緊密結合Spring鬆耦合等特色,所以它有Spring的全部優勢。他跟Struts同樣是一個控制器spring
1.首先須要導入他所須要的jar包,能夠上官網下載express
2.須要在web.xml中配置這個spring-mvc
前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要自已定義,把攔截下來的請求,依據相應的規則分發到目標Controller來處理,是配置spring MVC的第一步。mvc
視圖名稱解析器,將ModelAndView渲染到頁面app
<servlet> <servlet-name>SpringMVC</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>SpringMVC</servlet-name> <!-- 此處也能夠配置成 *.do 形式 過濾 --> <url-pattern>/</url-pattern> </servlet-mapping>
@RestController框架
負責註冊一個bean 到spring 上下文中
@RequestMappingpost
註解爲控制器指定能夠處理哪些 URL 請求
@RequestBody
該註解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,而後把相應的數據綁定到要返回的對象上 ,再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上
@ResponseBody
該註解用於將Controller的方法返回的對象,經過適當的HttpMessageConverter轉換爲指定格式後,寫入到Response對象的body數據區,我通常都是用於註解接口的
@ModelAttribute
在方法定義上使用 @ModelAttribute 註解:Spring MVC 在調用目標處理方法前,會先逐個調用在方法級上標註了@ModelAttribute 的方法
在方法的入參前使用 @ModelAttribute 註解:能夠從隱含對象中獲取隱含的模型數據中獲取對象,再將請求參數 –綁定到對象中,再傳入入參將方法入參對象添加到模型中
@RequestParam
在處理方法入參處使用 @RequestParam 能夠把請求參 數傳遞給請求方法
@PathVariable
綁定 URL 佔位符到入參
@ExceptionHandler
註解到方法上,出現異常時會執行該方法
@ControllerAdvice
使一個Contoller成爲全局的異常處理類,類中用@ExceptionHandler方法註解的方法能夠處理全部Controller發生的異常
關係:父子關係
首先配置的是Spring容器的初始化加載的application文件,而後是SpringMVC的前端控制器(DispatchServlet),當配置完DispatchServlet後會在Spring容器中建立一個新的容器。其實這是兩個容器,Spring做爲父容器,SpringMVC做爲子容器。
這裏須要說一些規則:兒子能夠拿到父親的Bean對象,而父親不能拿到兒子的Bean,因此有時候會由於違法了這個而出現了報錯,二者之間的順序是很重要的
按照官方推薦根據不一樣的業務模塊來劃分不一樣容器中註冊不一樣類型的Bean:Spring父容器負責全部其餘非@Controller註解的Bean的註冊,而SpringMVC只負責@Controller註解的Bean的註冊,使得他們各負其責、明確邊界。配置方式以下
1.在applicationContext.xml中配置:
<!-- Spring容器中註冊非@controller註解的Bean -->
<context:component-scan base-package="com.test.www"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
2.applicationContext-MVC.xml中配置
<!-- SpringMVC容器中只註冊帶有@controller註解的Bean -->
<context:component-scan base-package="com.test.www" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>
即上面提到的 springmvc 只掃描controller的包, spring掃描其餘組件。
springmvc 配置以下:
<context:component-scan base-package="com.xxx.**.cotroller"/>
springmvc只會掃描com.xxx下任意目錄或子目錄下的controller包下的類
spring的配置以下:
<context:component-scan base-package="com.xxx.**.service.impl,com.xxx.**.dao"/>
也能夠用<context:include-filter/> 或 <context:exclude-filter/> 指定或排除某些類
假設springmvc掃描以下:
<context:component-scan base-package="com.xxx.**.service.impl,com.xxx.**.dao"/>
spring掃描以下:
<context:component-scan base-package="com.xxx"/>
那麼就會重疊,springmvc會掃描service和dao,能夠這樣修改springmvc的配置:
<context:component-scan base-package="com.xxx"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> </context>
用 <context:exclude-filter/> 排除了@Service 和 @Repository 兩種註解標註的類,意思是告訴springmvc在掃描時,若是碰到這兩個註解標註的類直接忽略,不要建立和注入對象。