当前位置: 代码网 > it编程>编程语言>Java > 解读Spring MVC的工作流程

解读Spring MVC的工作流程

2025年01月22日 Java 我要评论
spring mvc 的工作流程是基于模型-视图-控制器(mvc)设计模式的一个典型实现,以下是其主要工作流程步骤:spring mvc 的工作流程客户端请求发送到前端控制器(dispatcherse

spring mvc 的工作流程是基于模型-视图-控制器(mvc)设计模式的一个典型实现,以下是其主要工作流程步骤:

spring mvc 的工作流程

客户端请求发送到前端控制器(dispatcherservlet)

  • 用户通过浏览器发送请求,该请求首先到达 spring mvc 的前端控制器 dispatcherservlet
  • 这个类是整个流程的核心,它负责协调其他组件的执行。

前端控制器转发请求给处理器映射器(handler mapping)

  • dispatcherservlet 接收到请求后,依据请求的 url 查找相应的处理器(controller)来处理请求。
  • 这个映射由 handler mapping 完成,它根据配置查找具体的处理器。

处理器映射器找到相应的控制器(controller)

  • handler mapping 根据请求的路径,确定使用哪个 controller 来处理请求。
  • 找到之后,它返回 controller 的信息给 dispatcherservlet

前端控制器调用目标处理器(controller)

  • dispatcherservlet 根据 handler mapping 提供的信息,调用具体的 controller 处理请求。
  • 控制器中的业务逻辑会处理客户端的数据,并返回一个 modelandview 对象,包含了模型数据和视图名称。

控制器返回模型数据和视图名称

  • controller 将处理后的模型数据和视图名称返回给 dispatcherservlet

前端控制器请求视图解析器(view resolver)

  • dispatcherservlet 将视图名称交给视图解析器 view resolver
  • 由它负责将视图名称解析为具体的视图(比如 jsp、thymeleaf 等)

视图解析器生成视图

  • 视图解析器会根据配置找到相应的物理视图文件
  • 并返回给 dispatcherservlet

前端控制器将模型数据传递给视图

  • dispatcherservlet 将控制器返回的模型数据传递给解析出来的视图
  • 通常这些数据会通过 modelmodelandview 对象传递

视图渲染

  • 视图结合模型数据进行渲染
  • 生成最终的 html 页面

前端控制器响应客户端

  • 渲染后的视图由 dispatcherservlet 返回给客户端(浏览器)
  • 最终用户看到的是处理后的页面内容

例子

假设我们有一个简单的 web 应用程序,用于显示用户的个人信息。当用户访问 /user/1 这个 url 时,应用程序会展示 id 为 1 的用户信息。

详细步骤

用户发送请求到服务器: 用户在浏览器中输入 url /user/1,比如 http://localhost:8080/user/1,这个请求被发送到服务器。

前端控制器(dispatcherservlet)接收请求: spring mvc 的核心组件 dispatcherservlet 会拦截所有进入的 http 请求。它相当于请求的入口点,负责将请求分发到适当的处理器(controller)。

  • 例子中的请求路径 /user/1dispatcherservlet 拦截,准备分配给相应的处理器。

通过处理器映射器(handler mapping)查找控制器dispatcherservlet 使用处理器映射器(handlermapping)查找合适的控制器来处理 /user/1 请求。这个映射过程通常是根据 url 路径来匹配的。

  • 例如,@requestmapping("/user/{id}") 注解可以告诉 spring 这个方法负责处理 /user/{id} 的请求。
  • 在我们的例子中,处理器映射器会找到 usercontroller,该控制器负责处理所有与用户相关的请求。

控制器(controller)处理请求: 找到合适的控制器后,dispatcherservlet 将请求转发给控制器。控制器包含了应用程序的业务逻辑,负责处理用户请求和返回数据。

  • 在这个例子中,usercontroller 的方法会接受用户的 id(比如 1),然后从数据库或内存中获取 id 为 1 的用户信息。
@controller
public class usercontroller {
    @requestmapping("/user/{id}")
    public modelandview getuser(@pathvariable("id") int userid) {
        // 模拟从数据库获取用户数据
        user user = userservice.getuserbyid(userid);
        modelandview mav = new modelandview("userview");
        mav.addobject("user", user);
        return mav;
    }
}

在这个例子中:

  • getuser 方法会从 userservice 获取用户数据,并将该数据存储在 modelandview 对象中,返回给 dispatcherservlet
  • "userview" 是视图的名称,spring mvc 会根据这个名称来找到合适的视图模板(比如 jsp 页面、thymeleaf 页面等)。
  • mav.addobject("user", user) 将用户信息存储在模型中,供视图使用。

返回模型和视图给 dispatcherservlet: 控制器方法返回一个 modelandview 对象,包含了模型数据(用户信息)和视图名称(userview)。dispatcherservlet 接收这个返回对象。

通过视图解析器(view resolver)查找视图dispatcherservlet 会将视图名称(如 "userview")交给视图解析器(viewresolver),由它根据配置找到物理视图文件。

视图解析器生成视图: 视图解析器会找到 userview.jsp 并返回给 dispatcherservlet。此时,视图还没有渲染出用户数据,只是找到了物理文件。

前端控制器将模型数据传递给视图dispatcherservlet 将控制器返回的用户数据(模型)传递给 userview.jsp 视图。视图文件会使用这些数据生成动态的 html 页面。

视图渲染: 视图(userview.jsp)结合模型数据进行渲染。比如 jsp 文件中可能会使用表达式 ${user.name} 来显示用户的姓名。

返回响应到客户端: 渲染后的 html 页面被返回给客户端(用户的浏览器)。用户最终看到的是包含用户信息的完整页面。

注:

  • 在使用 spring boot 进行前后端分离开发时,后端只负责提供数据接口(通常以 restful api 的形式),前端负责渲染页面和处理用户交互。
  • 这种架构在 spring boot 中表现为 restful api,而不再像传统 spring mvc 那样返回视图。
  • 与传统 mvc 不同,controller 使用 @restcontroller,直接返回 java 对象,而不返回视图。
  • spring boot 会自动将返回的对象序列化为 json 或 xml。
@restcontroller
public class usercontroller {
    @getmapping("/user/{id}")
    public user getuser(@pathvariable("id") int id) {
        // 从服务层获取用户信息
        return userservice.getuserbyid(id); // 返回的是 user 对象,而不是视图名称
    }
}

传统 spring mvc 返回视图

  • 返回的是视图文件(如 jsp 页面)通过服务端渲染动态 html。
  • 控制器返回 modelandview 对象,包含视图名称和模型数据。
  • 使用 jsp、thymeleaf 等视图引擎渲染视图。

spring boot restful api

  • 返回的是 json 或 xml 格式的数据,由前端或客户端负责渲染。
  • 使用 @restcontroller,控制器直接返回对象,spring boot 自动将其转换为 json。

总结

spring mvc 的整个流程可以简单总结为以下几个步骤:

  1. 用户发送请求到 dispatcherservlet
  2. dispatcherservlet 使用 handlermapping 查找对应的控制器。
  3. 控制器处理请求,生成 modelandview
  4. dispatcherservlet 使用 viewresolver 解析视图名称。
  5. 将模型数据传递给视图进行渲染。
  6. 将渲染的视图返回给用户。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com