【SpringMVC】深度理解DispatcherServlet

什么是DispatcherServlet

springMVC中的控制器DispatcherServlet,是springMVC的核心

HelloSpringMVC

下面通过一个demo理解DispatcherServlet

1.确保导入SpringMVC相关jar包并且添加web框架支持

相关jar包可参考下列:

<dependencies>
        <dependency>//单元测试
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>//springMVC基于spring框架
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.1</version>
        </dependency>
        <dependency>//servlet
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>//jsp
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>//jsp的标准库
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

2.在web.xml下配置DispatcherServlet

<!--1.注册Dispatcherservlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name 】 -servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别-1-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--/匹配所有的请求;(不包括.jsp ) -->
    <!--/*匹配所有的请求;(包括.jsp ) -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3.编写springmvc-servlet.xml(spring管理的配置文件)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmins="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">
	<!--HandlerMapping 处理器映射器、HandlerAdapter 处理器适配器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器:解析DispatcherServlet给他的ModelAndview中的view-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

4.自定义HelloController类(处理器)并注入到spring

public class HelloController implements Controller {
   @Override
   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       ModelAndView modelAndView = new ModelAndView();
       //模型视图添加一个对象:属性名:msg,属性值:HelloSpringMVC!
       modelAndView.addObject("msg","HelloSpringMVC!");
       //设置视图的名字(路径)对应hello.jsp中的hello
       modelAndView.setViewName("hello");// /jsp/hello.jsp
       return modelAndView;
   }
}

你会发现HelloController类是灰色的,是没有引用的意思,否则就相当于没有写这个类。因此我们需要注入到spring容器里,也就是在springmvc-servlet.xml(spring管理的配置文件)注册bean。

<bean id="/hello" class="com.kxy.controller.HelloController"/>

5.创建output root组件下的WEBINF/lib目录

在这里插入图片描述

这是因为老版的springMVC架构里web项目jar包都是由lib管理的,但是idea没有lib文件夹。如果报404,应该是依赖找不到。因此需要手动配置依赖。

6.启动tomcat服务器 输入地址/hello

在这里插入图片描述

理一下思路

首先,不再是像原生的MVC那样,每写一个servlet就需要在web.xml注册servlet。在这里,web.xml里注册的是DispatcherServlet。
然后在spring容器里注入四个bean:
1.处理器映射器(HandlerMapping):通过用户请求的url(/hello)来找到对应的处理器,如本demo中的Hellocontroller。生成处理器执行链HandlerExecutionChain并返回。
2.处理器适配器(HandlerAdapter):适配并执行处理器(Hellocontroller)返回一个modelAndView对象。
3.视图解析器ViewReslover (注入视图对应文件路径的前缀和后缀):根据视图名称,解析视图对象,返回视图对象。
springMVC这三大组件完成他们的工作后,都要把对象返回给DispatcherServlet。
4.controller处理器:封装模型和视图对象modelAndView,返回modelAndView,交给HandlerAdapter。

DispatcherServlet的工作流程其实就是这样的:
在这里插入图片描述
这张图中我用了两种颜色的块状区域来表示,绿色表示 MVC 部分,橘色表示 SpringMVC 三大组件,这里共划分出了 11 个步骤,这里对这 11 个步骤进行一下说明:

1)用户发送请求至前端控制器 DispatcherServlet。

2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。

3) 处理器映射器根据请求 url 找到具体的处理器,生成处理器执行链HandlerExecutionChain(处理器对象和处理器拦截器(如果有则生成))一并返回给 DispatcherServlet。

4) DispatcherServlet 通过 HandlerAdapter 处理器适配器调用处理器。

5) HandlerAdapter 执行处理器(handler,也叫后端控制器)。

6) Controller 执行完成返回 ModelAndView。

7) HandlerAdapter 将 handler 执行结果 ModelAndView 返回给 DispatcherServlet。

8) DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。

9) ViewReslover 解析后返回具体 View 对象。

10) DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)。

11) DispatcherServlet 响应用户。

下面我们通过注解来简化以上的springMVC架构:

链接: 【SpringMVC】使用注解实现SpringMVC框架

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

❀༊烟花易冷ღ

觉得博客写的不错就打赏一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值