【Spring】Spring MVC请求响应

文章目录

  • 1. 请求
    • 1.1 传递单个参数
    • 1.2 传递多个参数
    • 1.3 传递对象
    • 1.4 后端参数重命名
    • 1.5 传递数组
    • 1.6 传递集合
    • 1.7 传递JSON对象
    • 1.8 获取URL中参数
    • 1.9 上传⽂件
    • 1.10 获得Cookie
    • 1.11 获得Session
    • 1.12 获得Header
  • 2. 响应
    • 2.1 返回静态界面
    • 2.2 返回数据
    • 2.3 返回HTML代码片段
    • 2.4 返回JSON
    • 2.5 设置状态码

1. 请求

访问不同的路径, 就是发送不同的请求。在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要是学习如何传递参数到后端以及后端如何接收。
传递参数,我们通过postman测试。

1.1 传递单个参数

@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m1")
    public String m1(String name){
        return "name: " + name;
    }
}    

正常传递:
单个参数
可以看到, 后端程序正确拿到了name参数的值。
Spring MVC 会根据⽅法的参数名, 找到对应的参数, 赋值给⽅法。
所以这里要注意,传递的参数要和后端代码中的参数一致。
那不一致会出现什么现象呢?我们直接测试,如图:
no
可以发现是获不得参数的,name依旧为空。
这里还需要注意,参数的类型如果不是包装类(boolean),参数必须传,不然会报500错误,类型也要一致,不然会报400错误。
对于参数可能为空的数据,建议使⽤包装类型。

把参数类型修改为int:

@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m1")
    public String m1(int n){
        return "n = " + n;
    }
}    

500
500
400
400

1.2 传递多个参数

@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m2")
    public String m2(String name, Integer age){
        return "name: " + name + ", age: " + age;
    }
}    

正常传递:
多参
参数要一致,但是它们顺序可以调换。 要求和单个参数一样的。
多换
但是可以发现这种还是有弊端,就是当增加新的参数,修改代码会非常麻烦,这个时候就可以把这些参数封装成对象,当增加新的参数,只需要多封装个属性。

1.3 传递对象

创建Person类:

package com.example.demo;

public class Person {
    private String name;
    private int age;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", password='" + password + '\'' +
                '}';
    }
}

这个时候,传递对象代码:

public class ParamController {
    @RequestMapping("/m4")
    public String m4(Person person){
        return person.toString();
    }
}

正常传参:
对象
当传参后,后端代码拿到对应的参数,Spring 会根据参数名称⾃动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则
赋值为默认初识值, ⽐如int类型的属性, 会被赋值为0)。
如果增加新的参数,只需要修改Person中代码,变得更加简单。

1.4 后端参数重命名

有时,前端参数的名字,我们想做出修改,让它更加的方便区分,这个时候就用到@RequestParam ,这个注解可以后端参数映射为其他名。
修改m2方法。

@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m2")
    public String m2(@RequestParam("name") String myName, @RequestParam("age") Integer myAge){
        return "name: " + myName + ", age: " + myAge;
    }
}    

相同请求不受影响:
参数改
映射后要注意,映射的参数会变成必传参数。
参数不传:
不传

但也可以改变,查看@RequestParam源码:
@RequestParam源码
发现required默认值为true,含义就是它修饰的参数为必传,那么只要修改它的返回值即可
如下面代码,这时就不是比传参数。

public String m2(@RequestParam(value = "name",required = false) String myName, @RequestParam(value = "age", required = false) Integer myAge){
        return "name: " + myName + ", age: " + myAge;
    }

1.5 传递数组

@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m5")
    public String m5(String[] array){
        return Arrays.toString(array);
    }
}

传参:
数组
我们可以使用, 直接分割。

1.6 传递集合

@RequestMapping("/param")
@RestController
public class ParamController {
    @RequestMapping("/m6")
    public String m6(@RequestParam List<String> list){
        return list + "";
    }
}

当用postman传参:
集合
可以正常请求,但是当使用浏览器时,有时要进行转义编码。
例如:, 转义为%2c。
且需要使⽤ @RequestParam 绑定参数关系。
默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使⽤@RequestParam绑定参数关系。

1.7 传递JSON对象

    @RequestMapping("/m7")
    public String m7(@RequestBody Person person){
        return person.toString();
    }

接收JSON对象, 需要使⽤ @RequestBody 注解。
RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中。
不使用注解将无法赋值。
传递参数:
在这里插入图片描述
这时,请求类型就是JOSN。
JOSN

1.8 获取URL中参数

    @RequestMapping("/m8/{age}/{name}")
    public String m8(@PathVariable Integer age, @PathVariable("name") String useName){
        return "解析参数: " + age + ", name: " + useName;
    }

传参:
路径
@PathVariable:这个注解主要作⽤在请求URL路径上的数据绑定。
如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不⽤给@PathVariable的属性赋值, 如上述例⼦中的id变量。
如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值,如上述例⼦中的userName变量。

1.9 上传⽂件

    @RequestMapping("/m9")
    public String m9(@RequestPart("file") MultipartFile file) throws IOException {
        //获得文件名称
        String s = file.getOriginalFilename();
        //上传到指定路径
        file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
        return s;
    }

传参:
文件
上传文件:
在这里插入图片描述
D:\temp中:
在这里插入图片描述
上传文件要使用@RequestPart注解,注解中参数要和传的参数名一致。

1.10 获得Cookie

    @RequestMapping("/m10")
    public String m10(HttpServletRequest request){
        //获得所有Cooike
        Cookie[] cookies = request.getCookies();
        //打印
        StringBuilder stringBuilder = new StringBuilder();
        if(cookies != null){
            for (Cookie cookie: cookies) {
            	stringBuilder.append(cookie.getName() + " : " + cookie.getValue());
            }
        }
        return "Cookie: " + stringBuilder;
    }

上面是Servlet获得Cookie的方式,因为Spring MVC是基于Servlet API实现的Web框架,所以HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring MVC⽅法的内置对象. 需要时直接在⽅法中添加声明即可。
Servlet Cookie
响应结果并没有Cookie,这是因为网站中并没有Cookie,直接在postman中添加Cookie即可。
添加Cookie

通过这个也可以看出,Cookie是可以伪造的,后端收到Cookie要进行校验。

上面方式也可以通过注解@CookieValue 简化,简化后的代码如下。

    @RequestMapping("/getCookie")
    public String getCookie(@CookieValue String xiaochen){
        return "name: " + xiaochen;
    }
}

1.11 获得Session

    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        if(session != null){
            session.setAttribute("name","java");
        }
        return "存储成功";
    }

Session在服务端,所以无法直接添加,可以通过上述方式。
HttpSession getSession(boolean create) : 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null 。默认为true。
void setAttribute(String name, Object value): 使⽤指定的名称绑定⼀个对象到该 session 会话。
session
通过Fiddler观察Http请求和响应情况:
Fiddler
获得Session方法和获得Cookie一样有很多种,通常使用下面简单的两种。

HttpSession session = request.getSession();
Session 不存在的话, 会⾃动进⾏创建。

    @RequestMapping("/getSession1")
    public String getSession(@SessionAttribute(required = false) String name){
        return "name: " + name;
    }
    @RequestMapping("/getSession2")
    public String getSession2(HttpSession session){
        String name = (String) session.getAttribute("name");
        return "name: " + name;
    }

1.12 获得Header

    @RequestMapping("/getHeader")
    public String getHeader(@RequestHeader("User-Agent") String useragent){
        return useragent;
    }

使用@RequestHeader 注解即可获得。
header

2. 响应

在我们前⾯的代码例⼦中,都已经设置了响应数据, Http响应结果可以是数据, 也可以是静态⻚⾯,也可以针对响应设置状态码, Header信息等。

2.1 返回静态界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index页面</title>
</head>
<body>
    Hello,Spring MVC.
</body>
</html>

前端代码,注意文件位置。
位置

后端返回代码如何写呢?先按照响应的模式写,代码如下。

@RequestMapping("/return")
@RestController
public class ReturnController {
    @RequestMapping("/index")
    public String returnIndex(){
        return "/index.html";
    }
}

直接返回,运行查看:
indexno
这很不明显不对,这是返回了一个字符串。
这时,就需要另一个注解了,我们需要把最前面的@RestController 改为 @Controller。
更换
再次请求,便可以得到我们想要的结果:
在这里插入图片描述

2.2 返回数据

@RequestMapping("/return")
//@RestController
@Controller
@ResponseBody
public class ReturnController {
    @RequestMapping("returnData")
    public String returnData(){
        return "返回数据";
    }
}

返回数据,前面其实一直在用,如果返回静态界面,需要写@Controller 注解,如果要直接返回数据,还需要加上个@ResponseBody注解。注意:@ResponseBody 即可作用在类上,表示类中所以方法返回都是数据,也可以作用在方法上,只表示该方法返回数据,这两个注解也可以和二为一,就是前面经常写的@RestController,但它也只能修饰类了。
Controller

2.3 返回HTML代码片段

    @RequestMapping("/returnHtml")
    @ResponseBody
    public String html(){
        return "<h1>hello,html</h1>";
    }

当返回数据有HTML代码,浏览器会自动解析:
HTML
如果用Fiffler抓包,可以看到Content-Type为text/html。
抓
响应中的 Content-Type 常⻅取值有以下⼏种:

  • text/html : body 数据格式是 HTML。
  • text/css : body 数据格式是 CSS。
  • application/javascript : body 数据格式是 JavaScript。
  • application/json : body 数据格式是 JSON。

如果请求的是js⽂件, 那么Spring MVC会⾃动设置Content-Type为 application/javascript。
如果请求的是css⽂件, 那么SpringMVC会⾃动设置Content-Type为 text/css。

2.4 返回JSON

    @RequestMapping("/returnJosn")
    @ResponseBody
    public HashMap<String,String> josn(){
        HashMap<String,String> map = new HashMap<>();
        map.put("Java","Java V");
        map.put("Mysql","Mysql V");
        return map;
    }

响应:
Josn
JOSN内也是键值对,可以使用map。

2.5 设置状态码

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

直接设置即可:
抓包:
401

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端Vue页面中如何展示本地图片

<el-table :data"tableData" stripe style"width: 100%"><el-table-column prop"imgUrl" label"图片"><template v-slot"scope"><img :src "http://localhost:8888/image/ scope.row.imgUrl&qu…

基于springboot实现网吧管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现网吧管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#x…

2023上半年系统集成项目管理工程师下午真题

文章目录 一&#xff1a;第5章 项目立项管理。第7章 项目范围管理&#xff0c;需求文件二&#xff1a;第9章 项目成本管理。第8章 项目进度管理&#xff0c;压缩工期三&#xff1a;第15章 信息&#xff08;文档&#xff09;和配置管理四&#xff1a;第18章 项目风险管理&#x…

【Java 进阶篇】Java Request 请求转发详解

在Java Web开发中&#xff0c;请求转发&#xff08;Request Forwarding&#xff09;是一种常见的技术&#xff0c;用于将请求从一个Servlet转发到另一个Servlet或JSP页面。这种技术在Web应用程序中起着非常重要的作用&#xff0c;可以用于实现模块化、重用代码以及构建更加灵活…

多输入多输出 | Matlab实现k-means-LSTM(k均值聚类结合长短期记忆神经网络)多输入多输出组合预测

多输入多输出 | Matlab实现k-means-LSTM&#xff08;k均值聚类结合长短期记忆神经网络&#xff09;多输入多输出组合预测 目录 多输入多输出 | Matlab实现k-means-LSTM&#xff08;k均值聚类结合长短期记忆神经网络&#xff09;多输入多输出组合预测预测效果基本描述程序设计参…

设计模式(19)命令模式

一、介绍&#xff1a; 1、定义&#xff1a;命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使你可以使用不同的请求对客户端进行参数化。命令模式还支持请求的排队、记录日志、撤销操作等功能。 2、组…

Ubuntu 23.10(Mantic Minotaur)正式发布,支持Linux 6.5和GNOME 45

导读Canonical 近日正式发布了 Ubuntu 23.10&#xff08;Mantic Minotaur&#xff09;操作系统&#xff0c;其中包含一些最新的 GNU/Linux 技术、改进的硬件支持以及许多其他变化。 Ubuntu 23.10 采用了最新的 Linux 6.5 内核系列&#xff0c;并为 Ubuntu 桌面和服务器增强了 z…

BI是什么?想要了解BI需要从哪些方面入手?

企业为了执行数字化战略&#xff0c;实行数字化转型&#xff0c;实现数据价值&#xff0c;除了需要相关数字化技术及理念、人才等&#xff0c;还需要借助数字化相关应用&#xff0c;例如商业世界中广受企业欢迎的ERP、OA、CRM等业务信息系统&#xff0c;以及上升势头非常迅猛的…

Powershell脚本自动备份dhcp数据库

文章目录 为什么要备份DHCP数据库呢&#xff1f;在PowerShell中自动备份DHCP数据库1&#xff0c;创建备份目录2&#xff0c;判断备份路径是否存在3&#xff0c;备份DHCP数据库4&#xff0c;完整自动备份脚本5&#xff0c;安排定期备份 推荐阅读 为什么要备份DHCP数据库呢&#…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-屏幕监控

红队专题 招募六边形战士队员[24]屏幕监控-(1)屏幕查看与控制技术的讲解图像压缩算法图像数据转换其他 [25]---屏幕监控(2)查看屏幕的实现 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [24]屏幕监控-(1)屏幕查看与控制技术的讲解 屏幕…

CV计算机视觉每日开源代码Paper with code速览-2023.10.27

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】&#xff08;Ne…

前端实现埋点监控

前端实现埋点&监控 实现埋点功能的意义主要体现在以下几个方面&#xff1a; 数据采集&#xff1a;埋点是数据采集领域&#xff08;尤其是用户行为数据采集领域&#xff09;的术语&#xff0c;它针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。通过埋…

附录B 其他第三方软件移植(FTP、OpenSSH、GDB)

目录 开发板 FTP 服务器移植与搭建vsftpd 源码下载vsftpd 移植vsftpd 服务器测试配置vsftpd添加新用户Filezilla 连接测试 开发板 OpenSSH 移植与使用OpenSSH 简介OpenSSH 移植OpenSSH 源码获取移植zlib 库移植openssl 库移植openssh 库 openssh 设置openssh 使用ssh 登录scp 命…

利用Excel支持JUnit参数化测试

在JUnit里面&#xff0c;可以使用CsvFileSource读取csv文件进行参数化测试&#xff0c;可是CSV文件不支持格式&#xff0c;编辑颇为麻烦&#xff0c;尤其是多次编辑&#xff0c;因此自然想到是否可以使用Excel文件&#xff0c;可以有各种格式&#xff0c;支持各类数据。 最新开…

常见面试题-MySQL专栏(一)

为什么 mysql 删了行记录&#xff0c;反而磁盘空间没有减少&#xff1f; 答&#xff1a; 在 mysql 中&#xff0c;当使用 delete 删除数据时&#xff0c;mysql 会将删除的数据标记为已删除&#xff0c;但是并不去磁盘上真正进行删除&#xff0c;而是在需要使用这片存储空间时&…

(速进)完美解决“用户在命令行上发出了 EULAS_AGREED=1,表示不接受许可协议。”以及“此产品安装程序不支持降级”

安装VMware时候&#xff0c;出现以下两种情况的原因是&#xff1a;未彻底卸载&#xff08;之前安装过VMware&#xff09;&#xff0c;例如&#xff1a;还有相关配置信息、注册表信息等。只要彻底清理就可以解决此问题。 网上很多帖子使用了powershell里的命令 例如&#xff1…

基于 matplotlib 实现的基本排序算法的动态可视化项目源码,通过 pyaudio 增加音效,冒泡、选择、插入、快速等排序

基本排序算法动态可视化 依托 matplotlib 实现的基本排序算法的动态可视化&#xff0c;并通过 pyaudio 增加音效。 安装 在使用之前请先检查本地是否存在以下库&#xff1a; matplotlibpyaudiofire requirements.txt 中包含了上述的库 使用 目前本项目仅提供了以下排序算…

【Java网络原理】 六

本文主要介绍了网络层的IP协议/NAT机制/IPv6的由来以及在数据链路层涉及到的以太网协议和DNS域名解析系统 一.网络层 1.IP协议 各个字段所表示的含义 >4位版本号 用来表示IP协议的版本&#xff0c;现在只有两个版本IPv4 &#xff0c;IPv6 >4位首部长度 IP报头可变&…

ZYNQ连载02-开发环境

ZYNQ连载02-开发环境 1. 官方文档 ZYNQ开发使用的软件为Vivado/Vitis/PetaLinux,软件体积比较大&#xff0c;硬盘保留100G以上的空间&#xff0c;赛灵思提供详细的文档&#xff0c;链接如下&#xff1a; ZYNQ文档 2. Vivido和Vitis安装 赛灵思统一安装程序 3. PetaLinux安装…

设计模式面试知识点总结

文章目录 设计原则常用设计模式单例模式1. 饿汉式2. 懒汉式3. 双重检测 工厂方法模式&#xff08;简单工厂、工厂方法、抽象工厂&#xff09;简单工厂静态工厂工厂方法模式抽象工厂模式 策略模式责任链模式 设计原则 标记设计模式原则名称简单定义OCP开闭原则对扩展开放&#…