天天看點

Spring 架構基礎(06):Mvc架構模式簡介,執行流程詳解一、SpringMvc架構簡介二、SpringMvc執行流程三、整合Spring架構配置四、常見參數映射五、源代碼位址

本文源碼: GitHub·點這裡 || GitEE·點這裡

一、SpringMvc架構簡介

1、Mvc設計理念

MVC是一種軟體設計典範,用一種業務邏輯、資料、界面顯示分離的方法組織代碼,将業務邏輯聚集到一個元件裡面,在改進和個性化定制界面及使用者互動的同時,不需要重新編寫業務邏輯,MVC分層有助于管理和架構複雜的應用程式

  • M:代表模型

    Model

模型就是資料,應用程式的核心。

  • V:代表視圖

    View

回顯資料的界面,例如JSP就是用來展示模型中的資料。

  • C:代表控制器

    Controller

控制器的作用就是根據入參,把不同的響應資料(

Model

),顯示在不同的視圖(

View

)上。

2、SpringMvc簡介

  • 架構描述

SpringMVC

是一種基于

Java

實作的

MVC

設計模式的請求驅動類型的輕量級

Web

架構,出自

Spring

架構全家桶,與

Spring

架構無縫整合,使用了

MVC

架構模式的思想,将

Web

層進行職責解耦。

  • 架構優點

結構松散,幾乎可以在

SpringMVC

中使用各類視圖,各個子產品分離而且耦合度非常低,且易于擴充。與

Spring

無縫內建,且簡單,靈活,容易上手。

二、SpringMvc執行流程

1、流程圖解

Spring 架構基礎(06):Mvc架構模式簡介,執行流程詳解一、SpringMvc架構簡介二、SpringMvc執行流程三、整合Spring架構配置四、常見參數映射五、源代碼位址

2、步驟描述

(1)、發起請求到前端控制器

DispatcherServlet

;

(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)、前端控制器向使用者響應結果 ;

3、核心元件

  • 前端控制器

DispatcherServlet

:請求離開浏覽器後,最先到達的就是DispatcherServlet,是整個流程控制的中心,作用接收請求,響應結果,相當于轉發器,中央處理器。減少各個元件之間的耦合度。

  • 處理器映射器

HandlerMapping

:根據請求的url路由到指定接口,使用者請求找到Handler處理器,springmvc提供不同類型映射器,例如:Xml配置方式,注解方式等。

  • 處理器擴充卡

HandlerAdapter

:按照特定規則去執行Handler,SpringMvc支援多種處理器,各種處理器中的處理方法各不相同,為了解決适應多種處理器,就出現了處理器擴充卡。

  • 處理器

Handler

:處理使用者請求,涉及具體業務邏輯,需要程式員根據業務需求開發。編寫Handler時按照HandlerAdapter的規則開發,這樣擴充卡才可以正确執行Handler。

  • 視圖解析器

ViewResolver

:負責将請求的響應結果生成View,根據邏輯視圖名解析成實體視圖名,就是具體頁面位址,生成View視圖對象,對View進行渲染,通過頁面展示給使用者。

  • 視圖

View

:SpringMvc架構提供很多的View視圖類型的支援,包括:jsp、freemarker、pdf等。通過頁面标簽或頁面模版解析模型資料回顯到頁面,需要根據業務開發具體頁面。

三、整合Spring架構配置

1、spring-mvc配置

<!-- 掃描檔案 -->
<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>           

2、Web.xml配置

<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>           

3、測試接口

@Controller
public class HelloController {
    @RequestMapping("/getInfo")
    public @ResponseBody String getInfo (String name){
        return name ;
    }
}           

4、常用注解說明

  • @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模闆中的變量作為參數。

四、常見參數映射

1、普通映射

@RequestMapping("/getSum")
public Integer getSum (int a,int b){
    return a+b ;
}           

測試:

http://localhost:6003/getSum?a=1&b=2

傳參名稱和方法參數保持一緻。

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 指定的參數名要對應。

3、數組參數

@GetMapping("/getArray")
public String getArray (String[] ids){
    return ids[0]+"-"+ids[1] ;
}           

http://localhost:6003/getArray?ids=2&ids=3

傳遞并解析數組類型的參數格式。

4、Map參數

@RequestMapping("/getMap")
public String getMap (@RequestParam Map<String,String> paramMap){
    return paramMap.get("name") ;
}           

http://localhost:6003/getCityEntity?province=浙江&name=杭州

這裡以Post方式将相關參數傳遞CityEntity實體對象中。

5、包裝參數

@PostMapping("/getCityEntity")
public CityEntity getCityEntity (CityEntity cityEntity){
    return cityEntity ;
}           

http://localhost:6003/getCityEntity?province=浙江&name=杭州

6、Rest風格參數

@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