springMVC中的控制器DispatcherServlet,是springMVC的核心
下面通过一个demo理解DispatcherServlet
相关jar包可参考下列:
<dependencies>
<dependency>//单元测试
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.2version>
<scope>testscope>
dependency>
<dependency>//springMVC基于spring框架
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.3.1version>
dependency>
<dependency>//servlet
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
dependency>
<dependency>//jsp
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
dependency>
<dependency>//jsp的标准库
<groupId>javax.servlet.jsp.jstlgroupId>
<artifactId>jstl-apiartifactId>
<version>1.2version>
dependency>
dependencies>
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc-servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<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">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
bean>
beans>
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"/>
这是因为老版的springMVC架构里web项目jar包都是由lib管理的,但是idea没有lib文件夹。如果报404,应该是依赖找不到。因此需要手动配置依赖。
首先,不再是像原生的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架构: