Spring 框架基礎(06):Mvc架構模式簡介,執行流程詳解

heibai123發表於2019-12-06

一、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架構模式簡介,執行流程詳解

2、步驟描述

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

(2)、前端控制器請求 HandlerMapping查詢, Handler可以根據 xml配置、註解進行查詢;

(3)、處理器對映器 HandlerMapping向前端控制器返回 Handler;

(4)、前端控制器呼叫處理器介面卡去執行 Handler;

(5)、處理器介面卡去執行 Handler ;

(6)、 Handler執行完成給介面卡返回 ModelAndView ;

(7)、處理器介面卡向前端控制器返回 ModelAndView, ModelAndViewspringmvc框架的一個底層物件,包括 Modelview;

(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、測試介面

@Controllerpublic 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=杭州

這裡以Post方式將相關引數傳遞CityEntity實體物件中。

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-parentGitEE·地址https://gitee.com/cicadasmile/spring-mvc-parent


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69949356/viewspace-2667217/,如需轉載,請註明出處,否則將追究法律責任。

相關文章