浅谈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还是注解的引入都是为了开发的便捷性,但还是推荐大家从基础学起才能高屋建瓴
文章如果存在问题欢迎在评论区斧正和评论,各自努力,你我最高处见