[JAVAee]Spring MVC

目录

Spring MVC框架

MVC

Spring MVC的功能

用户与程序的连接

@RequestMapping

指定为Get请求

指定为Post请求

获取参数

单个参数 

表单传递多个参数

传递对象

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

设置参数必传/非必传

获取JSON对象

获取URL中的参数 

上传文件

获取Cookie/Seeison/Header

返回数据

返回视图

返回Body

返回JSON对象

返回text/html

请求重定向/转发


Spring MVC框架

Spring Web MVC(正式名)是基于Servlet API构建的Web框架,从一开始就包含在Spring框架中.

在Spring Boot项目的基础上,加入Spring Web框架就成了包含有Spring MVC的项目.

MVC

spring我们先前可以知道是一个IOC容器,那MVC是什么呢?

MVC其实只是一种设计思想,是Modle,View,Controller是缩写.是一种软件工程中的,软件架构模式.

  • Model:是在应用程序中负责处理程序数据逻辑的部分.通常模型对象负责在数据库中存取数据
  • View:Model包含的数据进行可视化
  • Controller:作用于Model与View上,控制数据流向Model,再将Model返回的数据用于更新View.

基于MVC的思想上,Spring MVC就实现了这个MVC这个模式,并继承了Servlet API的web框架.

Spring MVC的功能

学习一个框架,当然是要学会框架的运用.

这里就围绕,用户与程序的连接,参数的获取,数据的输出三个方面来展开.

用户与程序的连接

@RequestMapping

连接通常使用@RequestMapping来实现.此标签通常用来注册接口的路由映射,路由映射指的是:当用户访问一个特定的URL时会请求到某个类的某个方法当中.

@RequestMapping既能修饰类,也能修饰方法.

@Controller//类注册到spring容器中
@ResponseBody//表明返回的是一个数据并非页面
public class Hello {@RequestMapping("/hello")//注册接口的路由映射public String Hello(){return "hello~";}
}

我们知道一般的http请求可以分成几个类型,get,post,put,head,delete...

那么被@RequestMapping修饰的类或方法能接收哪一种类型方法呢?

可以使用postman来进行测试一下:

发现,使用上面的方法都能成功的返回一个hello.

其实@RequestMapping是一个共享映射,在没有设置特定的请求方式下其能接收多种类型的请求.

指定为Get请求

    //方法一@RequestMapping("/hello")//方法二@RequestMapping(value = "/hello",method = RequestMethod.GET)//方法三@GetMapping("/hello")

指定为Post请求

在一般开发中,@RequestMapping的普通形式一般会被程序员们默认成get请求,虽然能用但最好还是不要啦. 

    //方法一@RequestMapping(value = "/hello",method = RequestMethod.POST)//方法二@PostMapping("/hello")

获取参数

单个参数 

在Spring MVC中可以直接使用方法中的参数来进行传参.

@Controller//类注册到spring容器中
@ResponseBody//表明返回的是一个数据并非页面
public class Hello {@PostMapping("/hello")//注册接口的路由映射public String Hello(String name){//通过方法的参数来传参return name + " says hello~";}

表单传递多个参数

@PostMapping("/hello")//注册接口的路由映射public String Hello(String name,String state){return name + " says hello " + state;}

传递对象

Spring MVC中可以实现参数对象的自动赋值 

@Data//Lombok的标签自动注入属性的getter与setter,非必要
public class User {private String name;private String state;private int age;//传参不一定要与对象的属性全部匹配也是可以的
}
@Controller//类注册到spring容器中
@ResponseBody//表明返回的是一个数据并非页面
public class Hello {@PostMapping("/hello")//注册接口的路由映射public String Hello(User user){return user.getName() + " says hello " + user.getState();}

包括表单中的多个参数传递,在拥有多个参数时前后端进行交互时.是以参数的命名来进行匹配的,传参的位置并不会影响结果. 

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

在某些情况下,可能前端传参的属性名与后端接收的属性名可能会不一致.这样就导致了后端接收不到参数的情况.但在Spring MVC中可以在后端将属性重命名成与前端一致,这样就可以正常的接收数据了.

使用@RequestParam来实现对方法中参数的重命名

@PostMapping("/hi")public String hi(@RequestParam("username") String name){//此处将name重命名为usernamereturn name + " says hi";}

这样就可以在不改动方法中代码的情况下去成功的接收前端传参的信息. 

设置参数必传/非必传

在上面的四种情况下,前端只传了一个或少于方法中参数的个数甚至压根没传时.没传的参数会被赋予属性的默认值.(String -> null) 并不会导致程序报错

但在使用了@RequestParam注解后的参数默认都是必传的,即前端一定要传输一个值给后端否则程序会进行报错,

 可以去看一看@RequestParam注解中看一看缘由

我们也可以将默认值更改为false,这样一来被@RequestParam修饰的参数就不一样要前端传输了

@PostMapping("/hi")public String hi(@RequestParam(value = "username",required = false) String name){//此处将name重命名为username,并设置参数为非必传return name + " says hi";}

获取JSON对象

使用@RequestBody来获取http请求中的json对象.

@PostMapping("/hello")//注册接口的路由映射public String Hello(@RequestBody User user){return user.getName() + " says hello " + user.getState();}

@RequestBody注解的作用就是,告知方法中的参数前端传过来的数据在http请求的body中,而不是url的queryString中.

    @PostMapping("/hello")//注册接口的路由映射public String Hello(User user){//没有使用@RequestBody标签return user.getName() + " says hello " + user.getState();}

获取URL中的参数 

此处中的url中的参数,并非query string形式的参数.

例如下面的url形式,999并非是一个键值对的形式只是单纯的将value添加到了url末尾.也可以添加在url之间.

http://localhost:8080/hello/999

通过@PathVariable注解,能够获取到999. 

@PostMapping("hello3/{name}")//表明url中hello3后的是一个名为name的参数public String hello3(@PathVariable("name") String userName){//@PathVariable还能对方法中的参数进行重命名为"name"return userName + " says hello";}

url中的参数可以是多个的,也可以夹杂在url当中.

url为:http://localhost:8080/hello3/xin/and/20

后端的@PostMapping为:("/hello3/{name}/and/{age}")

其实上面url中的参数只有两个,name与age.但两个参数之间是可以夹在一个固定的地址中的. 

上传文件

这里的上传文件所指的是用户方,即用户上传文件至服务器当中.

@Controller
@ResponseBody
public class TestFile {//MultipartFile是spring类型,用来接收传输的文件//使用@RequestPart注解将接收到的文件传到方法的参数中@PostMapping("/file")public String getFile(@RequestPart MultipartFile file) throws IOException {//保存文件主要分为://1.获取文件名后缀,这是方便我们来存储并重命名文件//2.设置保存路径并保存//1.获取后缀String fileLastName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//此语句为,获取文件的原文件名,并将文件名的后缀拿到.substring是将"."后的字符串拿到//此处使用一个UUID,UUID会为我们创建出一个唯一识别码String fileName = UUID.randomUUID() + fileLastName;//这是最终的文件名//2.在要保存的路径上创建出一个文件实例String path = "D:\\\\JAVA-home\\\\logs\\\\" + fileName;File filePath = new File("D:\\JAVA-home\\logs\\" + fileName);//file的构造方法中放入路径就会在此处创建出一个文件实例,暂时并不存在真的文件//此处最好使用绝对路径//3.保存文件//transferTo方法可以将文件存放到指定的路径当中file.transferTo(filePath);return path;}
}

使用postman上传文件

成功接收到啦

获取Cookie/Seeison/Header

 这三个属性通常在HttpServlet的请求和响应当中,在spring mvc当中进行了连接的方法会识别方法中的参数有无请求与响应的对象,如果有会自动进行载入.

传统方法: 

@Controller
@ResponseBody
public class demo {@PostMapping("/demo")public String get(HttpServletRequest request, HttpServletResponse response){//获取cookie 获取所有的cookieCookie[] cookies= request.getCookies();//获取HeaderString head = request.getHeader("user");//获取SessionHttpSession session = request.getSession(false);String user = null;//假设有一个user对象if(session != null && session.getAttribute("user") != null){user = (String) session.getAttribute("user");}return "finish";}
}

使用注解方法:

@Controller
@ResponseBody
public class demo2 {@PostMappingpublic String getCookie(@CookieValue("wow") String cookie){return cookie;//获取单个名为wow的cookie}@PostMappingpublic String getHeader(@RequestHeader("Host") String headerHost){return headerHost;//获取Header报头中的Host属性}@PostMappingpublic String getSession(@SessionAttribute(value = "userName",required = false) String user){return user;//根据Session的键值对中的key来获取session}
}

返回数据

在Spring MVC与Spring Boot当中,默认返回的是视图而不是参数.所以我们上面的方法中都加上了一个@ResponseBody

返回视图

@Controller
public class demo3 {@GetMapping("/hello")public Object html(){return "/index.html";}
}

 在访问对应的URL后呈现出的就是一个页面

返回Body

@RespondBody可以修饰类或方法.

其返回值如果是字符就会转成text/html,如果返回的是一个对象则会变成application/json 返回给前端.

返回JSON对象
@ResponseBody@GetMapping("/JSON")public Object json(){HashMap<String,String> map = new HashMap<>();map.put("hello","world");map.put("cat","dog");return map;}

返回text/html
    @ResponseBody@GetMapping("/wow")public Object html(){return "<head>wow</head>";}

请求重定向/转发

 重定向:

客户端重新访问新的页面

@GetMapping("/wow")public Object html(){return "redirect:/index.html";}

 转发:

客户端请求服务器帮忙访问新的页面

@GetMapping("/wow")public Object html(){return "forward:/index.html";}

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

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

相关文章

Javascript小案例-进度条(配置对象版)

gif演示图&#xff1a; 代码&#xff1a; 进度条(配置对象版).html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

eNSP基础网络学习-v02

一、eNSP 1.什么是eNSP eNSP(Enterprise Network Simulation Platform)是一款由华为提供的免费的、可扩展的、图形化操作的网络仿真工具平台&#xff0c;主要对企业网络路由器、交换机进行软件仿真&#xff0c;完美呈现真实设备实景&#xff0c;支持大型网络模拟&#xff0c;让…

怎样防止员工泄露技术?(十条避免公司泄密的措施)

在当今信息化社会&#xff0c;公司信息的安全性和保密性显得尤为重要。一旦公司信息泄露&#xff0c;不仅会对公司的经营造成严重影响&#xff0c;还可能引发法律纠纷。因此&#xff0c;采取有效的措施来防止公司信息泄露是非常必要的。以下是一些具体的措施&#xff1a; 部署洞…

【1993. 树上的操作】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一棵 n 个节点的树&#xff0c;编号从 0 到 n - 1 &#xff0c;以父节点数组 parent 的形式给出&#xff0c;其中 parent[i] 是第 i 个节点的父节点。树的根节点为 0 号节点&#xff0c;所以 par…

【完全二叉树魔法:顺序结构实现堆的奇象】

本章重点 二叉树的顺序结构堆的概念及结构堆的实现堆的调整算法堆的创建堆排序TOP-K问题 1.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构…

kafka消费者多线程开发

目录 前言 kafka consumer 设计原理 多线程的方案 参考资料 前言 目前&#xff0c;计算机的硬件条件已经大大改善&#xff0c;即使是在普通的笔记本电脑上&#xff0c;多核都已经是标配了&#xff0c;更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单…

pom.xml中解决“vulnerable dependency maven:org.yaml:snakeyaml:1.33“警告问题

问题 当我们引入依赖的时候&#xff0c;pom文件会有这样的提示&#xff0c;其大概的意思就是 maven:org.yaml:snakeyaml:1.30"表示通过Maven引入了一个潜在的安全漏洞依赖项"org.yaml:snakeyaml:1.30" 解决办法 其实我们就是要更改这个依赖的版本&#xff0c…

【李沐深度学习笔记】按特定轴求和

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 这节就算之前内容的复习&#xff0c;后面以截图形式呈现 这节课就简单说明以下&#xff0c;axis为0是行&#xff0c;1是列&#xf…

解决方案:TSINGSEE青犀+智能分析网关助力智慧仓储智能化监管

为全面保障物流仓储的安全性与完整性&#xff0c;解决仓库管理难题&#xff0c;优化物流仓储方式&#xff0c;提升仓储效率&#xff0c;降低人工成本&#xff0c;旭帆科技推出智慧仓储AI视频智能分析方案&#xff0c;利用物联网、大数据、云计算等技术&#xff0c;对仓储管理进…

Date类的学习笔记-超级详细

Date 的定义, 在开始研究这个之前我们首先要能够明白一点&#xff0c;这个 Date 其实本质上是一个对象&#xff0c;我们通过这个对象可以去构建变量&#xff0c;知道这个之后就可以开展后续的研究了 JDK 通用 Date 类的构造方法 测试 获取当前的时间 // 构造这个日期对象Date…

【@PostConstruct、 @Autowired与构造函数的执行顺序】

PostConstruct、 Autowired与构造函数的执行顺序 一、PostConstruct介绍二、Spring框架中在bean初始化和销毁时候执行实现方式三、项目验证1.MyServiceImpl2.测试结果3. 项目源码 最近对同事代码进行codeReview时候发现用PostConstruct注解&#xff0c;特地对此注解执行顺序进行…

IDEA2023新UI回退老UI

idea2023年发布了新UI&#xff0c;如下所示 但是用起来真心不好用&#xff0c;各种位置也是错乱&#xff0c;用下面方法可以回退老UI

【C刷题】day3

一、选择题 1、已知函数的原型是&#xff1a; int fun(char b[10], int *a); &#xff0c;设定义&#xff1a; char c[10];int d; &#xff0c;正确的调用语句是&#xff08; &#xff09; A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d); 【答案…

07_ElasticSearch:倒排序索引与分词Analysis

07_ElasticSearch&#xff1a;倒排序索引与分词Analysis 一、 倒排索引是什么&#xff1f;1.1 通过示例&#xff0c;简单理解下1.2 核心组成 二、倒排索引是怎么工作的&#xff1f;2.1 创建倒排索引2.2 倒排索引搜索 三、Analysis 进行分词3.1 Analyzer 由三部分组成3.2 Analyz…

【JS】—垃圾回收机制

一、指令材料 1.定义 JavaScript&#xff08;JS&#xff09;的垃圾回收机制是一种自动管理内存的过程&#xff0c;它有助于释放不再使用的内存&#xff0c;以避免内存泄漏和提高程序的性能。 JavaScript的垃圾回收机制是一种自动管理内存的方式&#xff0c;以确保不再被引用的…

Linux Shell 实现一键部署podman

podman 介绍 使用 Podman 管理容器、Pod 和映像。从本地环境中无缝使用容器和 Kubernetes&#xff0c;Podman 提供与 Docker 非常相似的功能&#xff0c;它不需要在你的系统上运行任何守护进程&#xff0c;并且它也可以在没有 root 权限的情况下运行。 Podman 可以管理和运行…

Hive 的函数介绍

目录 ​编辑 一、内置运算符 1.1 关系运算符 1.2算术运算符 1.3逻辑运算符 1.4复杂类型函数 1.5对复杂类型函数操作 二、内置函数 2.1数学函数 2.2收集函数 2.3类型转换函数 2.4日期函数 2.5条件函数 2.6字符函数 三、内置的聚合函数 四、内置表生成函数 五、…

Android Jetpack组件架构:Lifecycle的使用 和 原理

Android Jetpack组件架构&#xff1a;Lifecycle的使用和原理 导言 作为Jetpack中关于生命周期管理的核心组件&#xff0c;Lifecycle组件是其他比如LiveDate和ViewModel等组件的基础&#xff0c;本篇文章主要就将介绍关于Lifecycle的使用和它的运作原理。 Lifecycle的使用 我…

MyBatis 中的插件可以拦截哪些操作

MyBatis 中的插件可以拦截哪些操作 MyBatis 是一个优秀的持久化框架&#xff0c;在实际项目开发中广泛应用。MyBatis 的插件机制可以方便地对 MyBatis 的各个环节进行扩展和定制。在本文中&#xff0c;我们将详细介绍 MyBatis 中的插件机制&#xff0c;并探讨插件可以拦截哪些…

C语言大佬的必杀技---宏的高级用法

C语言大佬的必杀技—宏的高级用法 目录: 字符串化标记的拼接宏的嵌套替换多条语句防止一个文件被重复包含宏和函数的区别 可能大家在学习的时候用得比较少&#xff0c;但是在一些代码量比较大的时候&#xff0c;这样使用&#xff0c;可以大大的提高代码的可读性&#xff0c;…