[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.mzph.cn/news/86180.shtml

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

相关文章

十六、MySql的MVCC机制CONNECT(收官!)

文章目录 一、数据库并发的场景有三种&#xff1a;二、读-写&#xff08;一&#xff09;3个记录隐藏列字段&#xff08;二&#xff09;undo 日志&#xff08;三&#xff09;模拟 MVCC&#xff08;四&#xff09;一些思考&#xff08;五&#xff09;Read View 一、数据库并发的场…

【深度学习】Pytorch 系列教程(十二):PyTorch数据结构:4、数据集(Dataset)

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 2、张量操作&#xff08;Tensor Operations&#xff09; 3、变量&#xff08;Variable&#xff09; 4、数据集&#xff08;Dataset&#xff09; 随机洗牌 一、前言 Ch…

FPGA——WS2812B彩灯点亮

文章目录 前言一、WS2812B手册分析原理1.1 主要特点1.2 器件图1.3 接口1.4 输入码型1.5 归零码&#xff08;RZ&#xff09;和非归零码(NRZ)&#xff08;拓展&#xff09;1.6 级联输出1.7 输入数据格式 二、FPGA点亮彩灯2.1 代码 三、总结 前言 本篇博客是记录WS2812手册的学习…

web二级操作题

js和css的引入 在 HTML 中&#xff0c;你可以使用 <script> 和 <link> 标签来引入外部的 JavaScript 文件和 CSS 文件。 引入外部的 JavaScript 文件&#xff1a; <script src"path/to/script.js"></script>src 属性指定了 JavaScript 文…

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-GRU-Attention数据分类预测&#xff0c;运行环境Matlab2021b及以上&…

创建表

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 创建表 语法格式: create table 表名(列名1 数据类型,列名2 数据类型,... ,列名n, 数据类型 ); 练习:在czwbkl库中,创建一格test01表 跟大家说…

2、RocketMQ消息的分类

一、普通消息 1 消息发送分类 Producer对于消息的发送方式也有多种选择&#xff0c;不同的方式会产生不同的系统效果。 同步发送消息 同步发送消息是指&#xff0c;Producer发出⼀条消息后&#xff0c;会在收到MQ返回的ACK之后才发下⼀条消息。该方式的消息可靠性最高&#xff…

Python之列表

标题 列表什么是列表列表的创建列表的删除列表的访问 列表的常用方法append()、insert()、extend()pop()、remove()、clear()count()、index()list()、 filter()、 reduce()、lambda() 列表支持的运算加法运算符乘法运算符*成员测试运算符in 内置函数对列表的操作列表推导式列表…

在Idea中调试本地Docker

报错&#xff1a; Error running myApp: Unable to open debugger port (localhost:5005): java.net.SocketException "Connection reset" 原因&#xff1a; Docker配置里边没有配置环境变量JAVA_TOOL_OPTIONS. 解决&#xff1a; 在Docker下加入运行时的环境变量JAVA…

ffmpeg抠图

1.不用png&#xff0c;用AVFrame 2.合流 3.图片抠图透明 (1.)mp4扣yuv图&#xff0c;(2)用1.把一张yuv标记为透明然后av_hwframe_transfer_data到GPU (3)用抠图算法函数对yuv进行处理 (4) qsv的h264_qsv只支持nv12和qsv&#xff0c;但qsv本身并不限制像素格式&#xff0c;比如在…

Centos7原生hadoop环境,搭建Impala集群和负载均衡配置

Centos7原生hadoop环境&#xff0c;搭建Impala集群和负载均衡配置 impala介绍 Impala集群包含一个Catalog Server (Catalogd)、一个Statestore Server (Statestored) 和若干个Impala Daemon (Impalad)。Catalogd主要负责元数据的获取和DDL的执行&#xff0c;Statestored主要负…

VSCode远程连接服务器报错:Could not establish connection to

参考&#xff1a;https://blog.csdn.net/weixin_42538848/article/details/118113262 https://www.jb51.net/article/219138.htm 刚开始把ssh文件夹中的known_hosts给删除了&#xff0c;发现没啥用。 之后在扩展Remote-SSH里面&#xff0c;把config file路径设置为ssh文件夹里…

洛谷刷题入门篇:分支结构

今天又来了&#xff0c;刷题刷题&#xff0c;我爱刷题&#xff0c;题单链接如下&#xff1a; https://www.luogu.com.cn/training/101#problems 一、【深基1-2】小学数学 N 合一 题目如下&#xff1a;https://www.luogu.com.cn/problem/P2433 题目描述 问题 1 请输出 I lov…

【03】FISCOBCOS配置及使用控制台

官网文档https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html# 配置及使用控制台 第一步. 准备依赖 安装java &#xff08;推荐使用java 14&#xff09; # ubuntu系统安装java sudo apt install -y default-jdk#centos系统安装java sudo yu…

uni-app实现获取未来七天时间和星期几功能

例子如下&#xff1a; HTML&#xff1a; <viewstyle"margin-top: 3%;width: 100%;height: 10vh;display: flex;justify-content: space-around;"><div v-for"(item,index) in same_week" :class"[same_dayitem.date? activ :,dis]"cl…

关于CS 4.7 Stager 逆向及 Shellcode 重写

1. 概述 一直很想有一个自己的控&#xff0c;奈何实力不允许&#xff0c;CS 仍然是目前市面上最好用的控&#xff0c;但是也被各大厂商盯得很紧&#xff0c;通过加载器的方式进行免杀效果有限&#xff0c;后来看到有人用 go 重写了 CS 的 beacon&#xff0c;感觉这个思路很好&…

LVS-NAT模式

LVS负载均衡群集 群集的定义 Cluster&#xff0c;集群&#xff08;也称群集&#xff09;由多台主机构成&#xff0c;但对外只表现为一一个整体&#xff0c;只提供一-个访问入口(域名或IP地址)&#xff0c; 相当于一台大型计算机。 群集的作用 对于企业服务的的性能提升一般…

测试网页调用本地可执行程序(续:带参数调用)

前篇文章介绍了网页调用本地可执行程序的方式&#xff0c;通过在注册表中注册命令&#xff0c;然后在网页中调用命令启动本地程序。如果需要传递参数&#xff0c;则需要在注册表命令中的command项中设置如下形式的值。 "XXXXXX\XXXXXXX.exe" "%1"&emsp…

【python】Seaborn画热力图,只显示第一行数字---seaborn与matplotlib版本问题

github上有这个讨论&#xff1a;Heatmap only has annotation text in the top row only Issue #3478 mwaskom/seaborn (github.com)翻译过来就是&#xff1a;热图仅在最上面一行有注释文本&#xff1b; 原因就是matplotlib 在2023年9月更新到了 3.8.0版本&#xff0c;改变了…

FPGA project : HCSR04

犯下的错误&#xff1a; 1&#xff0c;由于使用cnt_base 做echo回响信号高电平时间的测量&#xff0c;它的数据应该很大&#xff0c;位宽也很大。也可以采用cnt_us计数器&#xff0c;计算这个高电平时间的。我为了精确计算距离&#xff0c;所以才仍然用的cnt_base计数器。 2&…