【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解

 🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 🚀

本专栏纯属为爱发电永久免费!!!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/

 本文简单讲解了一下SpringMVC的调用链,讲解其原理 和servlet容器交互的过程,以及比较重要的JSP模板映射的过程,主要的作用就是把一堆干巴巴的数据 变成一份精美的可视化的视图,并且简单高效,希望对大家有帮助!

 

目录

为什么调用链对于理解Spring MVC至关重要

故事背景:坤坤饭店

解释调用链的定义和作用

HTTP请求的到达:从浏览器到Servlet容器

探索Spring MVC如何与Servlet容器进行交互

DispatcherServlet:Spring MVC的核心

讨论DispatcherServlet如何处理请求并将其分发到适当的处理器

JSP模板应用实战示例:

首先要引入jsp 模板引擎


为什么调用链对于理解Spring MVC至关重要

调用链对于理解业务流程和请求处理的关系非常重要。在一个典型的业务场景中,可以将调用链视为请求在不同组件之间传递的过程,每个组件负责执行特定的任务。下面用一个弱智的小故事解释他们之间的关系

故事背景:坤坤饭店

在一个小镇的中心,有一家古老而有名的饭店,名字叫做"坤坤"。这家饭店以其出色的厨师团队和创意的特色菜吸引了众多食客。然而,这家饭店的成功并不仅仅依赖于美食,还有一个关键的因素,那就是无缝的协调和组织。

解释调用链的定义和作用

调用链是指一系列环节的有序执行,每个环节都处理特定的任务,并将结果传递给下一个环节。在坤坤饭店的背景中,调用链是确保饭店运营顺利的关键。每个环节都扮演着重要的角色,就像饭店中的不同工作人员一样。

HTTP请求的到达:从浏览器到Servlet容器

在坤坤饭店中,我们假设顾客通过浏览器发送HTTP请求,以点菜为例。让我们看看这个过程的基本流程:

  1. 顾客在浏览器中输入饭店的网址,并点击菜单页面上的菜品。
  2. 浏览器将发送HTTP请求到饭店的Servlet容器。
  3. Servlet容器接收到请求,并根据URL映射将请求发送给相应的处理器。

这个过程中涉及到了多个环节,每个环节都有其特定的功能和责任。这种有序的执行过程就是调用链的体现。

探索Spring MVC如何与Servlet容器进行交互

在坤坤饭店中,Spring MVC框架扮演了一个重要的角色,它与Servlet容器进行交互,以处理和分发请求。让我们看看Spring MVC是如何与Servlet容器进行交互的:

  1. 当Servlet容器接收到HTTP请求后,它将请求交给DispatcherServlet处理。
  2. DispatcherServlet是Spring MVC框架的核心,它负责协调整个请求处理过程。
  3. DispatcherServlet根据配置信息和URL映射,将请求分发给适当的处理器。

通过这种方式,Spring MVC框架与Servlet容器紧密合作,确保请求能够被正确处理和分发。

DispatcherServlet:Spring MVC的核心

DispatcherServlet是Spring MVC框架的核心组件,它负责协调整个请求处理过程。它有以下的作用和功能:

  1. 接收HTTP请求并将其传递给适当的处理器。
  2. 调用处理器执行业务逻辑并获取处理结果。
  3. 根据处理结果选择合适的视图进行渲染。
  4. 将渲染后的视图返回给客户端。

DispatcherServlet的处理流程是一个典型的调用链,每个环节都有特定的职责,并将结果传递给下一个环节。这种有序的执行确保了请求的正确处理和响应。

讨论DispatcherServlet如何处理请求并将其分发到适当的处理器

在坤坤饭店中,DispatcherServlet就像是饭店的总指挥部,负责协调各种组件之间:

  1. 控制器处理请求:控制器(Controller)是业务逻辑的处理中心,它根据请求的类型和参数执行相应的操作。例如,控制器可能会调用商品服务来获取商品信息。

  2. 服务层处理业务逻辑:服务层(Service)包含了业务逻辑的具体实现。在这个例子中,商品服务可能会从数据库中查询商品信息并返回给控制器。

  3. 控制器返回模型和视图:控制器接收到信息后,将其放入一个模型对象中,并选择一个合适的视图来渲染。模型对象包含了要在视图中显示的数据。这里的模板就是预先设定好的模板文件,就像这样

    <!DOCTYPE html>
    <html>
    <head><title>Example</title>
    </head>
    <body><h1>${title! "Default Title"}</h1><p>${message! "Default Message"}</p>
    </body>
    </html>

  4. 视图解析和渲染:视图解析器根据配置的规则找到对应的视图,并将模型中的数据填充到视图中。视图可能是一个HTML模板或其他类型的视图技术。

  5. 返回响应给客户端:DispatcherServlet将生成的视图返回给客户端,客户端收到响应后显示在浏览器中。

JSP模板应用实战示例:

首先要引入jsp 模板引擎

在Maven中添加

<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version>
</dependency>

接下来,你需要在Spring MVC配置文件中配置视图解析器,将JSP作为视图技术。假设你使用的是XML配置方式,可以在配置文件中添加以下内容:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/> <!-- 模板文件存放的路径 --><property name="suffix" value=".jsp"/> <!-- 模板文件的文件扩展名 -->
</bean>

上述配置将会将JSP视图解析为/WEB-INF/views/目录下的JSP文件。

接下来,你可以在该目录下创建一个JSP模板文件,例如book.jsp,其中可以使用JSP标签和表达式来插入动态数据:下面就是一个简单的文章的模板 

<!DOCTYPE html>
<html>
<head><title>Example</title>
</head>
<body><h1>${title != null ? title : "Default Title"}</h1><p>${message != null ? message : "Default Message"}</p>
</body>
</html>

在控制器中,你可以从数据库中获取数据,并将其存储在模型(Model)中,然后将模型传递给视图:

@Controller
public class ExampleController {@Autowiredprivate bookService bookService;@RequestMapping("/getBook")public String getBook(Model model) {ExampleData exampleData = bookService.getDataFromDatabase(); // 从数据库获取数据model.addAttribute("title", bookData.getTitle()); // 将数据存入模型model.addAttribute("message", bookData.getMessage());return "book"; // 返回视图名称}
}

在上面的示例中,bookeController是一个控制器类,通过@RequestMapping注解将请求映射到/getbook路径。在getBook方法中,你可以调用bookService来获取数据库中的数据,并将数据存储在模型中,使用model.addAttribute方法将数据添加到模型中。最后,返回视图名称"book",它将被视图解析器解析为对应的JSP模板文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python网络编程之Ping命令的实现】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之Ping命令的实现 代码见资源&#xff0c;效果图如下一、实验要求二、协议原理2…

所谓的意志力,也许根本就不存在

许多讲自我提升的书&#xff0c;往往会把成功的原因归结为两点&#xff1a;自律&#xff0c;以及专注。 他们会告诉你&#xff1a;为什么别人能够成功、而你不能&#xff1f;第一是你不够自律&#xff0c;无法每天雷打不动地坚持「好习惯」&#xff1b;第二&#xff0c;是你不够…

[Java][算法 滑动窗口]Day 02---LeetCode 热题 100---08~09

第一题 无重复字符串的最长子串 思路 其实就是在字符串S中 找到没有重复的最长子串的长度 这道题的难点就是在于如何判断最长并且无重复 首先 最长长度 可以使用变量max记录保存 再者 判断有无重复 最简单的方法就是 暴力遍历法 即对于每次找的子串都再次寻找遍历…

操作字符串之子串替换-13-${string//substring/replacement}

1.${string//substring/replacement} 使用$replacement来替换所有匹配的$substring 2.实例 操作字符串样例&#xff1a;stringabc123ABC456xyzabc 字符串操作默认从左边开始进行 命令&#xff1a; echo ${string//abc/ZTJ} [rootkibana ~]# echo ${string//abc/ZTJ} ZTJ…

Validation-参数校验框架

在代码完成后期,为保证数据的正确性和完整性,需要在后端对接口请求的参数进行校验。使用Spring的Validation框架&#xff0c;通过添加注解就可以完成参数校验&#xff0c;不用写if/else来逻辑判断了。 使用该框架&#xff0c;首先在请求参数接收层也就是controller层上方标注V…

【Chrono Engine学习总结】5-sensor-5.1-sensor基础并创建一个lidar

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 1、Sensor模块 Sensor模块是附加模块&#xff0c;需要单独安装。参考&#xff1a;【Chrono Engine学习总结】1-安装配置与程序运行 Sensor Module Tutorial Sensor …

【国产MCU】-CH32V307-基本定时器(BCTM)

基本定时器(BCTM) 文章目录 基本定时器(BCTM)1、基本定时器(BCTM)介绍2、基本定时器驱动API介绍3、基本定时器使用实例CH32V307的基本定时器模块包含一个16 位可自动重装的定时器(TIM6和TIM7),用于计数和在更新新事件产生中断或DMA 请求。 本文将详细介绍如何使用CH32…

苹果Mac键盘如何将 F1 到 F12 取消按Fn

苹果电脑安装了Win10操作系统之后&#xff0c;F1到F12用不了怎么办的解决方法。本文将介绍一些解决方法&#xff0c;帮助您解决无法使用F1到F12功能键的问题。 使用 Mac系统的人都知道&#xff0c;Mac系统默认是没有开启 F1-F12 的使用的&#xff0c;平时我们使用的系统都可以使…

AcWing 802. 区间和 离散化

文章目录 题目链接题目描述解题思路代码实现总结 题目链接 链接: AcWing 802. 区间和 题目描述 解题思路 离散化是一种常用的技巧&#xff0c;它能够将原始的连续数值转换为一组离散的值&#xff0c;从而简化问题的处理。在这段代码中&#xff0c;离散化的过程主要分为三个步…

2024全栈元年-thinkphp-数据操作

thinkphp 数据相关操作 1.单数据查询 1、单数据查询 ,Db::table(‘tp_stu’) 必须加前缀 2、如果只是查询符合条件的使用where find,如果没有符合条件的返回null 3、使用 findOrFail 没有数据会抛出异常 4、使用 findOrEmpty 没有数据会返回【】 5、得到最近一个原生SQL …

C++重新入门-指针篇

C 中的指针是一种非常重要的数据类型&#xff0c;它们存储了内存地址&#xff0c;可以用来直接访问和操作内存中的数据。指针提供了灵活性和直接性&#xff0c;但也需要谨慎使用&#xff0c;因为误用指针可能导致程序崩溃或安全漏洞。以下是对 C 指针的详细解释&#xff1a; 1…

那些也许你不知道的操作符!

前言 操作符有很多种&#xff0c;目前我们已经了解了一部分 例如最简单的、-、*、/、&#xff0c;还有我们学到的&&&#xff0c;||&#xff0c;!等&#xff0c;但是操作符可不是就只有这么些的&#xff0c;让我们一起来看看吧 目录 1. 移位操作符 原码、反码、补码…

当go get获取不到软件包时

当使用go get命令获取软件包时&#xff0c;如果无法成功获取&#xff0c;您可以尝试以下方法来解决问题&#xff1a; 检查网络连接&#xff1a;首先&#xff0c;确保您的计算机能够访问互联网&#xff0c;并且没有任何网络防火墙或代理设置阻止了go get命令的正常运行。 设置代…

Stream Query Denoising for Vectorized HD Map Construction

参考代码&#xff1a;截止2024.02未开源 动机与出发点 这篇文章是在StreamMapNet的基础上做的&#xff0c;为了在局部地图感知任务上提升时序上的感知稳定性&#xff0c;参考DN-DETR中的去噪方案&#xff0c;为局部地图感知提出一种针对局部地图元素的加噪声方案以及去噪逻辑。…

【开源】JAVA+Vue.js实现海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

深入理解XGBoost:集成学习与堆叠模型

导言 XGBoost是一种强大的集成学习算法&#xff0c;但在解决复杂问题时&#xff0c;单个模型可能无法达到最佳性能。集成学习和堆叠模型是两种有效的方法&#xff0c;可以进一步提高模型的性能。本教程将深入探讨如何在Python中应用集成学习和堆叠模型&#xff0c;使用代码示例…

Linux命令-break命令(结束for,while或until循环。)

说明 结束for&#xff0c;while或until循环&#xff0c;可指定退出几层循环。 语法 break [n]参数 n&#xff08;可选&#xff09;&#xff1a;大于等于1的整数&#xff0c;用于指定退出几层循环。 返回值 返回成功除非n小于1。 示例 # break的可选参数n缺省值为1。 # …

蓝牙BLE学习-安全

1.基本概念 蓝牙标准规定了5种基本的安全服务 身份验证:根据通信设备的蓝牙地址验证其身份。蓝牙不提供本地用户身份验证。保密性:确保只有授权的设备才能访问和查看传输的数据&#xff0c;防止窃听造成的信息泄露。授权(Authorization):在允许设备使用某项服务之前&#xff…

Verilog刷题笔记29

题目&#xff1a; Create a 100-bit binary ripple-carry adder by instantiating 100 full adders. The adder adds two 100-bit numbers and a carry-in to produce a 100-bit sum and carry out. To encourage you to actually instantiate full adders, also output the ca…

C++异常特性以及使用

异常 1.C传统的处理错误方式2.异常概念3.异常使用规则抛出和匹配规则 4.异常的重新抛出4.异常安全5.异常规范6.使用自定义的异常7.C标准异常体系7.异常优缺点 1.C传统的处理错误方式 终止程序&#xff1a;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&a…