Spring MCV基础理论入门

35 阅读6分钟

一 什么是MVC

MVC 模型 是一种软件设计模式,用于将应用程序的逻辑分为三个核心组件:Model(模型)、View(视图) 和 Controller(控制器)。这种分层架构的目的是实现关注点分离,使代码更易于维护、扩展和测试。MVC 模型广泛应用于 Java Web 开发中,尤其是在 Spring MVC、Struts 等框架中。

1.1 MVC 模型的三个核心组件

  1. Model(模型):
  • 负责管理应用程序的核心数据和业务逻辑。
  • 模型通常包括:
    • 数据访问层(如 DAO、Repository)。
    • 业务逻辑层(如 Service)。
  • 模型不直接与用户交互,而是通过控制器与视图通信。
  1. View(视图):
  • 负责展示数据(用户界面)。
  • 视图从模型中获取数据,并将其渲染为用户可见的界面(如 HTML 页面、JSON 数据等)。
  • 视图不处理业务逻辑,只负责显示数据。
  1. Controller(控制器):
  • 负责处理用户输入(如 HTTP 请求),并调用模型和视图来完成请求。
  • 控制器接收用户请求,调用模型处理业务逻辑,然后选择适当的视图来渲染结果。

1.2 MVC 工作流程

  1. 用户通过视图(如浏览器)发起请求。
  2. 控制器接收请求,解析用户输入。
  3. 控制器调用模型处理业务逻辑,并获取数据。
  4. 控制器将数据传递给视图。
  5. 视图渲染数据,生成用户界面并返回给用户。

二 Servlet API技术

Servlet API 是 Java EE(Java Platform, Enterprise Edition)规范的一部分,提供了一组用于开发 Web 应用程序的接口和类。Servlet 是运行在服务器端的 Java 程序,用于处理客户端(通常是浏览器)的请求并生成响应。可以通过 Filter 和 Listener 扩展功能。

Servlet API 是 Java Web 开发的基础,许多流行的 Java Web 框架(如 Spring MVC、Struts)都是基于 Servlet API 构建的。

2.1 核心概念

  1. Servlet:
  • 一个 Java 类,实现了 javax.servlet.Servlet 接口(通常继承 javax.servlet.http.HttpServlet)。
  • 用于处理 HTTP 请求(如 GET、POST)并生成响应。
  1. Servlet 容器:
  • 负责管理 Servlet 的生命周期、请求处理和响应生成。
  • 常见的 Servlet 容器包括 Tomcat、Jetty、Undertow 等。
  1. HTTP 请求和响应:
  • Servlet 通过 HttpServletRequest 对象获取客户端请求信息。
  • 通过 HttpServletResponse 对象向客户端发送响应。
  1. Servlet 生命周期:Servlet 的生命周期由 Servlet 容器管理,包括初始化、服务请求和销毁三个阶段。

2.2 一个Servlet 示例

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html");

        // 获取输出流
        PrintWriter out = response.getWriter();

        // 生成 HTML 响应
        out.println("<html><body>");
        out.println("<h1>Hello, World!</h1>");
        out.println("</body></html>");
    }
}

2.3 配置Servlet

有两种配置方式:

  1. 在 web.xml 中配置 Servlet 的映射和初始化参数:
<web-app>
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>
  1. 使用注解(Servlet 3.0+),在 Servlet 类上使用 @WebServlet 注解配置
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet(name = "HelloServlet", urlPatterns = {"/hello"})
public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 业务代码
    }
}

三 Spring MCV入门

Spring官网的MVC模块一段介绍:

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning.

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就已包含在Spring框架中。

Spring MVC 是 Spring 框架中的一个模块,用于构建基于 MVC(Model-View-Controller)设计模式的 Web 应用程序。它提供了灵活、可扩展的方式来开发 Web 应用,支持 RESTful 风格和传统的请求-响应模型。

  1. 松耦合:MVC 分层架构使代码更清晰,易于维护和扩展。
  2. 灵活性:支持多种视图技术和数据格式。
  3. 强大的注解支持:通过注解简化配置和开发。
  4. 与 Spring 生态集成:与 Spring 框架的其他模块(如 Spring Boot、Spring Security)无缝集成

3.1 核心功能

  1. 灵活的 URL 映射:
  • 通过 @RequestMapping@GetMapping@PostMapping 等注解,将 HTTP 请求映射到具体的控制器方法。
  1. 数据绑定和验证:
  • 自动将请求参数绑定到 Java 对象(如表单数据绑定到 POJO)。
  • 支持 JSR-303/JSR-380 标准的数据验证(如 @Valid 注解)。
  1. 视图解析:
  • 支持多种视图技术(如 JSP、Thymeleaf、FreeMarker、JSON、XML 等)。
  • 通过 ViewResolver 将逻辑视图名称解析为实际视图。
  1. 异常处理:
  • 提供全局异常处理机制(如 @ControllerAdvice@ExceptionHandler)。
  1. 文件上传:
  • 支持文件上传功能,通过 MultipartFile 处理上传的文件。
  1. RESTful 支持:
  • 支持 RESTful 风格的 Web 服务开发,通过 @RestController@ResponseBody 返回 JSON 或 XML 数据。
  1. 国际化(i18n):
  • 支持多语言资源文件的加载和动态切换。
  1. 拦截器(Interceptor):
  • 提供拦截器机制,用于在请求处理前后执行特定逻辑(如权限验证、日志记录)。

3.2 工作原理

Spring MVC 的核心是基于 Servlet API 的 DispatcherServlet,它是整个框架的中央调度器。处理一个请求的核心流程为:

  1. 用户发送请求:用户通过浏览器发送 HTTP 请求到服务器。
  2. DispatcherServlet 接收请求:前端控制器负责接收所有请求并分发到合适的处理器(Controller)。
  3. HandlerMapping 查找处理器:根据请求的 URL 找到对应的控制器方法(通过 @RequestMapping 等注解配置)。
  4. 调用控制器方法:DispatcherServlet 调用找到的控制器方法,执行业务逻辑。
  5. 数据绑定和验证:请求参数会被绑定到控制器方法的参数(如表单数据绑定到 POJO),并进行数据验证。
  6. 处理业务逻辑:控制器方法调用 Service 层处理业务逻辑,并返回一个模型(Model)或数据对象。
  7. 返回 ModelAndView:控制器方法返回一个 ModelAndView 对象,包含模型数据和视图名称。
  8. 视图解析:ViewResolver 根据视图名称解析出实际的视图(如 JSP 页面或 Thymeleaf 模板)。
  9. 渲染视图:视图使用模型数据渲染页面,生成最终的 HTML 内容。
  10. 返回响应:DispatcherServlet 将渲染后的视图内容作为 HTTP 响应返回给客户端。

3.3 核心组件

  1. DispatcherServlet:前端控制器,负责请求的分发和响应的返回。
  2. HandlerMapping:负责将请求映射到具体的处理器(Controller)。
  3. HandlerAdapter:负责调用处理器方法,并处理返回值。
  4. Controller:处理用户请求,执行业务逻辑,并返回模型和视图。
  5. ViewResolver:负责将逻辑视图名称解析为实际视图。
  6. View:负责渲染模型数据,生成用户界面。
  7. Model:封装应用数据,传递给视图进行渲染。
  8. HandlerInterceptor:拦截器,用于在请求处理前后执行特定逻辑。

3.4 配置方式

  1. XML 配置:
  • 通过 web.xml 配置 DispatcherServlet 和 Spring 上下文。
  • 使用 XML 文件定义 Bean 和 MVC 配置。
  1. Java 配置:
  • 使用 @Configuration@EnableWebMvc 注解配置 Spring MVC。
  • 通过 WebMvcConfigurer 接口自定义配置。
  1. 注解驱动:使用 @Controller@RequestMapping@ResponseBody 等注解简化开发。