文章目录
- 1. MVC
- 2. SpringMVC
- 3. 执行流程
- 4. 配置文件
- 5. 常用注解
1. MVC
MVC(Model-View-Controller)是一种软件架构模式,旨在将应用程序分为三个核心组件:
-
模型(Model): 模型代表应用程序的数据和业务逻辑。它负责管理数据的状态和行为,并且不直接处理用户界面或用户输入。通常,模型对象用于检索、存储、修改和操作应用程序的数据,以及定义应用程序的业务规则。
-
视图(View): 视图是模型的可视化表示,负责将数据呈现给用户,并与用户进行交互。视图通常是用户界面的一部分,例如网页、图形界面或移动应用程序的用户界面。视图接收模型的数据,并根据数据呈现用户界面。
-
控制器(Controller): 控制器是模型和视图之间的中介,负责处理用户输入并更新模型或视图。它接收来自用户的输入(例如请求或命令),然后根据输入调用适当的模型操作或选择合适的视图进行显示。控制器负责应用程序的流程控制和业务逻辑。
MVC 模式的主要目标是将应用程序的不同方面分离开来,以便更好地组织代码、提高代码的可维护性和可扩展性。通过将数据、显示和控制逻辑分离,MVC 模式使得应用程序的各个部分能够相互独立地进行开发、测试和维护。
2. SpringMVC
Spring MVC 是 Spring Framework 的一部分,是一个基于 Java 的开源 Web MVC 框架,用于构建 Web 应用程序。它提供了一种轻量级的、灵活的方式来开发 Web 应用程序,并借助依赖注入和面向切面编程等技术来促进松耦合和高效的开发。
Spring MVC 框架基于 MVC(Model-View-Controller)设计模式,采用了前端控制器(Front Controller)的架构,其核心组件包括:
-
DispatcherServlet(前端控制器):DispatcherServlet 是 Spring MVC 框架的入口点,负责接收所有客户端请求,并将请求分派给合适的处理器(Controller)。它是一个 Servlet,通常配置在 web.xml 文件中,并拦截所有请求。
-
Controller(控制器):控制器负责处理客户端请求,执行相应的业务逻辑,并返回适当的响应给客户端。在 Spring MVC 中,控制器通常是一个 POJO(Plain Old Java Object)类,可以通过注解或 XML 配置来定义。
-
HandlerMapping(处理器映射器):处理器映射器负责将客户端请求映射到相应的控制器处理程序。Spring MVC 提供了多种类型的处理器映射器,如注解映射、路径映射等,以便灵活地配置请求映射规则。
-
ViewResolver(视图解析器):视图解析器负责将逻辑视图名称解析为实际的视图对象,用于呈现给客户端。视图解析器根据视图名称查找视图模板,并返回给 DispatcherServlet 进行渲染。
-
View(视图):视图负责呈现模型数据给用户,并与用户进行交互。视图通常是一个模板文件,如 JSP、Thymeleaf、Freemarker 等,用于生成客户端可视化的页面内容。
-
Model(模型):模型代表应用程序的数据和业务逻辑,负责封装数据并执行业务逻辑操作。控制器可以与模型进行交互,获取或更新数据,并将数据传递给视图进行显示。
Spring MVC 框架还提供了许多功能和特性,如拦截器、数据绑定、表单处理、文件上传、国际化、异常处理等,以便开发者能够更轻松地构建灵活、高效的 Web 应用程序。
3. 执行流程
下图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。
简要分析执行流程:
1.DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求,我们假设请求的url为:http://localhost:9999/SpringMVC/input-product
如上url拆分成三部分:
(1)http://localhost:9999 服务器域名
(2)SpringMVC部署在服务器(http://localhost:9999)上的web站点
(3)input-product表示控制器
通过分析,如上url表示为:请求位于服务器localhost:9999上的SpringMVC站点的input-product控制器
2.HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler
3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:input-product
4.HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等
5.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler
6.Handler让具体的Controller执行
7.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView
8.HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名
10.视图解析器将解析的逻辑视图名传给DispatcherServlet
11.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图
12.最终视图呈现给用户。
4. 配置文件
Spring MVC 的配置文件通常是一个 XML 文件,其中包含了配置 Spring MVC 框架的各种组件和特性。主要的配置文件是 web.xml 和 springmvc-servlet.xml(或者是通过 Java Config 类配置的方式)。下面是一个典型的 Spring MVC 配置文件的示例:
1.web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"id="WebApp_ID" version="4.0"><!-- 配置 DispatcherServlet --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置 Spring MVC 的配置文件位置 --><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/springmvc-servlet.xml</param-value></init-param><!-- 启动时加载 --><load-on-startup>1</load-on-startup></servlet><!-- 映射 DispatcherServlet 的 URL --><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>
2.springmvc-servlet.xml:
<?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 启用注解驱动 --><mvc:annotation-driven/><!-- 扫描控制器包 --><context:component-scan base-package="com.example.controllers"/><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean></beans>
在这个示例中,web.xml 配置了 DispatcherServlet,并指定了其配置文件的位置为 /WEB-INF/springmvc-servlet.xml。而 springmvc-servlet.xml 文件则配置了 Spring MVC 的各种组件,包括启用注解驱动、扫描控制器包、配置视图解析器等。
5. 常用注解
@Controller: 用于标识一个类是 Spring MVC 的控制器,处理用户请求并返回相应的视图或数据。
@RequestMapping: 用于映射请求 URL 到处理方法,可以用在类级别和方法级别,用于指定处理器的访问路径。
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping: 这些注解是@RequestMapping的快捷方式,用于标识对应的 HTTP 请求方法的处理器方法。
@RequestParam: 用于从请求中获取参数值,可以指定参数的名称、是否必需等。
@PathVariable: 用于将 URL 中的模板变量绑定到处理方法的参数上,用于获取 RESTful 风格的 URL 中的路径参数。
@RequestBody: 用于将请求体中的数据绑定到处理方法的参数上,通常用于处理 POST 请求中的 JSON 或 XML 格式的数据。
@ResponseBody: 用于将处理方法的返回值直接作为 HTTP 响应体返回给客户端,通常用于返回 JSON 或 XML 格式的数据。
@ModelAttribute: 用于将请求参数绑定到处理方法的模型属性上,也可以用于在请求处理之前初始化模型数据。
@SessionAttributes: 用于将模型属性存储到会话中,以便多个请求之间共享数据。
@ExceptionHandler: 用于处理控制器内部抛出的异常,可以将特定类型的异常映射到处理方法上。
@InitBinder: 用于初始化数据绑定器,可以自定义数据绑定规则。
@CrossOrigin: 用于配置跨域资源共享 (CORS)。