【Spring】Spring MVC 入门(2)

news/2024/9/19 8:51:13/ 标签: spring, mvc, java

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。

博客涉及框架的重要知识点,根据序号学习即可。

目录

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。

博客涉及框架的重要知识点,根据序号学习即可。

1、什么是MVC

1.1定义

1.2模型

1.3详解

2、什么是Spring Web MVC

2.1官方定义

2.2三大功能

2.3 模型

2.4建立连接

2.5@RequestMapping 注解

3、请求

3.1传递单个参数

3.2传递多个参数

3.3传递数组

3.4传递集合

3.5传递JSON

3.6在URL中获取参数

3.7文件上传

​编辑

4、响应

4.1返回静态页面

4.2返回数据@Responsebody

4.3返回HTML代码片段

4.4返回JSON

4.5设置状态码

4.6设置header

4.6.1设置Content-Type

4.6.2设置其他header

5、应用分层

5.1什么是应用分层

5.2如何分层-----三层架构

5.3MVC与三层架构的区别


1、什么是MVC

1.1定义

        MVC 是 Model View Controller 的缩写,它是软件工程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分。

1.2模型

1.3详解

  • View(视图) 指在应⽤程序中专门用来与浏览器进行交互,展示数据的资源. 
  • Model(模型) 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分
  • Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型



2、什么是Spring Web MVC

2.1官方定义

(1)Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC"
(2)MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外, Spring MVC还是⼀个Web框架。 总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架。
(3)Spring MVC 全称是 Spring Web MVC 。其实, Spring MVC 我们在前⾯已经⽤过了, 在创建 Spring Boot 项目时,我们勾选的 Spring Web 框架 其实就是 Spring MVC 框架。这时候可能大家就懵了, 前⾯创建的不是SpringBoot项⽬吗? 怎么又变成了Spring MVC项⽬? 他们之间到底有着什么样的关系? ---------Spring Boot 只是实现Spring MVC的其中⼀种⽅式。Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能。Spring Boot 通过添加Spring Web MVC框架, 来实现web功能。

2.2三大功能

咱们学习Spring MVC, 重点也就是学习如何通过浏览器和程序进行交互。主要分以下三个方⾯:
1. 建⽴连接:将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的
Spring 程序。
2. 请求: 用户请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是获取参数的功能。
3. 响应: 执行了业务逻辑之后,要把程序执行的结果返回给用户, 也就是响应.
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC

2.3 模型

2.4建立连接

2.5@RequestMapping 注解

@RequestMapping 是 Spring Web MVC 应用程序中最常被用到的注解之⼀,它是⽤来注册接⼝的
路由映射的。表示服务收到请求时, 路径为/hello的请求就会调⽤ hello() 这个⽅法的代码.
路由映射: 当用户访问⼀个 URL 时, 将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射。 既然 @RequestMapping 已经可以达到我们的目的了, 我们为什么还要加 @RestController
呢? 我们把 @RestController 去掉, 再来访问⼀次:
可以看到, 程序报了404, 找不到该页面。这就是 @RestController 起到的作用。
⼀个项⽬中, 会有很多类, 每个类可能有很多的⽅法, Spring程序怎么知道要执⾏哪个⽅法呢?
Spring会对所有的类进⾏扫描, 如果类加了注解@RestController, Spring才会去看这个类⾥⾯的⽅法 有没有加 @RequestMapping 这个注解, 当然他的作⽤不⽌这⼀点,后续详说。
  • @RequestMapping 即可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + 方法路径
  • @RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
  • @RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息



3、请求

3.1传递单个参数

(1)后端代码:

@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m1")public String m1(String name){//传递单个参数return "传递的单个参数为:"+name;}
}

运行结果:

(2)后端代码:

    @RequestMapping("/m2")public String m2(int age){//传递单个参数  接收参数为基本数据类型时,必须传参,否则会报500,所以最好用包装类接收return "传递的单个参数为:"+age;}

运行结果:

3.2传递多个参数

(1)后端代码:

    @RequestMapping("/m3")public String m3(String name,String password){//传递多个参数 return "name:"+name+",password:"+password;}

 运行结果:

(2)后端代码:

@RequestMapping("/param")
@RestController
public class ParamController {  @RequestMapping("/m4")public String m4(Person person){//传递多个参数return person.toString();}
}public class Person {private int id;private String name;private String password;@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

 运行结果:

(3)后端代码:

    @RequestMapping("/m5")public String m5(@RequestParam(value = "username",required = false) String name){//重命名,前后端定义的字段名不一样    前端:username   后端:name//并且@RequseParam注解是必传,没有传参会报错  除非required设置为falsereturn " 接收到的name:"+name;}

运行结果:

3.3传递数组

后端代码:

    @RequestMapping("/m6")public String m6(String[] arr){//传递数组return Arrays.toString(arr);}

运行结果:

3.4传递集合

后端代码:

    @RequestMapping("/m7")public String m7(@RequestParam List<Integer> list){//传递集合和传递数组类似,同一个请求参数名有多个时,默认情况下是封装为数// 组的,但是如果要封装到集合,要使用注解//@RequestParam 绑定参数关系return "size:"+list.size()+",list:"+list;}

 运行结果:

3.5传递JSON

后端代码:

    @RequestMapping("/m8")public String m8(@RequestBody Person person){//传递JSON,需要使用@RequestBody注解//requestbody:请求正文,意思这个注解作用//在请求正文的数据绑定,请求参数必须写在请求正文中return person.toString();}

 运行结果:【用postman进行接口测试】

3.6在URL中获取参数

后端代码:

    @RequestMapping("/m9/{id}/{name}")public String m9(@PathVariable Integer id,@PathVariable String name){//获取URL中的参数//@PathVariable,这个注解主要作用在请求url路径上的数据绑定return "id:"+id+",name:"+name;}

 运行结果:

3.7文件上传

后端代码:

    @RequestMapping("/m10")public String m10(@RequestPart MultipartFile file) throws IOException {//上传文件使用注解@RequestPart//获取文件名称String fileName=file.getOriginalFilename();//文件上传到指定路径file.transferTo(new File("D:/108code/"+file.getOriginalFilename()));return "接收到的文件名"+fileName;}

 运行结果:




4、响应

4.1返回静态页面

静态页面index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body>hello,index
</form>
</body>
</html>

后端代码: 

@RestController
@RequestMapping("/index")
public class IndexController {@RequestMapping("/m1")public Object m1(){//返回静态页面return "/index.html";}
}

结果: 

结果却发现, ⻚⾯未正确返回, http响应把 "/index.html" 当做了http响应正⽂的数据
那Spring MVC如何才能识别出来 index.html 是⼀个静态⻚⾯, 并进⾏返回呢?
我们需要把 @RestController 改为 @Controller
正确代码如下:
@Controller
@RequestMapping("/index")
public class IndexController {@RequestMapping("/m1")public Object m1(){//返回静态页面return "/index.html";}
}
注解:@RestController与@Controller的区别:
MVC的概念也逐渐发⽣了变化, View不再返回视图, ⽽是返回显⽰视图时需要的数据.
所以前⾯使⽤的 @RestController 其实是返回的数据.
@RestController = @Controller + @ResponseBody
@Controller : 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
@ResponseBody : 定义返回的数据格式为⾮视图, 返回⼀个 text/html 信息

4.2返回数据@Responsebody

    @RequestMapping("/m2")public Object m2(){//返回数据@ResponseBodyreturn "/index.html";}

4.3返回HTML代码片段

    @RequestMapping("/m3")public String m3(){//返回HTML代码片段return "<h1>hello,html</h1>";}

4.4返回JSON

    @RequestMapping("/m4")public HashMap<String,String> m4(){//返回JSONHashMap<String,String> map=new HashMap<>();map.put("java","java value");map.put("mysql","mysql value");return map;}

4.5设置状态码

    @RequestMapping("/m5")public String m5(HttpServletResponse response){//设置状态码response.setStatus(401);return "设置状态码成功";}

【Fiddle抓包查看状态码是否设置成功】

4.6设置header

4.6.1设置Content-Type
    @RequestMapping(value = "/m6",produces = "application/json")public String m6(){//设置content-typereturn "{\"success\":true}";}

4.6.2设置其他header
    @RequestMapping(value = "/m7")public String m7(HttpServletResponse response){//设置其他headerresponse.setHeader("MyHeader","MyHeaderValue");return "设置header成功";}



5、应用分层

5.1什么是应用分层

(1)什么是应⽤分层
        应⽤分层 是⼀种软件开发设计思想, 它将应⽤程序分成N个层次, 这N个层次分别负责各⾃的职责, 多个层次之间协同提供完整的功能. 根据项⽬的复杂度, 把项⽬分成三层, 四层或者更多层.
常⻅的MVC设计模式, 就是应⽤分层的⼀种具体体现
(2)为什么需要应⽤分层?
        在最开始的时候,为了让项⽬快速上线,我们通常是不考虑分层的. 但是随着业务越来越复杂,⼤量的 代码混在⼀起,会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动⼀处就牵⼀发⽽动全⾝等 问题. 所以学习对项⽬进⾏分层就是我们程序员的必修课了

5.2如何分层-----三层架构

(1)之前学习的 "MVC", 就是把整体的系统分成了 Model(模型), View(视图)和Controlle(控制器)三个层次,也就是将用户视图和业务处理隔离开,并且通过控制器连接起来,很好地实现 了表现和逻辑的解耦,是⼀种标准的软件分层架构。

(2)目前现在更主流的开发方式是 "前后端分离" 的⽅式, 后端开发⼯程师不再需要关注前端的实现, 所以对 于Java后端开发者, 又有了⼀种新的分层架构: 把整体架构分为表现层、业务逻辑层和数据层。这种分层方式也称之为"三层架构".
  • 表现层: 就是展⽰数据结果和接受⽤⼾指令的,是最靠近⽤⼾的⼀层
  • 业务逻辑层: 负责处理业务逻辑, ⾥⾯有复杂业务的具体实现
  • 数据访问层: 负责存储和管理与应⽤程序相关的数据
(3)按照上面的层次划分, Spring MVC 站在后端开发⼈员的⻆度上, 也进行了支持, 把上面的代码划分为三 个部分:
  • Controller:控制层。接收前端发送的请求,对请求进⾏处理,并响应数据。
  • Service:业务逻辑层。处理具体的业务逻辑。
  • Dao:数据访问层,也称为持久层。负责数据访问操作,包括数据的增、删、改、查

5.3MVC与三层架构的区别

(1)关于二者的关系, ⼀直存在不同的观点。有人认为三层架构是MVC模式的⼀种实现, 也有⼈认为MVC是三层架构的替代方案, 等等各种说法都有。根本原因是⼤家站在不同的角度来看待这个问题的
(2)从概念上来讲, 二者都是软件⼯程领域中的架构模式
  • MVC架构模式由三部分组成, 分别是: 模型(Model), 视图(View)和控制器(Controller);三层架构将业务应⽤划分为:表现层, 业务逻辑层, 数据访问层
  • MVC中, 视图和控制器合起来对应三层架构中的表现层. 模型对应三层架构中的业务逻辑层, 数据层, 以及实体类,二者其实是从不同⻆度对软件工程进行了抽象
  • MVC模式强调数据和视图分离, 将数据展示和数据处理分开, 通过控制器对两者进行组合;三层架构强调不同维度数据处理的高内聚和低耦合, 将交互界⾯, 业务处理和数据库操作的逻辑分开。角度不同也就谈不上互相替代了。

http://www.ppmy.cn/news/1521500.html

相关文章

论文解读 | KDD2024 演化图上的森林矩阵快速计算

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者直播讲解回放&#xff01; 作者简介 孙浩鑫&#xff0c;复旦大学博士生&#xff0c;主要研究方向为大规模图上快速算法设计。 概述 森林矩阵在网络科学、观点动力学和机器学习相关应用中…

docker将容器保存为镜像

docker如何将运行的容器保存为镜像 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 其中&#xff1a; [OPTIONS] 是可选参数&#xff0c;如 -m 用于提供提交信息。 CONTAINER 是要提交的容器的ID或名称。 [REPOSITORY[:TAG]] 是新镜像的仓库名和标签&#xff0c;如果…

翻译论文的关键部分 | Parallel Tiled QR Factorization for Multicore Architectures

SSRFB DTSQT2 DLARFB DGEQT2 1, 对角子矩阵分解 DGEQT2 这个例程被开发出来&#xff0c;用于针对对角Tile子矩阵&#xff1a; &#xff0c;执行不分块的QR分解。 这个运算产生&#xff1a; 一个上三角矩阵 一个酉下三角矩阵&#xff0c;这个矩阵包含 b 个 Householder 反光面…

力扣96-不同的二叉搜索树(Java详细题解)

题目链接&#xff1a;96. 不同的二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 …

2024下半年软考中级【软件设计师】备考攻略

备考软件设计师&#xff0c;准备好复习资料&#xff0c;就是教材真题考试大纲三件套&#xff0c;然后再加3个月左右的复习长度&#xff0c;保证每一天2个小时的复习时间&#xff01; 首先&#xff0c;需要准备的资料书是教材。虽然教材很厚很厚&#xff0c;厚到不想看&#xf…

zdppy+vue3+onlyoffice文档管理系统实战 20240905 上课笔记 权限校验中间件开始

目前 1、登录功能基本完成2、缺对token的校验 如何校验token 必须保证token是有效的&#xff1a; 1、防止篡改&#xff0c;也就是能够重新解析为加密前的内容2、过期校验&#xff0c;token必须在有效期内3、可做可不做&#xff0c;必须保证token里面的用户名和用户ID能够匹…

何为图像处理,有哪些处理方法

图像处理是计算机科学中的一个重要领域&#xff0c;涉及到图像的获取、处理、分析和理解。在深度学习和计算机视觉中&#xff0c;图像处理技术尤为重要&#xff0c;它为图像识别、图像生成等高级任务提供了基础支持。图像处理方法包括图像增强、图像滤波和图像分割等。图像处理…

leetcode第142题:环形链表 ||(C语言+引申问题全解)

思路1&#xff08;思路难、代码简单&#xff09;&#xff1a; slow一次走一步&#xff0c;fast一次走两步&#xff1b;相遇时搞个meet&#xff0c;再搞一个head&#xff0c;head和meet一起走&#xff0c;每次走一步&#xff1b;head、meet相遇处&#xff0c;即为结果。 思路解释…

020 现代数据中心的路由与交换架构

引言 现代数据中心的设计必须兼顾高性能、高可用性和灵活性&#xff0c;以满足云计算、大数据、人工智能等应用的需求。在这样的背景下&#xff0c;数据中心的路由与交换架构设计显得尤为重要。Spine-Leaf架构、BGP路由优化以及高密度虚拟化环境中的交换技术&#xff0c;成为了…

HarmonyOS开发实战( Beta5.0)DevEco Device Tool开发环境搭建实践

通常在嵌入式开发中&#xff0c;很多开发者习惯于使用Windows进行代码的编辑&#xff0c;比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段&#xff0c;大部分的开发板源码还不支持在Windows环境下进行编译&#xff0c;如Hi3516、Hi3518系列开发板。…

基于智能巡检机器人的算力评估指标及其应用场景分析

随着工业自动化和智能化的发展&#xff0c;智能巡检机器人在各类复杂环境中的应用日益广泛。机器人通常需要在复杂、多变的环境中自主执行任务&#xff0c;如设备检测、数据采集、故障诊断等。为了确保巡检机器人的高效运行&#xff0c;计算能力&#xff08;算力&#xff09;的…

数据分析面试常见50个问题及解答要点(五)

为了帮助各位学习数据分析的小伙伴们成功拿到offer&#xff01;本期给大家整理了一些数据分析面试时的高频问题&#xff0c;分享给大家 数据分析高频面试50题&#xff0c;点击下方链接进行下载完整版&#xff0c;下面展示部分面试题&#xff0c;希望大家积极点赞收藏加关注&…

react自学(6) 部署到tomcat中

1.设置项目名 在package.json文件配置 "homepage": "/myapp"2.设置Router类型 说明&#xff1a;由于本文是写部署tomcat&#xff0c;因此使用HashRouter类型&#xff0c;不然会出现空白&#xff1b;如果使用springboot或在apche/nginx&#xff0c;则可以…

从 ES|QL 到 Python 中的原生 Pandas 数据帧

作者&#xff1a;来自 Elastic Quentin Pradet 自 Elasticsearch 8.15 或 Elasticsearch Serverless 以来&#xff0c;ES|QL 响应支持 Apache Arrow 流式传输格式。这篇博文将向你展示如何在 Python 中利用它。在之前的一篇博文中&#xff0c;我演示了如何使用 CSV 作为中间表示…

win11环境android studio中AVD目录修改问题解决

起始原因是我搭建Android studio 调试一个app时&#xff0c;运行模拟器时 出现“The emulator process for AVD xxx has terminated.”的错误 DEBUG | trying to load skin file D:\android\skins\\pixel_6\layout ERROR | Not enough space to create userdata partition…

STM32 系列MCU 开发利器 STM32CubeIDE

前言 由于自己接触较多的 ARM 系列芯片主要是 STM32 系列的&#xff0c;接触过 STM32 F1、F4、L4、H7 等几个系列&#xff0c;使用的 开发工具&#xff0c;主要是 Keil MDK5、IAR&#xff0c;所以也比较关注开发工具的使用。 Keil MDK5、IAR 属于商用收费的功能强大的IDE&…

Ubuntu服务器时间和本地时间不一致怎么解决——Linux的Local Time和RTC time

最近一直在搞大模型的相关工作&#xff0c;所以一直在用Linux服务器&#xff0c;前面的文章里也提到了&#xff0c;我用的是一台Dell PowerEdge R730xd。 但在使用中发现&#xff0c;IDRAC中的日志时间和本地时间存在时差&#xff0c;大概相关8小时。 对于技术人员&#xff0c…

设计模式 - Singleton pattern 单例模式

文章目录 定义单例模式的实现构成构成UML图 单例模式的六种实现懒汉式-线程不安全懒汉式-线程安全饿汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现 总结其他设计模式文章&#xff1a;最后 定义 单例模式是一种创建型设计模式&#xff0c;它用来保证一个类只有一个实…

Unity中保存数据的方法

一、概述 Unity中可用于持久化的方式有&#xff1a; 1&#xff09;通过ScriptableObject在可编辑模式下保存数据 2&#xff09;通过excel、json等文件实现数据的可持久化 二、ScriptableObject的使用 1、使用背景 假如需要制作子弹预设体&#xff0c;每个子弹上有speed速…

ChatGPT付费创作系统V3.0.6独立版 WEB+H5+小程序端 (新增AI全网搜索+文档解析+豆包AI通道)安装部署教程

播播资源GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。这是一种基于人工智能技术的问答系统&#xff0c;可以实现智能回答用户提出的问题。相比传统的问答系统&#xff0c;ChatGPT可以更…