前言
Spring MVC是一个用于构建Web应用程序的基于MVC(Model-View-Controller)设计模式的框架。
它是Spring Framework的一部分,提供了一种灵活、可扩展且功能强大的方式来开发Java Web应用程序。
以下是关于Spring MVC的主要特点和核心组件:
特点:
解耦合: Spring MVC与具体的视图技术解耦,可以方便地切换不同的视图渲染器,如JSP、Thymeleaf、Freemarker等。
基于注解: 通过使用注解,可以简化配置,并提高开发效率。例如,通过@Controller注解声明控制器类,@RequestMapping注解映射URL请求。
强大的数据绑定和验证: Spring MVC提供了数据绑定和验证功能,让处理表单数据更加方便和安全。
内置支持RESTful风格: Spring MVC原生支持处理RESTful风格的请求,并提供了@RestController注解,使编写RESTful API更加简洁。
拦截器支持: 通过拦截器(Interceptor),可以在请求处理的各个阶段进行预处理和后处理,实现统一的处理逻辑,如身份验证、日志记录等。
通过Spring MVC,开发人员可以使用简洁的代码组织Web应用程序,并实现良好的分层结构和可测试
一、 核心的组件
DispatcherServlet:
中央调度器,负责接受所有的请求,并调度其他组件的执行,负责将用户请求分配给相应的控制器处理,还可以降低不同组件之间的耦合性,是整个Spring MVC的核心模块
Handler:
处理器,完成具体的业务逻辑,数据处理,相当于Servlet
HandlerMapping:
用于将所有的请求映射到相应的控制器处理方法。Spring MVC 的 HandlerMapping 可以配置多个,以支持不同的 URL 映射方式。
HandlerInterceptor:
处理器拦截器,是一个接口,如果我们需要进行一些拦截处理,可以通过实现该接口完成
HandlerExecutionChain:
处理器执行链,包括两部分内容:Handler和HandlerInterceptor(系统会有一个默认的HandlerInterceptor,如果有额外拦截处理,可以添加拦截器进行设置)
HandlerAdapter:处理器适配器,Handler执行业务方法之前,需要进行一系列的操作包括表单的数据验证、数据类型转换、把表单数据封装到POJO等,这些一系列的操作都是由HandlerAdapter完成,DispatcherServlet通过HandlerAdapter执行不同的Handler。也就是将控制器处理方法封装成处理器,同时支持多种处理器,以支持不同的控制器处理方法。
ModelAndView:
封装了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet
ViewResolver:
视图解析器,DispatcherServlet通过它把逻辑视图解析为物理视图的路径。
View:
负责渲染数据模型并生成最终的响应结果,可以是HTML页面或其他类型的数据格式。
在 Spring MVC 中,我们通常需要定义一个控制器来处理请求,可以通过 @Controller 注解来标识一个控制器。控制器中的处理方法使用 @RequestMapping 注解来映射请求 URL,并通过 @RequestParam 等注解来获取请求参数和路径变量等信息。模型数据可以通过 ModelAndView 或 ModelMap 等方式传递给视图模板进行渲染。
其中除了以上核心组件,Spring MVC还提供了许多其他功能和扩展点,如数据绑定、表单验证、文件上传、异常处理、国际化支持等,以满足各种Web应用程序的需求。
二、基本实现流程
1. 客户端请求被DispatcherServlet接收
2. 根据这些请求,然后HandlerMapping将请求路径分组映射到不同的Handler
3. Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet
4. DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理
5. 返回一个ModelAndView对象给DispatcherServlet
6. DispatcherServlet把获取的ModelAndView对象传给ViewResolver视图解析器,把逻辑视图解析成物理视图
7. ViewResolver返回一个View进行视图渲染(把模型填充到视图中)
8. DispatcherServlet把渲染后的视图响应给客户端
在上述工作流程中,DispatcherServlet 充当着中央调度器的角色,负责接收客户端的请求,并将请求分发给相应的 Controller 进行处理。HandlerMapping 和 ViewResolver 则负责解析请求信息和视图信息,将请求路由到正确的 Controller 和对应的视图模板进行处理。Controller 则负责处理业务逻辑,通过 ModelAndView 来封装模型数据和视图名称。最终,DispatcherServlet 将视图渲染之后返回给客户端。
整个流程中涉及到的关键组件包括 DispatcherServlet、HandlerMapping、HandlerAdapter、Controller、ViewResolver 和 View 等 ,Spring MVC 框架处理请求的方式非常灵活,可以通过配置多个 HandlerMapping、HandlerAdapter 和 ViewResolver 等来支持不同的 URL 映射方式和控制器处理方法。
三、MVC的基本配置使用
1.导入依赖:在项目的构建工具(如Maven、Gradle)配置文件中添加Spring MVC的依赖项
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>SpringMVC</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>SpringMVC Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--mvc支持--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.19</version> </dependency> </dependencies> </project>
2.配置web.xml:在web.xml文件中配置DispatcherServlet,作为中央调度器。
<!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> <!-- 配置springmvc的核心servlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- 告诉springmvc配置文件的位置--> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <!-- 拦截所有请求--> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
3.创建Spring MVC配置文件:在上述配置中指定的位置创建Spring MVC的配置文件,配置各种的组件。
<?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" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 1. 开启注解扫描--> <context:component-scan base-package="com.lin.controller"/> <!-- 2. 配置处理器映射器--> <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />--> <!-- 3. 开启处理器适配器--> <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />--> <!-- 上面两段配置被下面的一句话所替代(封装)--> <mvc:annotation-driven /> <!-- 4. 开启视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
4.创建控制器:在指定的控制器包路径中创建处理请求的控制器类,并添加注解以标识为控制器。
@Controller public class HomeController { @RequestMapping("/") public String home() { return "home"; } }
5.创建视图:根据上述配置中的视图解析器,创建对应的JSP视图文件。
6.运行应用程序:部署项目到服务器,并启动服务器,访问相应的URL即可看到处理后的视图。
以上是springmvc的基本流程步骤,要求详细的过程还需要小伙伴多去学习学习