Spring MVC 的優勢以及開發流程

Spring MVC優勢:

  • 擁有強大的靈活性、非侵入性和可配置性
  • 提供了一個前端控制器DispatcherServlet,開發者無需額外開發控制器對象
  • 分工明確,包括控制器、驗證器、命令對象、模型對象、處理程序映射視圖解析器等等,每一個功能實現由一個專門的對象負責完成
  • 可以自動綁定用戶輸入,並正確的轉換數據類型。例如SpringMVC能自動解析字符串,並將其設置爲模型的int或者float類型的屬性
  • 使用一個key/value的map對象實現更加靈活的模型數據傳輸
  • SpringMVC內置了常見的校驗器,可以校驗用戶輸入,如果校驗不通過,則重定向回輸入表單。輸入校驗是可選的,並且支持編程方式以及聲明方式
  • 支持國際化
  • 支持多種視圖技術,最常見的是JSP和Velocity和FreeMaker
  • Spring提供了一個簡單而強大的JSP標籤庫,支持數據綁定功能,使得編寫JSP頁面更加容易

一個小回顧

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置controller,映射/hello.do請求-->
    <bean  name="/hello.do" class="com.cskaoyan.controller.FirstController"/>

    <!--根據Bean的名字去做url映射的 映射器-->
    <!--處理映射器將Bean的name作爲url進行查找,需要在截止controller時指定name(url)-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!--處理器適配器,專門去適配一個特定的controller,所有處理適配器都要實現HandlerAdapter接口-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--視圖解析器-->
    <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

</beans>
TIP
SpringMVC 建議把所有的視圖頁面存放在WEB-INF文件夾下,這樣可以保護視圖頁面,避免直接向視圖頁面(jsp等)發送請求,而是由實現了Controller接口的自定義控制器來呈現。

使用MVC框架就應該嚴格遵守MVC思想。MVC框架不贊成瀏覽器直接訪問Web應用的視圖頁面,用戶的所有請求都應該只向Controller發送,由Controller調用(Dao&Bean)/view向用戶呈現數據
  • 註解配置MVC
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

        <!--spring可以自動去掃描base-pack下面的包或者子包下面的Java文件,如果掃描到有
        Spring的相關注解的類,則把這些類註冊爲Spring的bean-->
        <context:component-scan base-package="com.bamzhy"/>

        <!--配置Annotation類型的處理映射器,根據請求查找映射-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

        <!--配置Annotation類型的處理器適配器,完成@RequestMapping標註方法的調用-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

        <!--視圖解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

</beans>
  • 這個是最方便方法
        <context:component-scan base-package="com.bamzhy"/>
        <!--註解驅動:替我們自動配置最新版的註解的處理器映射器和處理器適配器-->
        <mvc:annotation-driven></mvc:annotation-driven>

SpringMVC執行的流程

Spring MVC的開發步驟

  • 在web.xml中定義前端控制器DispatcherServlet來攔截用戶請求,由於web應用時基於請求/響應架構的應用,所以不管哪個MVC web框架都需要在Web.xml中配置該框架的核心servlet或者filter,這樣纔可以讓該框架介入web應用中。
  • 如果需要以post方式提交請求,則定義包含表單數據的JSP頁面。如果僅僅是以get方式發送請求,則無需經過這一步。
  • 定義處理用戶請求的Handler類,可以實現Controller接口或者使用@ controller註解。
Tip
Controller並未接收到用戶請求,它怎麼能夠處理用戶的請求呢?MVC框架的底層機制是:前端Servlet接收到用戶請求後,通常會對用戶請求進行簡單的預處理,例如解析、封裝參數等等,然後通過反射來創建controller實例,並調用Controller的指定方法(**實現Controller接口的handleRequest方法,而基於註解的控制器可以是任意方法**)

當Servlet攔截用戶請求以後,它如何知道創建哪個Controller接口的實例呢?
  • 利用xml文件:例如在xml文件中描述haha請求對應使用FirstController類。
  • 利用註解:例如使用@ Controller描述一個類,並且使用註解 @ requestMapping(value=”/haha”)描述haha請求對應的方法。

  • 在Spring MVC 框架中,控制器實際上由兩個部分共同組成,即攔截所有用戶請求和處理請求的通用代碼都有前端控制器DispatcherServlet完成,而實際的業務控制(例如調用後臺業務邏輯代碼,返回處理結果等)都由Controller處理

    Java領域的絕大部分MVC框架都很喜歡使用xml問價你來進行配置管理,即配置哪個請求對應哪個Controller進行處理,從而讓前端控制器根據該配置來創建合適的Controller實例,並且調用該Controller的業務控制方法。
    < bean name=”/haha” class=”com.bamzhy.controller.MyFirstServlet” >
    現在大多使用配置來實現。
    現在幾乎所有MVC礦建都使用約定優於配置的思想,也就是採用約定方式來規定用戶請求地址和Handle之間的對應關係(用註解)。

  • 當Controller處理用戶請求結束後,通常會返回一個ModelAndView對象,該對象中應該包含返回的view名或者view名和model,這個view名就代表需要顯示的物理視圖資源。如果controller需要把一些數據傳給視圖資源,則可以通過模型對象。

Spring MVC的完整請求流程

1、用戶向服務器發送請求,請求被DispatcherServlet截獲
2、DispatcherServlet對請求的URL(統一資源定位符)進行解析,得到URI(請求資源標識符)。根據URI調用HandlerMapping獲得該Handler配置的所有相關的對象,包括Handler對象以及Handler對象對應的攔截器,這些對象會被封裝到一個HandlerExecutionChain對象中返回
3、DispatcherServlet根據獲得Handler選擇一個合適的HandlerAdaper。HandlerAdaper的設計符合面向對象中的單一職責原則,代碼架構清晰,便於維護,最重要的是diamante可複用性高。HandlerAdaper會被用於處理多種Handler,調用Handler實際處理請求的方法.
4、提取請求中的模型數據,開始執行Handler,在填充Handler的入參過程中,根據配置,Spring將幫你做一些額外的工作。

消息轉換 :將請求消息如Json、xml數據轉換成一個對象,將對象轉換爲指定的響應信息。
數據轉換:對請求消息進行數據轉換,比如String轉換成Integer、Double等
數據格式化:對請求消息進行數據格式化,如將字符串轉換成格式化數字或者格式化日期等
數據驗證:驗證數據的有效性(長度格式等)驗證結果存儲到BindingResult或Error中

5、Handler執行完成後,向DispatcherServlet返回一個ModelAndView對象,ModelAndVIew對象彙總應該包含視圖名或者視圖+模型
6、根據返回的ModelAndView對象,選擇一個合適的ViewResolver(視圖解析器)返回給DispatcherServlet
7、ViewResolver結合Model和view來渲染視圖
8、將視圖渲染結果返回給客戶端

發佈了85 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章