什么是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架构: