Spring MVC核心组件
DispatcherServlet
- 前端控制器,是整个MVC流程的核心,控制其他组件的执行,进行统一的调度,降低各个组件之间的耦合性
Handler
- 处理器,完成具体的业务逻辑
HandlerMapping
- DispatcherServlet接收到请求之后,通过HandlerMapping将不同的请求映射成不同的Handler
HandlerInterceptor
- 处理器拦截器,是一个接口,如需完成拦截器可实现该接口
HandlerExecutionChain
- 处理器执行链,包含了Handler和HandlerInterceptor
HandlerAdapter
- 处理器适配器,Handler执行业务方法之前,需要进行一系列的操作,包括表单数据的验证,数据类型的转换,将表单封装到JavaBean
ModelAndView
- 装载了模型视图和视图信息,作为Handler的处理结果返回给DispatcherServlet
ViewResolver
- 视图解析器,DispatcherServlet将逻辑视图转换成物理视图,最终将渲染结果返回给客户端
Spring MVC 工作流程
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成,也就是图上HandlerExecutionChain)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配提取Request中的模型数据,填充Handler入参,调用具体的处理器Handler(Controller,也叫后端控制器),完成业务处理。
6、Handler执行完成返回ModelAndView。
7、HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View(将逻辑视图转换成物理视图)。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
使用Spring MVC
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="com.kevin"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
package com.kevin.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String index(){
System.out.println("hello");
return "index"; //返回的这个字符串就相当于是jsp文件的文件名
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>请求 localhost:8080/s5/hello</title>
</head>
<body>
<p>hello springMVC</p>
</body>
</html>
-