【JavaEE】Spring Web MVC详解

一.基本概念.

1.什么是Spring Web MVC?

官方链接: https://docs.spring.io/spring-framework/reference/web/webmvc.html

  • Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more commonly known as “Spring MVC”.
  • 翻译过来就是:Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC".

2. 什么是Servlet呢?

Servlet 是一种实现动态页面的技术. 准确来讲Servlet是⼀套 Java Web 开发的规范,或者说是一套Java Web 开发的技术标准. 只有规范并不能做任何事情,必须要有人去实现它. 所谓实现 Servlet 规范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等. Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,目前常见的实现了Servlet 规范的产品包括Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为"Servlet 容器". Servlet 容器用来管理程序员编写的 Servlet 类.

3. 什么是MVC

MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分.
在这里插入图片描述

  • View(视图) 指在应用程序中专门用来与浏览器进行交互,展示数据的资源.

  • Model(模型) 是应用程序的主体部分,用来处理程序中数据逻辑的部分.

  • Controller(控制器)可以理解为一个分发器,用来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图。即用来连接视图和模型

  • 举个例子:
    比如去公司面试, 我们到了公司之后, HR会给我们安排会议室, 根据候选人去通知不同的部门来安排面试, 面试结束后, 由HR来告诉面试结果
    在这个过程中, HR就是View(视图), 负责接待候选人, 并告知候选人面试结果不同的部门, 就是Controller(控制器), HR根据候选⼈来选择对应的部门来进行面试, 面试官 就是Model层, 来处理面试这个事情.

一.建立连接

@RequestMapping

  • 在 Spring MVC 中使用 @RequestMapping 来实现 URL 路由映射 ,也就是浏览器连接程序的作用. 它是用来注册接口的路由映射.
  • @RequestMapping 既可修饰类,也可以修饰方法 ,当修饰类和方法时,访问的地址是类路径 + 方法路径.
    • @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
    • @RequestMapping标识一个方法:设置映射请求请求路径的具体信息
@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String say(){return "Hello Spring MVC";}
}

访问地址:http://127.0.0.1:8080/request/hello

:

  1. @RequestMapping 的URL 路径最前面加不加 / (斜杠)都可以, Spring程序启动时, 会进行判断, 如果前面没有加 / ,Spring会拼接上一个"/".
  2. @RequestMapping即支持GET请求,也支持POST请求.也可以使用@GetMapping或者@PostMapping来指定求情方式

二.传参

1.传递单个参数.

	@RequestMapping("/test1")//传参的名称必须和后端方法声明的参数名称一致,如果不一致就会接收不到public String test1(String name){return name;}

使用PostMan进行测试:
在这里插入图片描述

2.传递多个参数.

	@RequestMapping("/test4")public String test4(String name,Integer age){return "age: "+age+",name: "+name;}

使用PostMan进行测试:在这里插入图片描述

3.传递对象.

	@RequestMapping("/test5")public String test5(Student student){return "student: "+student;}

使用PostMan进行测试:
在这里插入图片描述

4.后端参数重命名(后端参数映射).

  • 某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个time 给后端,而后端是使用 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值.
	@RequestMapping("test6")public String test6(@RequestParam("name") String userName){//此时name是一个必传参数,不传就会报错return "name: "+userName;}

使用PostMan进行测试:
在这里插入图片描述

  • 使用 @RequestParam 进行参数重命名时, 请求参数只能和 @RequestParam 声明的名称一致, 才能进行参数绑定和赋值.
  • 使用 @RequestParam 进行参数重命名时, 参数就变成了必传参数.

** 非必传参数的设置 **

	@RequestMapping("test7")public String test7(@RequestParam(value = "name",required = false) String 	userName){return "name: "+userName;}

5.传递数组.

	@RequestMapping("/test8")public String test8(String[] array){return Arrays.toString(array);}

测试结果:
在这里插入图片描述

6.传递集合.

  • 集合参数:和数组类似, 同一个请求参数名有为多个, 且需要使用@RequestParam 绑定参数关系
  • 默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使用@RequestParam 绑定参数关系
	@RequestMapping("/test9")public String test9(@RequestParam List<String> list){return "list: "+list;}

测试结果:
在这里插入图片描述

7.传递JSON数据.

什么是JSON

JSON:JavaScript Object Notation 【JavaScript 对象表示法】
JSON是⼀种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个子集,采用完全独立于编程语言的文本格式来存储和表示数据.
简单来说:JSON就是一种数据格式, 有自己的格式和语法, 使用文本表示一个对象或数组的信息, 因此JSON本质是字符串. 主要负责在不同的语言中数据传递和交换.

JSON语法.

  • JSON的语法:

    • 数据在键值对(Key/Value) 中
    • 数据由逗号 , 分隔
    • 对象用 {} 表示
    • 数组用 [] 表示
    • 值可以为对象, 也可以为数组, 数组中可以包含多个对象
  • JSON的两种结构

    • 对象: 大括号 {} 保存的对象是一个无序的 键值对 集合. 一个对象以左括号 { 开始, 右括号 } 结束。每个"键"后跟⼀个冒号 : ,键值对使用逗号 , 分隔
    • 数组: 中括号 [] 保存的数组是值(value)的有序集合. 一个数组以左中括号 [ 开始, 右中括号 ] 结束,值之间使用逗号 , 分隔。
  • JSON优点

    • 简单易用: 语法简单,易于理解和编写,可以快速地进行数据交换
    • 跨平台⽀持: JSON可以被多种编程语言解析和生成, 可以在不同的平台和语言之间进行数据交换和传输
    • 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占用带宽较小, 可以提高数据传输速度
    • 易于扩展: JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用
    • 安全性: JSON数据格式是一种纯的本格式,不包含可执行代码, 不会执行恶意代码,因此具有较高的安全性
      举个例子:
{"squadName": "Super hero squad","homeTown": "Metro City","formed": 2016,"secretBase": "Super tower","active": true,"members": [{"name": "Molecule Man","age": 29,"secretIdentity": "Dan Jukes","powers": ["Radiation resistance", "Turning tiny", "Radiationblast"]}, {"name": "Madame Uppercut","age": 39,"secretIdentity": "Jane Wilson","powers": ["Million tonne punch", "Damage resistance", "Superhuman reflexes"]}, {"name": "Eternal Flame","age": 1000000,"secretIdentity": "Unknown","powers": ["Immortality", "Heat Immunity", "Inferno", "Teleportation", "Interdimensional travel"]}]
}

传递JSON对象.

  • 接收JSON对象, 需要使用 @RequestBody 注解
  • RequestBody: 请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须在写在请求正文中.
	@RequestMapping("/m7")public String test10(@RequestBody Student student){return "student: "+student;}

使用Postman来发送json请求参:
在这里插入图片描述
使用Fiddle抓包工具观察传输的类型:
在这里插入图片描述

8.获取URL中参数@PathVariable

path variable: 路径变量. 和字面表达的意思⼀样, 这个注解主要作用在请求URL路径上的数据绑定

	@RequestMapping("/article/{articleId}")public String test11(@PathVariable("articleId") Integer articleId){return "接受到参数了 articleId: "+articleId;}

测试的URL:
http://127.0.0.1:8080/request/article/14/%E5%BC%A0%E4%B8%89
在这里插入图片描述

9.上传文件@RequestPart

	@RequestMapping("test13")public String test13(@RequestPart("file") MultipartFile file){String originalFilename = file.getOriginalFilename();return "接收到文件名称了: originalFilename: "+originalFilename;}

测试结果:
在这里插入图片描述

10.获取Header

  • 这里介绍两种获取Header的方式:

方法一:传统的获取Header的方式

	@RequestMapping("/getHeader1")public String getHeader1(HttpServletRequest request, HttpServletResponse response) {String userAgent = request.getHeader("User-Agent");return "获取到header的值了,userAgent value:"+userAgent;}

测试的结果为:
在这里插入图片描述

方法二:使用注解的方式获取Header

	@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent){return "获取到header的值了,userAgent value:"+userAgent;}

测试结果:
在这里插入图片描述

三. 响应.

1.返回静态的界面(简单点说就是返回一个前端的html界面)

  • 首先给出结论@RestController = @Controller+@ResponseBody

  • @Controller : 定义一个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.

  • @ResponseBody : 定义返回的数据格式为非视图, 返回一个 text/html 信息

  • 如果想返回视图的话, 只需要把 @ResponseBody 去掉就可以了, 也就是 @Controller

  • 创建前端页面 index.html(注意路径)
    在这里插入图片描述

  • html代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Index⻚⾯</title>
</head>
<body>Hello,Spring MVC,我是Index⻚⾯.
</body>
</html>
  • Controller层代码:
@RestController
public class IndexController {@RequestMapping("/index")public Object index(){//返回index.htmlreturn "/index.html";}
}

2.返回数据(使用@ResponseBody注解)

@Controller
@ResponseBody
public class IndexController {@RequestMapping("/index")public Object index(){return "/index.html";}
}
  • 加上 @ResponseBody 注解, 该方法就会把 “/index.html” 当做一个数据返回给前端.
  • @ResponseBody 既是类注解, 又是方法注解. 如果作用在类上, 表示该类的所有方法返回的都是数据, 如果作用在方法上, 表示该方法返回的是数据.也就是说: 在类上添加 @ResponseBody 就相当于在所有的方法上添加了 @ResponseBody 注解.
  • 同样, 如果类上有 @RestController 注解时:表示所有的方法上添加了 @ResponseBody 注解, 也就是当前类下所有的方法返回值做为响应数据. 如果一个类的方法里, 既有返回数据的, 又有返回页面的, 就把 @ResponseBody 注解添加到对应的方法上即可

测试结果:
在这里插入图片描述

3.返回HTML片段.

@RequestMapping("/returnHtml")
@ResponseBody
public String returnHtml() {return "<h1>Hello,HTML~</h1>";
}

测试结果:
在这里插入图片描述
通过Fiddler抓包我们可以观察到:
在这里插入图片描述

  • 响应中的 Content-Type 常见取值有以下几种:
    • text/html : body 数据格式是 HTML
    • text/css : body 数据格式是 CSS
    • application/javascript : body 数据格式是 JavaScript
    • application/json : body 数据格式是 JSON

4.返回JSON

	@ResponseBody@RequestMapping("/test4")//Spring会根据返回的内容来确定返回的格式public HashMap<String,String> test4() {HashMap<String,String> map = new HashMap<>();map.put("key1","value1");map.put("key2","value2");map.put("key3","value3");return map;}
  • 测试结果:
    在这里插入图片描述
  • 通过Fiddler观察响应结果:
    在这里插入图片描述

5.设置状态码.

	@ResponseBody@RequestMapping("/test5")public String setStatus(HttpServletResponse response) {response.setStatus(418);return "状态码设置成功";}
  • 通过Fiddler来观察设置的结果
    在这里插入图片描述

6.设置Content-Type

	@ResponseBody@RequestMapping(value = "/test6",produces = "application/json")public String test6() {return "{\"ok\":1}";}
  • 通过Fiddler来观察设置的结果
    在这里插入图片描述

四.总结:

  • 学习Spring MVC, 其实就是学习各种Web开发需要用的到注解
    a. @RequestMapping: 路由映射
    b. @RequestParam: 后端参数重命名
    c. @RequestBody: 接收JSON类型的参数
    d. @PathVariable: 接收路径参数
    e. @RequestPart: 上传文件
    f. @ResponseBody: 返回数据
    g. @CookieValue: 从Cookie中获取值
    h. @SessionAttribute: 从Session中获取值
    i. @RequestHeader: 从Header中获取值
    j. @Controller: 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理. 默认返回视图.
    k. @RestController: @ResponseBody + @Controller 返回数据

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

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

相关文章

浅析MySQL-基础篇01

目录 执行一条select语句&#xff0c;发生了什么&#xff1f; MYSQL执行流程是怎么样的&#xff1f; 第一步&#xff1a;连接器 第二步&#xff1a;查询缓存 第三步&#xff1a;解析SQL 解析器 第四步&#xff1a;执行SQL 预处理器 优化器 执行器 执行一条select语句…

hive on spark 记录

环境&#xff1a; hadoop 2.7.2 spark-without-hadoop 2.4.6 hive 2.3.4 hive-site.xml <property><name>hive.execution.engine</name><value>spark</value> </property> <property><name>spark.yarn.jars</name>&l…

【git1】指令,commit,免密

文章目录 1.常用指令&#xff1a;git branch查看本地分支&#xff0c; -r查看远程分支&#xff0c; -a查看本地和远程&#xff0c;-v查看各分支最后一次提交, -D删除分支2.commit规范&#xff1a;git commit进入vi界面&#xff08;进入前要git config core.editor vim设一下vi模…

不用写一行代码,deepseek结合腾讯云语音识别来批量转录Mp3音频

首先&#xff0c;打开window系统中的cmd命令行工具&#xff0c;或者powershell&#xff0c;安装腾讯云tencentcloud的Python库 pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python 然后&#xff0c;开通腾讯云的对象存储COS服务&…

超级好用的JSON格式化可视化在线工具

JSON是开发非常常用的一种报文格式&#xff0c;最常见的需求就是将JSON进行格式化&#xff0c;最好是有图形化界面显示结构关系&#xff0c;以便进行数据分析。 理想的在线JSON工具&#xff0c;应该支持快速格式化、可压缩、快捷复制、可下载导出&#xff0c;对存在语法错误的地…

计算机组成原理 —— 存储系统(DRAM和SRAM,ROM)

计算机组成原理 —— 存储系统&#xff08;DRAM和SRAM&#xff09; DRAM和SRAMDRAM的刷新DRAM地址复用ROM&#xff08;Read-Only Memory&#xff08;只读存储器&#xff09;&#xff09; 我们今天来看DRAM和SRAM&#xff1a; DRAM和SRAM DRAM&#xff08;动态随机存取存储器&…

【ajax基础】回调函数地狱

一&#xff1a;什么是回调函数地狱 在一个回调函数中嵌套另一个回调函数&#xff08;甚至一直嵌套下去&#xff09;&#xff0c;形成回调函数地狱 回调函数地狱存在问题&#xff1a; 可读性差异常捕获严重耦合性严重 // 1. 获取默认第一个省份的名字axios({url: http://hmaj…

具有 Hudi、MinIO 和 HMS 的现代数据湖

Apache Hudi 已成为管理现代数据湖的领先开放表格式之一&#xff0c;直接在现代数据湖中提供核心仓库和数据库功能。这在很大程度上要归功于 Hudi 提供了表、事务、更新/删除、高级索引、流式摄取服务、数据聚类/压缩优化和并发控制等高级功能。 我们已经探讨了 MinIO 和 Hudi…

【Python】从0开始的Django基础

Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…

线程C++

#include <thread> #include <chrono> #include <cmath> #include <mutex> #include <iostream> using namespace std;mutex mtx; void threadCommunicat() {int ans 0;while (ans<3){mtx.lock();//上锁cout << "ans" <…

android 在线程中更新界面

在Android中&#xff0c;你不能直接从子线程中更新UI&#xff0c;因为这会导致应用崩溃。你需要使用Handler或runOnUiThread()来更新UI。 使用Handler 以下是如何使用Handler在子线程中更新UI的示例&#xff1a; 1. 创建Handler实例&#xff1a; import android.os.Bundle;…

docker搭建mongo副本集

1、mongo集群分类 MongoDB集群有4种类型&#xff0c;分别是主从复制、副本集、分片集群和混合集群。 MongoDB的主从复制是指在一个MongoDB集群中&#xff0c;一个节点&#xff08;主节点&#xff09;将数据写入并同步到其他节点&#xff08;从节点&#xff09;。主从复制提供…

数据可视化实验一:Panda数据处理及matplotlib绘图初步

目录​​​​​​​ 2024-6-17 一、请将所有含有发明家“吴峰”的发明专利的“申请日”打印出来。并将含有“吴峰”的所有发明专利条目保存到Excel中 1.1 代码实现 1.2 运行结果 二、读取文件创建城市、人口、性别比、城镇化率DataFrame对象&#xff0c;计算指标排名&…

【iOS】#include、#import、@class、@import

文章目录 #include#importclassimport总结 #include #include是c\c中的预处理器指令&#xff0c;用于包含头文件的内容 但是使用#include可能会出现重复包含文件的问题&#xff0c;因此需要使用&#xff08;#ifndef/#define/#endif&#xff09;。 #import //导入系统头文件…

学习C++第二天

1.缺省参数 缺省参数的概念&#xff1a; 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void show(int a 10) {cout << a << endl; }int main() {sho…

FPGA学习网站推荐

FPGA学习网站推荐 本文首发于公众号&#xff1a;FPGA开源工坊 引言 FPGA的学习主要分为以下两部分 语法领域内知识 做FPGA开发肯定要首先去学习相应的编程语言&#xff0c;FPGA开发目前在国内采用最多的就是使用Verilog做开发&#xff0c;其次还有一些遗留下来的项目会采用…

构建未来应用的核心,云原生技术栈解析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、云原生技术栈 1、容器和容器编排 1.1 Docker 1.2 Kubernete…

如何配置node.js环境

文章目录 step1. 下载node.js安装包step2. 创建node_global, node_cache文件夹step3.配置node环境变量step3. cmd窗口检查安装的node和npm版本号step4. 设置缓存路径\全局安装路径\下载镜像step5. 测试配置的nodejs环境 step1. 下载node.js安装包 下载地址&#xff1a;node.js…

电子杂志制作的必备软件:轻松提升制作效率

​电子杂志作为一种新型的媒体形式&#xff0c;具有互动性强、内容丰富、传播范围广等特点。随着互联网的普及&#xff0c;越来越多的企业和个人开始关注和投入电子杂志的制作。然而&#xff0c;电子杂志的制作过程往往复杂繁琐&#xff0c;需要付出大量的时间和精力。为了提高…

macbook配置adb环境和用adb操作安卓手机

&#xff08;参考&#xff1a;ADB工具包的安装与使用_adb工具箱-CSDN博客&#xff09; 第一步&#xff1a;从Android开发者网站下载Android SDK&#xff08;软件开发工具包&#xff09;。下载地址为&#xff1a; 第二步&#xff1a;解压下载的SDK压缩文件到某个目录中。 进入解…