1. 程式人生 > 其它 >淺談Spring MVC的DispatcherServlet

淺談Spring MVC的DispatcherServlet

目錄

DispatcherServlet(前端控制器)簡介

首先我們先看看DispatcherServlet這個類的繼承關係
DispatcherServlet在我們熟知的HttpServlet上繼續封裝了很多方法,但依舊遵頊Servlet的傳統

核心方法就是封裝的doService和doDispatch方法來處理請求的處理和分發

工作流程

首先我們先看一看官方給出的流程圖解
結合圖中的流程和簡單的demo,我們大致梳理一下DispatcherServlet的工作流程

1.將DispatcherServlet配置到web.xml中

    <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:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
這裡我們將Spring MVC封裝好的的DispatcherServlet新增到專案中來

它在Spring容器內部將根據WebApplicationContext所繼承的bean來自動分配請求

這也就免去了我們以前手寫servlet的配置地獄,不至於每個請求都單獨去寫Mapping對映

接下來DispatcherServlet就會根據HandlerMapping對映器來處理請求了

2.解析springmvc-servlet.xml配置檔案

    <!--處理器對映器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--處理器介面卡-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <bean id="/hello" class="com.sbc.controller.HelloController"/>
    <!--檢視解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <property name="prefix" value="WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
我們這裡為了方便理解,採用比較簡單的BeanNameUrlHandlerMapping來處理對映

它可以根據bean的名字來處理請求,所以下方寫了id為"/hello"的bean來指明對映地址

而介面卡主要功能就是處理Servlet中的Handler,它和對映器也是多種多樣這裡就不展開了

ViewResolver作為檢視解析器就承擔了處理請求和返回中ModelAndView的作用,拼接返回的view地址

當然實際開發中,我們不會去自己編寫這些東西,我們把這些都交給配置檔案,也就是下面這種寫法
    <!--自動掃描包-->
    <context:component-scan base-package="com.sbc.controller"/>
    <!--不處理靜態資源-->
    <mvc:default-servlet-handler/>
    <!--上面兩個配置的注入-->
    <mvc:annotation-driven/>

    <!--檢視解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--字首-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--字尾-->
        <property name="suffix" value=".jsp"/>
    </bean>
這裡有個小坑,配置檔案中頭部引入的依賴可能不全,這裡需要注意是否引入完整

3.Controller具體配置方法

@Controller
public class HelloController {
//  @RequestMapping(name = "/hello", method = RequestMethod.POST)
    @GetMapping("/hello/{a}/{b}")
    public String hello(Model modele, @PathVariable int a, @PathVariable int b) {
        // 封裝資料
        modele.addAttribute("msg", "hello anno!");
        modele.addAttribute("sum", a + b);
        return "test";
    }
}
@RequestMapping獲得到請求的路徑之後通過ModelAndView中的view返回給ViewResolver拼接路由

之後就可以訪問web資源了,如果訪問不到,則需要檢查路徑是否正確,和確保網頁資源存在

總結

DispatcherServlet作為學習Spring MVC的重要一環,承擔了替代Servlet的臃腫配置

在學習Sping的過程中如果只知道使用框架帶給我們的便利方式而忽視底層原理,很容易眼高手低

無論是懶人神器LomBok還是註解的引入都是為了開發的便捷性,但還是推薦大家從基礎學起才能高屋建瓴

文章如果存在問題歡迎在評論區斧正和評論,各自努力,你我最高處見