十四:java web(6)-- Spring Spring MVC

目录

Spring MVC

1.1 Spring MVC 概述

1.1.1 什么是 MVC 模式

1.1.2 Spring MVC 工作原理

1.2 Spring MVC 核心组件

1.2.1 DispatcherServlet

1.2.2 控制器(Controller)

1.2.3 请求映射(@RequestMapping)

1.2.4 视图解析器(View Resolver)

在 Spring MVC 中,视图层的处理已经不再是重点,因为现在大多数项目采用了前后端分离的架构。即使使用 JSP,也往往通过 Ajax 请求进行数据交互,视图层的渲染和控制并不需要过多关注,重点是如何通过注解(如 @Controller, @RequestMapping, @ResponseBody 等)来处理请求和响应。例如,使用 Ajax 请求时,前端发送一个 JSON 数据,后端通过 @ResponseBody 注解将数据返回给前端,而视图部分则通过 JavaScript 动态更新,不再依赖传统的 JSP 渲染。

1.3 RESTful API 开发

1.3.1 构建 RESTful 控制器

1.3.2 返回 JSON 数据(@RestController)

1.3.3 RESTful API 的常见返回格式

  1.4 常用注解: 


Spring MVC

  • 1.1 Spring MVC 概述

    • Spring MVC(Model-View-Controller)是 Spring 框架的一部分,提供了基于请求的 Web 应用程序开发框架。它通过分层架构帮助开发者将应用程序的关注点分离,使得应用更易于管理、扩展和测试。
      • 1.1.1 什么是 MVC 模式

        • MVC 模式是一种软件架构设计模式,它将应用程序的业务逻辑、用户界面和输入控制分离开来。MVC 模式的主要目的是为了提高代码的可维护性、可扩展性和可测试性。具体来说,MVC 模式由以下三个部分组成:

          • Model(模型):表示应用程序的数据和业务逻辑。模型层通常负责数据的持久化操作(例如与数据库的交互)和业务逻辑的处理。

          • View(视图):负责展示模型数据,并且通常会响应用户输入。视图层主要包括界面显示部分,如 HTML 页面、JSP 页面、Thymeleaf 模板等。

          • Controller(控制器):处理用户请求,调用业务逻辑并返回相应的视图。控制器作为调度器,协调模型和视图之间的交互。用户输入通过控制器转发到相应的服务层或模型层,并选择合适的视图呈现给用户。

        • MVC 的优势:

          • 分离关注点,简化了代码的维护。

          • 增强了代码的重用性,视图可以改变而不影响模型和控制器。

          • 业务逻辑与界面解耦,提高了应用程序的灵活性。

      • 1.1.2 Spring MVC 工作原理

        • 请求到达 DispatcherServlet:客户端的请求首先会被 DispatcherServlet 接收。DispatcherServlet 是一个前端控制器,它负责将请求转发到对应的处理逻辑。

        • 请求映射(HandlerMapping):DispatcherServlet 根据请求的 URL 调用 HandlerMapping 获取请求与相应的处理器(Controller)之间的映射关系。这个映射信息通常是由注解或 XML 配置来指定的。

        • 调用 Controller 方法:一旦找到匹配的控制器(Controller)及其方法,DispatcherServlet 会调用该控制器的方法来处理请求。Controller 通常会调用服务层(Service)来执行业务逻辑,可能会返回一个模型数据。

        • 返回模型数据:控制器方法返回的数据(通常是一个模型对象或一个视图名称)被传递给 ViewResolver(视图解析器)进行处理。

        • 视图渲染:ViewResolver 会根据返回的视图名称找到对应的视图(如 JSP、HTML、Thymeleaf 等),并将模型数据渲染到视图中,生成最终的 HTML 内容。

        • 响应返回给客户端:最后,渲染后的视图会返回给客户端,完成一次完整的请求-响应周期。

  • 1.2 Spring MVC 核心组件

    • 1.2.1 DispatcherServlet

      • DispatcherServlet 是 Spring MVC 的前端控制器(Front Controller),它是整个 Web 应用的核心组件之一。所有的请求都首先通过 DispatcherServlet,然后由它来分发和处理请求。具体来说,DispatcherServlet 主要负责以下几个方面:

        • 请求接收:当用户发起一个 HTTP 请求时,该请求会首先到达 DispatcherServlet

        • 请求转发DispatcherServlet 根据请求的 URL,使用 HandlerMapping 查找并调用合适的 Controller 来处理请求。

        • DispatcherServlet 是由 Web 容器(如 Tomcat)启动的,它在应用的 web.xml 或 Spring Boot 的配置文件中配置。

        • 返回视图:处理完请求后,DispatcherServlet 会使用 ViewResolver 解析视图并将结果返回给用户。

    • 1.2.2 控制器(Controller)

      • 控制器是 Spring MVC 中负责处理用户请求的组件。它的主要功能是接收来自 DispatcherServlet 转发的请求,执行具体的业务逻辑,并返回数据或视图。

        在 Spring MVC 中,控制器通常是用 @Controller@RestController 注解标记的类,@RequestMapping 注解用于将 HTTP 请求映射到具体的控制器方法。

      • @Controller 注解的类是一个普通的控制器,返回视图模型。

      • @RestController 是一个特殊的控制器,它默认将返回的对象转换为 JSON 或 XML 格式,通常用于构建 RESTful 风格的 Web 服务。

      • @Controller
        public class UserController {@RequestMapping("/user")public String getUser(Model model) {User user = userService.getUser();model.addAttribute("user", user);return "userView";  // 返回视图的名称}
        }
        
    • 1.2.3 请求映射(@RequestMapping)

      • @RequestMapping 是用于映射 HTTP 请求到控制器方法的注解。通过这个注解,开发者可以将不同的 URL 映射到不同的控制器方法上,并且可以指定请求类型(如 GET、POST 等)以及其他参数(如请求头、请求参数等)。

        @RequestMapping 可以用于类级别和方法级别。类级别的 @RequestMapping 用于指定该类中的所有请求路径的公共部分,方法级别的 @RequestMapping 用于指定具体的 URL 路径和请求方式。

        @RequestMapping 示例

      • @Controller
        @RequestMapping("/user")  // 类级别的请求映射
        public class UserController {@RequestMapping("/info")  // 方法级别的请求映射public String getUserInfo() {return "userInfo";  // 返回视图}@RequestMapping("/details")  // 方法级别的请求映射public String getUserDetails() {return "userDetails";  // 返回视图}
        }
        

        常见的 @RequestMapping 变体

        • @GetMapping:用于处理 HTTP GET 请求。

        • @PostMapping:用于处理 HTTP POST 请求。

        • @PutMapping:用于处理 HTTP PUT 请求。

        • @DeleteMapping:用于处理 HTTP DELETE 请求。

        • @RestController
          @RequestMapping("/api/users")
          public class UserRestController {@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getUserById(id);  // 返回 JSON 格式的用户信息}
          }
    • 1.2.4 视图解析器(View Resolver)

      • 视图解析器(ViewResolver)是 Spring MVC 中的一个重要组件,它负责将控制器返回的视图名称解析为实际的视图对象(如 JSP 页面、HTML 页面、PDF 文件等),并将模型数据填充到视图中,最终渲染并返回给客户端。

        Spring MVC 提供了多种类型的视图解析器,最常见的是 InternalResourceViewResolver,它用于解析 JSP 视图。视图解析器的配置可以指定前缀和后缀,帮助确定视图文件的位置。

        ViewResolver 配置示例

      • <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" />
        </bean>
        
  • 在 Spring MVC 中,视图层的处理已经不再是重点,因为现在大多数项目采用了前后端分离的架构。即使使用 JSP,也往往通过 Ajax 请求进行数据交互,视图层的渲染和控制并不需要过多关注,重点是如何通过注解(如 @Controller, @RequestMapping, @ResponseBody 等)来处理请求和响应。例如,使用 Ajax 请求时,前端发送一个 JSON 数据,后端通过 @ResponseBody 注解将数据返回给前端,而视图部分则通过 JavaScript 动态更新,不再依赖传统的 JSP 渲染。

  • 1.3 RESTful API 开发

    •         RESTful API 是一种基于 REST (Representational State Transfer) 架构风格的 API 设计风格,它通过 HTTP 协议的标准方法(GET、POST、PUT、DELETE)进行操作。Spring MVC 提供了强大的支持来开发 RESTful API,通常通过 @RestController 注解来简化 API 开发。
    • 1.3.1 构建 RESTful 控制器

      • RESTful 控制器的设计遵循 HTTP 协议的约定,使用标准的 HTTP 方法来处理不同的操作。

        常见的 RESTful API 操作:

        • GET:获取资源(数据)。

        • POST:创建资源。

        • PUT:更新资源。

        • DELETE:删除资源。

      • @RestController
        @RequestMapping("/api/users")
        public class UserRestController {@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {User user = userService.getUserById(id);if (user != null) {return ResponseEntity.ok(user);} else {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}}@PostMappingpublic ResponseEntity<User> createUser(@RequestBody @Valid User user) {User savedUser = userService.save(user);return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);}@PutMapping("/{id}")public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {User existingUser = userService.getUserById(id);if (existingUser != null) {user.setId(id);User updatedUser = userService.save(user);return ResponseEntity.ok(updatedUser);} else {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {if (userService.exists(id)) {userService.delete(id);return ResponseEntity.noContent().build();} else {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}}
        }
        
      • @RestController:该注解标记的类用于处理 RESTful 请求,默认返回 JSON 格式的数据。

      • @GetMapping@PostMapping@PutMapping@DeleteMapping:分别用于处理 GET、POST、PUT 和 DELETE 请求。

      • @PathVariable:用于从 URL 中提取路径变量。

      • @RequestBody:用于从请求体中提取数据并绑定到 Java 对象。

    • 1.3.2 返回 JSON 数据(@RestController)

      • @RestController@Controller@ResponseBody 的组合注解,用于将方法返回的对象自动转化为 JSON 格式并返回。

      • @RestController
        @RequestMapping("/api/products")
        public class ProductRestController {@GetMapping("/{id}")public Product getProduct(@PathVariable Long id) {// 假设通过 id 获取产品信息return productService.getProductById(id);}@PostMappingpublic Product createProduct(@RequestBody Product product) {return productService.saveProduct(product);}
        }
        

        • @GetMapping("/{id}"):通过 GET 请求获取资源。

        • @PostMapping:通过 POST 请求创建新资源。

        • @RequestBody:将请求体中的 JSON 数据自动绑定到 Product 对象。

        • 返回的 Product 对象会被自动转化为 JSON 格式并返回给客户端。

    • 1.3.3 RESTful API 的常见返回格式

      • {"id": 1,"name": "Product A","price": 100.0
        }
        

        通常 RESTful API 会返回一个标准化的响应格式,以便客户端处理。例如,可以包装响应数据和状态码:

      • public class ApiResponse<T> {private String status;private T data;private String message;// Getter 和 Setter
        }
        

           

  •   1.4 常用注解: 

    • 常用控制器注解 
      • @Controller:用于标记一个类为 Spring MVC 的控制器类,表示该类将处理 Web 请求。
      • @RestController:@Controller@ResponseBody 的组合注解,表示该类的所有方法都会返回 JSON 或其他格式的数据,而不是视图。
      • @RequestMapping:用于定义请求的映射,支持多种 HTTP 方法(GET、POST、PUT、DELETE 等)。可以用于类或方法级别,类级别的 @RequestMapping 会作为方法级别的基础路径。
      • @GetMapping:用于处理 HTTP GET 请求。是 @RequestMapping 的快捷方式,专门用于 GET 请求。
      • @PostMapping:用于处理 HTTP POST 请求。是 @RequestMapping 的快捷方式,专门用于 POST 请求。
      • @PutMapping:用于处理 HTTP PUT 请求。是 @RequestMapping 的快捷方式,专门用于 PUT 请求。
      • @DeleteMapping:用于处理 HTTP DELETE 请求。是 @RequestMapping 的快捷方式,专门用于 DELETE 请求。
      • @PatchMapping:用于处理 HTTP PATCH 请求。是 @RequestMapping 的快捷方式,专门用于 PATCH 请求。
    • 请求参数相关注解 
      • @RequestParam:用于从请求的查询参数、表单参数或 URL 中提取参数。
      • @PathVariable:用于从 URL 路径中提取变量,常用于 RESTful 风格的 API 中。
      • @RequestBody:用于将 HTTP 请求的内容(通常是 JSON 数据)绑定到方法的参数上。常用于 POST、PUT 和 PATCH 请求中。
      • @RequestHeader:用于获取 HTTP 请求头中的参数。
      • @CookieValue:用于获取请求中的 Cookie 值。
    • 响应相关注解  
      • @ResponseBody:用于将控制器方法的返回值直接写入 HTTP 响应体,通常用于返回 JSON、XML 或其他格式的数据。
      • @ResponseStatus:用于指定方法执行完成后返回的 HTTP 状态码,可以直接将状态码应用于方法。
      • @ExceptionHandler:用于在控制器中处理异常。当方法抛出异常时,Spring MVC 会调用带有该注解的方法来处理异常。

                

 

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

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

相关文章

linux tigerVNC使用

简介 TigerVNC是VNC的一种高性能、平台中立实现&#xff08;虚拟网络计算&#xff09;&#xff0c;一种客户端/服务器应用程序&#xff0c;允许用户启动远程图形应用程序并与之交互机器。TigerVNC提供运行所需的性能级别3D和视频应用程序&#xff0c;并尝试保持普通外观并尽可…

基于redis实现API接口访问次数限制

一&#xff0c;概述 日常开发中会有一个常见的需求&#xff0c;需要限制接口在单位时间内的访问次数&#xff0c;比如说某个免费的接口限制单个IP一分钟内只能访问5次。该怎么实现呢&#xff0c;通常大家都会想到用redis&#xff0c;确实通过redis可以实现这个功能&#xff0c…

uni-app小程序开发(1)

下载软件就不多赘述了。 直接上代码&#xff0c;写过wep端的vue看这个小程序就简单很多&#xff0c;不需要搞那么多麻烦事情&#xff0c;直接编译器就创建好了基础模版。 1、项目结构 暂时知道这么多&#xff0c;后续再补充 2、页面创建、导航栏设置、基础属性设置 在pages中…

【C++】哈希表封装 unordered_map 和 unordered_set 的实现过程

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…

SQL,力扣题目1709,访问日期之间最大的空档期

一、力扣链接 LeetCode_1709 二、题目描述 表&#xff1a; UserVisits ------------------- | Column Name | Type | ------------------- | user_id | int | | visit_date | date | ------------------- 该表没有主键&#xff0c;它可能有重复的行 该表包含用户访问…

第七篇: BigQuery中的复杂SQL查询

BigQuery中的复杂SQL查询 背景与目标 在数据分析中&#xff0c;我们通常需要从多个数据源中获取信息&#xff0c;以便进行深入的分析。这时&#xff0c;BigQuery提供的JOIN、UNION和子查询等复杂SQL语句非常实用。本文将以Google BigQuery的公共数据集为例&#xff0c;介绍如何…

SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记

这是一篇港科大学生在google research 实习期间发在ECCV2024的语义引导生成式修复的文章&#xff0c;港科大陈启峰也挂了名字。从首页图看效果确实很惊艳&#xff0c;尤其是第三行能用文本调控修复结果牌上的字。不过看起来更倾向于生成&#xff0c;对原图内容并不是很复原&…

Dubbo负载均衡

负载均衡策略与配置细节 Dubbo 内置了 client-based 负载均衡机制&#xff0c;如下是当前支持的负载均衡算法&#xff0c;结合上文提到的自动服务发现机制&#xff0c;消费端会自动使用 Weighted Random LoadBalance 加权随机负载均衡策略 选址调用。 如果要调整负载均衡算法…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十二:在屏幕上显示多路视频播放,可以有不同的分辨率,格式和帧率。

上图是在安防领域的要求&#xff0c;一般都是一个屏幕上有显示多个摄像头捕捉到的画面&#xff0c;这一节&#xff0c;我们是从文件中读取多个文件&#xff0c;显示在屏幕上。 一 改动UI文件 这里我们要添加两个label&#xff0c;为了区分我们设置一下背景色&#xff08;这个是…

前言2、VS(Visual Studio)-2022使用

早前用VS-2010编译平台&#xff0c;进行C语言编程学习。 现如今&#xff0c;为了适应未来发展趋势以及日新月异的新功能&#xff0c;就此转到VS-2022编译平台&#xff1b; 由于都是VS编译平台&#xff0c;大多数基础功能都类似&#xff0c;关于一些基础操作可参考前言1&#…

深入了解逻辑回归:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

[High Speed Serial ] Xilinx

Xilinx 高速串行数据接口 收发器产品涵盖了当今高速协议的方方面面。GTH 和 GTY 收发器提供要求苛刻的光互连所需的低抖动&#xff0c;并具有世界一流的自适应均衡功能&#xff0c;具有困难的背板操作所需的 PCS 功能。 Versal™ GTY &#xff08;32.75Gb/s&#xff09;&…

基于CNN-RNN的影像报告生成

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【PaddleNLP的FAQ问答机器人】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

java list使用基本操作

import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class Main {public static void main(String[] args) {ArrayList list new ArrayList();list.add("张三");list.add("李四");list.add("王五");l…

高级 <HarmonyOS主题课>借助AR引擎帮助应用实现虚拟与现实交互的能力的课后习题

持而盈之&#xff0c;不如其已&#xff1b; 揣而锐之&#xff0c;不可长保。 金玉满堂&#xff0c;莫之能守&#xff1b; 富贵而骄&#xff0c;自遗其咎。 功成身退&#xff0c;天之道也。 VR (Virtual Reality): 虚拟现实技术 AR (Augmented Reality): 增强现实) XR.(Extend…

高校实验室安全巡检系统设计与实现(源码+定制+开发)高校实验室巡检系统、实验室安全管理平台、实验室安全监控系统、智能实验室巡查系统、高校实验室风险管理

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

102、Python并发编程:Queue与生产者消费者模型实现解耦、协作

引言 在实际业务场景中&#xff0c;很多时候在处理复杂任务的时候&#xff0c;会拆分上下游各个环节&#xff0c;形成一个类似于流水线的处理方式。上游类似于生产者&#xff0c;下游要依赖上游的输出进行工作&#xff0c;类似于消费者。但是&#xff0c;很多时候&#xff0c;…

【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...

全文链接&#xff1a;https://tecdat.cn/?p38115 分析师:Yang Yang&#xff0c;Kechen Zhao 在当今科技日新月异的时代&#xff0c;数据的有效利用成为各领域突破发展的关键。于医疗领域&#xff0c;乳腺癌的高发性与严重性不容忽视&#xff0c;优化抗乳腺癌候选药物的筛选与特…

机器学习与AI|如何利用数据科学优化库存周转率?

对于所有零售商来说&#xff0c;良好的库存管理都是非常重要的。众所周知&#xff0c;商品如果不放在货架上就无法出售&#xff0c;而如果库存过多则意味着严重的财务负担。 但是做好库存管理绝非易事&#xff0c;它依赖于对未来需求的准确预测和确保始终有合适库存的敏捷供应链…

安卓智能对讲终端|北斗有源终端|三防对讲机|单兵终端|单北斗

在当今快速发展的通信技术时代&#xff0c;智能对讲手持机已成为众多行业领域中不可或缺的通讯工具。QM240T安卓智能对讲手持机&#xff0c;作为一款集先进技术与实用功能于一身的高端设备&#xff0c;凭借其卓越的性能和多样化的应用特性&#xff0c;正逐步引领对讲机市场的革…