淺談Spring MVC的DispatcherServlet
阿新 • • 發佈:2021-11-05
目錄
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還是註解的引入都是為了開發的便捷性,但還是推薦大家從基礎學起才能高屋建瓴
文章如果存在問題歡迎在評論區斧正和評論,各自努力,你我最高處見