Java学习手册:Spring MVC 架构与实现

Spring MVC 架构与实现

一、Spring MVC 概述

Spring MVC 是 Spring 框架的一个模块,它提供了一套 Web 应用开发的解决方案,实现了 MVC(Model-View-Controller)设计模式。Spring MVC 提供了清晰的分离逻辑层、视图层和控制器层的结构,便于开发、测试和维护 Web 应用。

二、Spring MVC 的架构

  • DispatcherServlet :前端控制器,是整个 Spring MVC 的核心。它负责接收所有的 HTTP 请求,并将请求分发给相应的处理器。
  • HandlerMapping :处理器映射器,用于将请求映射到具体的处理器(Controller)上。它根据请求的 URL、HTTP 方法等信息,找到对应的处理器。
  • Controller :处理器,用于处理具体的业务逻辑。它接收请求参数,执行相应的业务操作,返回模型和视图信息。
  • ViewResolver :视图解析器,用于将逻辑视图名称解析为具体的视图实现。它根据控制器返回的视图名称,找到对应的视图文件(如 JSP、HTML 等)。
  • View :视图,用于展示数据给用户。它可以是 JSP、HTML、JSON 等多种形式。

三、Spring MVC 的工作流程

  1. 用户发送请求到 DispatcherServlet :DispatcherServlet 作为前端控制器,接收所有的 HTTP 请求。
  2. DispatcherServlet 查询 HandlerMapping :DispatcherServlet 根据请求的 URL 和 HTTP 方法,查询 HandlerMapping 来找到对应的处理器(Controller)。
  3. HandlerMapping 返回处理器 :HandlerMapping 返回找到的处理器给 DispatcherServlet。
  4. DispatcherServlet 调用处理器 :DispatcherServlet 调用处理器(Controller)来处理请求。
  5. 处理器处理请求并返回模型和视图 :处理器执行业务逻辑,处理请求参数,返回模型(Model)和视图(View)信息。
  6. DispatcherServlet 查询 ViewResolver :DispatcherServlet 使用 ViewResolver 将逻辑视图名称解析为具体的视图实现。
  7. ViewResolver 返回视图 :ViewResolver 返回具体的视图给 DispatcherServlet。
  8. DispatcherServlet 渲染视图 :DispatcherServlet 将模型数据填充到视图中,渲染视图。
  9. 将响应返回给用户 :DispatcherServlet 将渲染后的视图作为响应返回给用户。

四、Spring MVC 的配置

1. XML 配置

在 XML 配置文件中,可以配置 DispatcherServlet、HandlerMapping、Controller、ViewResolver 等组件。

web.xml 配置

<web-app><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

dispatcher-servlet.xml 配置

<beans><!-- 配置 HandlerMapping --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean><!-- 配置 Controller --><bean name="/hello" class="com.example.controller.HelloController"></bean><!-- 配置 ViewResolver --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"></property><property name="suffix" value=".jsp"></property></bean>
</beans>
2. 基于注解的配置

从 Spring 2.5 开始,引入了基于注解的配置方式,使得配置更加简洁和直观。常用的注解包括 @Controller@RequestMapping@RequestParam@ModelAttribute 等。

Controller 类

@Controller
@RequestMapping("/hello")
public class HelloController {@RequestMapping(method = RequestMethod.GET)public String sayHello(@RequestParam(value = "name", required = false, defaultValue = "World") String name, Model model) {model.addAttribute("name", name);return "hello";}
}

配置类

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class WebConfig implements WebMvcConfigurer {@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/views/");viewResolver.setSuffix(".jsp");return viewResolver;}
}

五、Spring MVC 的主要组件

  • DispatcherServlet :前端控制器,是整个 Spring MVC 的核心。它负责接收所有的 HTTP 请求,并将请求分发给相应的处理器。
  • HandlerMapping :处理器映射器,用于将请求映射到具体的处理器(Controller)上。常用的 HandlerMapping 实现有 BeanNameUrlHandlerMapping、RequestMappingHandlerMapping 等。
  • Controller :处理器,用于处理具体的业务逻辑。它接收请求参数,执行相应的业务操作,返回模型和视图信息。可以通过 @Controller 注解来标记一个类为 Controller。
  • ViewResolver :视图解析器,用于将逻辑视图名称解析为具体的视图实现。常用的 ViewResolver 实现有 InternalResourceViewResolver、.FreeMarkerViewResolver 等。
  • View :视图,用于展示数据给用户。它可以是 JSP、HTML、JSON 等多种形式。

六、Spring MVC 的优势

  • 清晰的架构 :Spring MVC 实现了 MVC 设计模式,将逻辑层、视图层和控制器层清晰地分离,便于开发、测试和维护。
  • 灵活的配置 :Spring MVC 支持多种配置方式,包括 XML 配置和注解配置,可以根据项目的需求灵活选择。
  • 强大的功能 :Spring MVC 提供了丰富的功能,如请求参数绑定、数据验证、国际化、文件上传下载等,满足 Web 开发的各种需求。
  • 良好的集成性 :Spring MVC 是 Spring 框架的一部分,可以方便地与其他 Spring 模块(如 Spring JDBC、Spring ORM 等)进行集成,构建完整的企业级应用。
  • 非侵入式设计 :Spring MVC 的设计是非侵入式的,它不会强迫开发者遵循特定的编码风格或框架结构,开发者可以自由地选择使用框架的哪些功能,而不影响已有的代码。

七、总结

Spring MVC 是 Spring 框架的一个重要模块,为 Web 应用开发提供了一套完整的解决方案。通过掌握 Spring MVC 的架构、工作流程、配置方式和主要组件,开发者可以更好地构建高质量的 Web 应用。Spring MVC 的清晰架构、灵活配置、强大功能和良好的集成性,使其成为开发 Java Web 应用的首选框架之一。在实际开发中,合理利用 Spring MVC 的各种功能和特性,可以提高开发效率,降低开发成本,构建出更加稳定、可靠的 Web 应用。

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

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

相关文章

【TF-BERT】基于张量的融合BERT多模态情感分析

不足&#xff1a;1. 传统跨模态transformer只能处理2种模态&#xff0c;所以现有方法需要分阶段融合3模态&#xff0c;引发信息丢失。2. 直接拼接多模态特征到BERT中&#xff0c;缺乏动态互补机制&#xff0c;无法有效整合非文本模态信息 改进方法&#xff1a;1. 基于张量的跨模…

maven坐标导入jar包时剔除不需要的内容

maven坐标导入jar包时剔除不需要的内容 问题描述解决方案 问题描述 maven坐标导入jar包时剔除不需要的内容 解决方案 Spring Boot 默认使用 Logback&#xff0c;需在 pom.xml 中排除其依赖&#xff1a; <dependency><groupId>org.springframework.boot</gro…

C与指针——输入输出

错误定位 当一个库函数出错时&#xff0c;errno会被重置 perror(const char* s);\\输出s: errno 对应的错误信息 \\如果单独想要错误信息可以 char* e strerror(errno);\\系统错误码转换为对应的错误信息字符串输出缓冲区 一般输出缓冲区满的时候才刷新&#xff0c;也就是…

JSON Web Token 默认密钥 身份验证安全性分析 dubbo-admin JWT硬编码身份验证绕过

引言 在web开发中&#xff0c;对于用户认证的问题&#xff0c;有很多的解决方案。其中传统的认证方式&#xff1a;基于session的用户身份验证便是可采用的一种。 基于session的用户身份验证验证过程&#xff1a; 用户在用进行验证之后&#xff0c;服务器保存用户信息返回sess…

STM32GPIO输出实战-LED模板

STM32GPIO输出实战-LED模板 一&#xff0c;LED控制原理1&#xff0c;LED控制时GPIO的配置2&#xff0c;LED连接方式3&#xff0c;使用HAL库控制LED的常用函数&#xff1a; 二&#xff0c;任意控制LED模板1&#xff0c;Led底层2&#xff0c;代码详细解析 三&#xff0c;实用技巧…

第二十七届华东杯数学建模A 题 跳台滑雪问题 完整思路模型及代码

题目背景 跳台滑雪起源于 19 世纪&#xff0c;是冬季运动会的传统竞技项目。今年亚洲冬季运动会在我国 哈尔滨举行&#xff0c;跳台滑雪项目吸引了包括中国在内的亚洲各国运动健儿踊跃参加&#xff0c;我国运动员取得了优异的成绩。 跳台滑雪融合了速度、力量与精确控制&…

Python之学习笔记(六)

文章目录 1. 字典&#xff08;Dictionary&#xff09;2. 集合&#xff08;Set&#xff09;3. 字典 vs 集合4. 应用场景5. 注意事项 Python中的字典&#xff08; dict&#xff09;和集合&#xff08; set&#xff09;是两种高效且常用的数据结构&#xff0c;适用于不同的场景。…

缓存与数据库的高效读写流程解析

目录 前言1 读取数据的流程1.1 检查缓存是否命中1.2 从数据库读取数据1.3 更新缓存1.4 返回数据 2 写入数据的流程2.1 更新数据库2.2 更新或删除缓存2.3 缓存失效 3 缓存与数据库的一致性问题3.1 写穿&#xff08;Write-through&#xff09;策略3.2 写回&#xff08;Write-back…

PowerShell 备份 Windows10/11 还原计算机驱动程序SOP

一、现在计算机C目录下创建一个新的文件夹名称为 driverbackup 二、打开cmd 以管理员身份执行 dism /online /export-driver /destination: C:\driverbackup 在正常情况下&#xff0c;Windows 10会自动检测您的设备所需的驱动程序&#xff0c;并将其安装到您的PC上。 但是&am…

自监督学习(Self-supervised Learning)李宏毅

目录 Self-supervised Learning简介&#xff1a; BERT : How to use BERT case1&#xff1a;sequence to class 语言积极性OR消极性判断 case2&#xff1a;sequence to sequence句子中的词语词性标注 case3&#xff1a;sequence2 to class两个句子是不是一个为前提一个为…

Python基于Django的全国二手房可视化分析系统【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

解决 3D Gaussian Splatting 中 SIBR 可视化组件报错 uv_mesh.vert 缺失问题【2025最新版!】

一、&#x1f4cc; 引言 在使用 3D Gaussian Splatting&#xff08;3DGS&#xff09;进行三维重建和可视化的过程&#xff0c;SIBR_gaussianViewer_app 是一款官方推荐的本地可视化工具&#xff0c;允许我们在 GPU 上实时浏览重建结果。然而&#xff0c;许多用户在启动该工具时…

shell_plus

python manage.py shell_plus 是由 django-extensions 提供的一个增强版的 Django shell&#xff0c;它自动导入你的所有模型和其他一些便捷功能&#xff0c;使得交互式开发更加方便。 如果你遇到配置或运行问题&#xff0c;特别是与 RQ_SHOW_ADMIN_LINK 相关的 ImproperlyCon…

文章记单词 | 第62篇(六级)

一&#xff0c;单词释义 noon [nuːn] n. 中午&#xff0c;正午clothes [kləʊz] n. 衣服&#xff0c;衣物reward [rɪˈwɔːd] n. 报酬&#xff0c;奖赏&#xff1b;vt. 奖励&#xff0c;奖赏newly [ˈnjuːli] adv. 最近&#xff0c;新近&#xff1b;以新的方式premier [ˈ…

Linux watch 命令使用详解

简介 watch 命令会以固定间隔&#xff08;默认每 2 秒&#xff09;重复运行给定命令&#xff0c;并在终端上显示其输出。它非常适合监控不断变化的输出&#xff0c;例如磁盘使用情况、内存使用情况、文件更改、服务状态等。 基础语法 watch [options] command常用选项 -n, -…

C++类_成员函数指针

在 C11 里&#xff0c;成员函数指针是一种特殊的指针&#xff0c;它指向类的成员函数。下面详细介绍成员函数指针的定义、使用及注意事项。 定义 成员函数指针的定义格式如下&#xff1a; 返回类型 (类名::*指针名)(参数列表);例如&#xff1a; class MyClass { public:voi…

qmt下载的数据放在了哪里了?

#qmt获取日线数据 from xtquant import xtdata # 设置股票代码列表和时间范围 stock_list xtdata.get_stock_list_in_sector(沪深A股) # print("获取到的股票列表&#xff1a;", stock_list,len(stock_list)) start_time 20240501 end_time 20250501# 下载多只股票…

深入浅出数据库管理系统

数据库管理系统&#xff1a;数字世界的“隐形管家” ——从数据杂乱到井井有条的秘密武器 一、数据库管理系统&#xff1a;数字世界的“隐形管家” 你有没有想过&#xff0c;为什么我们在电商平台购物时&#xff0c;商品库存能实时更新&#xff1f;为什么银行转账时&#xff…

关于Docker拉取镜像超时/无法访问镜像仓库解决方案

文章目录 关于Docker拉取镜像超时/无法访问镜像仓库解决方案卸载原先安装的Docker及相关配置使用代理后无法拉取镜像解决方案验证代理连通性安装 Docker 最新版配置 Docker Daemon HTTP 代理重启验证与拉取镜像 不使用代理解决方案安装 Docker 最新版配置阿里云容器镜像加速 关…

Docker Compose:服务编排:批量管理多个容器

通过docker compose进行容器批量管理&#xff1a;一次性启动四个容器&#xff08;nginx&#xff0c;tomcat&#xff0c;redis&#xff0c;mysql&#xff09; &#xff08;1&#xff09; 创建docker-compose目录 mkdir ~/docker-compose cd ~/docker-compose &#xff08;2&…