Spring MVC2

在Spring MVC1中,我们知道了MVC的定义,同时也知道了@RequestMapping和@RestController这个注解的作用。

本篇文章,我们将学习使用Spring MVC获取请求参数和返回不同的响应等等

请求

传递单个参数

如图所示,创建RequestController类:

 在类中实现传递单个参数:

@RestController
public class RequestController {@RequestMapping("/r1")public String r1(String name){return "获取参数"+name;}
}

我们可以使用Postman对代码进行测试 :

传int和Integer对比(传错误类型和不传参数):

传递Integer:

  @RequestMapping("/r2")public String r2(Integer num){return "获取参数"+num;}

传递int:

   @RequestMapping("/r3")public String r3(int num){return "获取参数"+num;}

可以看到在不传参时int直接报了个500(500属于客户端的问题,是要我们后端开发人员负责的),因此在实际开发中建议多使用包装类型

传递多个参数

@RequestMapping("/r4")public String r4(String name,Integer age){return "获取参数:"+name+" age:"+age;}

Postman测试: 

传递对象 

当我们需要传递两个以上的参数时,就可以使用对象来进行传递,使代码更加简洁。

先在目录下创建一个学生类:

public class Student {private String name;private Integer age;private Integer id;
}

我们可以使用Lombok的@Data注解来减少Getter和Setter方法的书写:

首先,我们需要在pom.xml中添加Lombok的依赖,这里建议使用插件进行添加: 在pom.xml文件中右键-生成:

选中我们刚才安装的插件:

 

继续按图示点击,然后OK即可: 回到刚才的Student代码处,添加上@Data注解。

@Data
public class Student {private String name;private Integer age;private Integer id;
}

这是Lombok中所包含的一些其他注解: @Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsContryctor

    @RequestMapping("/r5")public String r5(Student student){return student.toString();}
}

测试: 

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

后端参数映射需要使用@RequestParam这个注解:

    @RequestMapping("/r6")public String r6(@RequestParam("name")String userName){return "获取参数"+userName;}

测试: 

传递数组

    @RequestMapping("/r7")public String r7(int[] arr){return Arrays.toString(arr);}

测试:

方式1: 
方式2: 

传递集合

    @RequestMapping("/r8")public String r8(@RequestParam List<String> list){return list.toString();}

 测试:

方式1:
方式2:

传递Json对象

传递Json对象需要使用@RequestBody这个注解

    @RequestMapping("/r10")public String r10(@RequestBody Student student){return student.toString();}

测试: 

Json字符串转对象和对象转字符串

代码:

public class TestJson {public static void main(String[] args) throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();//json字符串转对象String jsonstr = "{\"name\":\"张三\",\"age\":15,\"id\":5}";Student student = mapper.readValue(jsonstr,Student.class);System.out.println(student);//json对象转字符串String s = mapper.writeValueAsString(student);System.out.println(s);}
}

 运行结果:

传递URL中的对象

注意这里的参数一个都不能少,Spring是无法识别出缺失的参数的。 

    @RequestMapping("r9/{name}/{age}")public String r9(@PathVariable("name")String userName,@PathVariable Integer age){return "获取参数:"+userName+" age:"+age;}

测试: 

 传递文件

这里的注解@RequestPart可加也可不加。

   @RequestMapping("/r11")public String r11(MultipartFile file){return file.getOriginalFilename();}

测试: 

获取Cookie

Spring中内置了HttpSeverletRequest和HttpSeverletResponse两个对象(这两个对象包含了Http请求/响应中的所有属性)。因为Cookie一般是在请求中的,所以我们可以通过HttpSeverletRequest来获取到Cookie。

方式1: 
    @RequestMapping("/getC1")public String getCookie1(HttpServletRequest request){Cookie[] cookies = request.getCookies();if(cookies != null){Arrays.stream(cookies).forEach((ck)->{System.out.println(ck.getName()+":"+ck.getValue());});}return "获取cookie成功";}

点击这里创建一个Cookie: 输入127.0.0.1后Add Domain即可:

点击这里创建Cookie:

测试:

方式2:
 @RequestMapping("/getC2")public String getCookie2(@CookieValue("xmy") String xmy){return xmy;}

测试:

设置Session

方式1:
    @RequestMapping("/setSess")public String setSess(HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("name","zhangsan");return "设置session成功";}
方式2:
  @RequestMapping("/setSess1")public String setSess1(HttpSession session) {session.setAttribute("name","zhangsan");return "设置session成功";}

获取Session 

方式1:
    @RequestMapping("/getSess1")public String getSess1(HttpServletRequest request){HttpSession session = request.getSession();String name = (String) session.getAttribute("name");return name;}

测试:

 方式2:
   @RequestMapping("/getSess2")public String getSess2(HttpSession session){String name = (String) session.getAttribute("name");return name;}

测试:

 方式3:
    @RequestMapping("/getSess3")public String getSess3(@SessionAttribute("name")String name){return name;}

获取Header中的元素

这里我们获取的是Header中的User-Agent元素。

方式1:
 @RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){String header = request.getHeader("User-Agent");return header;}

测试:

 方式2:
    @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent")String header){return header;}

测试:

响应

返回静态页面

先在static目录下创建一个HTML文件: 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>我是一个标题</h1>
</body>
</html>

这里我们需要把类上面的@RestController变成@Controller,@Controller是定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理(返回的是视图),而@RestController = @ResponseBody(返回数据)+@Controller,因此RestController返回的是数据。

@Controller
public class ResponseController {@RequestMapping("/index")public String index(){return "/index.html";}

测试:

注意:因为在这里使用的是@Controller,所以我们后面需要返回数据的内容都要加上@ResponseBody 。

返回数据

@RequestMapping("/index2")@ResponseBodypublic String index2(){return "返回数据";}

测试: 

返回HTML代码片段

    //返回html@RequestMapping("/index3")@ResponseBodypublic String index3(){return "<h1>hello springmvc<h1>";}

 测试:

返回Json 

    //返回json@RequestMapping("/index4")@ResponseBodypublic HashMap<String,String> index4(){HashMap<String,String> map = new HashMap<>();map.put("k1","v1");map.put("k2","v2");map.put("k3","v3");map.put("k4","v4");return map;}

 测试:

设置状态码

设置状态码需要使用HttpSeverletResponse对象 

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

测试:

设置返回类型

//设置返回类型@RequestMapping(value = "return",produces = "applicatin/json")@ResponseBodypublic String returnJson(){return "{\"success\":true}";}

 测试:

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

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

相关文章

项目文章(IF:9.3)转录因子ChIP-seq助力揭示CsphyB-CsPIF4-CsBRC1模块调控ABA合成和腋芽生长发育

分枝生长是作物农业特性中的一项重要指标&#xff0c;它直接影响植株的结构和作物的产量。黄瓜&#xff08;学名&#xff1a;Cucumis sativus L.&#xff09;是一种在全球范围内具有重要经济价值和营养价值的重要蔬菜作物。在田间环境中&#xff0c;具有更多侧枝的黄瓜植株更受…

NSSCTF Web 一点学习

[SWPUCTF 2021 新生赛]jicao连接&#xff1a;利用hackbar&#xff0c;按照php的判断条件来得到flag[SWPUCTF 2021 新生赛]easyrce连接&#xff1a;url读取并且执行先用ls查看flag位置&#xff1a;找到了个看起来是flag的文件cat一下&#xff1a;得到flag[SWPUCTF 2021 新生赛]c…

【STM32项目】环境监测设计

✌️✌️大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是基于《基于STM32的环境监测设计》。 目录 1、系统功能 2.1、硬件清单 2.2、功能介绍 2.3、控制模式 2、演示视频和实物 3、系统设计框图 4、软件设计流程图 5、原理图 6、主…

不同系统记录项目进度不一致,如何统一口径

不同系统记录项目进度不一致&#xff0c;会造成项目管理混乱、信息混淆和决策失误。统一口径的方法包括&#xff1a;采用统一的项目管理平台、明确数据记录与更新规范、建立进度数据对接与整合机制。特别是采用统一的项目管理平台&#xff0c;通过统一的信息输入与输出渠道&…

玩转Docker | 使用Docker部署Drawnix在线白板工具

玩转Docker | 使用Docker部署Drawnix在线白板工具 前言一、Drawnix介绍Drawnix简介Drawnix主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Drawnix服务下载Drawnix镜像编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问Drawnix服务访…

Linux操作系统从入门到实战(九)Linux开发工具(中)自动化构建-make/Makefile知识讲解

Linux操作系统从入门到实战&#xff08;九&#xff09;Linux开发工具&#xff08;中&#xff09;自动化构建-make/Makefile前言一、 make/Makefile是什么&#xff1f;1. 我们先想个问题&#xff1a;手动编译代码有多麻烦&#xff1f;2. 为了解决麻烦&#xff0c;才有了自动化工…

开源b2b2c商城源码 支持多端适用 含完整代码包和图文搭建教程

在电商行业蓬勃发展的当下&#xff0c;b2b2c商城系统成为众多企业拓展业务版图的有力工具。这种支持自营与商家入驻并存的系统&#xff0c;含丰富平台商品种类&#xff0c;能通过多元化运营提升平台竞争力。本文分享一个开源b2b2c商城源码的相关知识&#xff0c;并详细介绍其搭…

Vue3入门-指令补充

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;vscode\node.js &#x1f680;所属专栏&#xff1a;Vue3 文章目录1. 指令修饰符1.1 按键修饰符1.2 事件修饰符1.3 v-model修饰符2. v-model用在其他表单元素上3. 样式绑定3.1 操作class4. 操作style5.…

UDP类型套接字

理解UDP协议&#xff1a;互联网世界的"明信片"通信 UDP是什么&#xff1f;为什么需要它&#xff1f; 想象一下&#xff0c;你正在给朋友寄送两种不同的东西&#xff1a;一份重要的合同文件和一叠度假时的风景明信片。对于合同文件&#xff0c;你会选择挂号信&#xf…

redis快速入门教程

更新中基本概念安装centOS安装redis&#xff1a;yum install redis -y启动&#xff1a;systemctl start redis设置开机启动&#xff1a;systemctl enable redis检查运行状态&#xff1a;systemctl status redis远程访问编辑配置文件 vi /etc/redis.conf在其中修改为bind 0.0.0.…

UDP和TCP的主要区别是什么

UDP&#xff08;用户数据报协议&#xff09;和 TCP&#xff08;传输控制协议&#xff09;是互联网传输层的两大核心协议&#xff0c;主要区别体现在​​连接方式、可靠性、传输效率、头部开销​​及​​适用场景​​上。以下是具体对比&#xff1a;​​一、核心区别对比表​​​…

ASP .NET Core 8结合JWT轻松实现身份验证和授权

身份验证和授权是每一个后端服务必不可少的&#xff0c;可以实现对非法请求进行拦截&#xff0c;能够有效保护数据的安全性。 JSON Web Token&#xff08;JWT&#xff09;是一项开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方法&#xff…

5G时代的智慧灯杆:塔能“一杆多用”方案如何激活城市新基建?

在《5G应用“扬帆”行动计划》持续推进的进程之中&#xff0c;智慧杆已然成为了5G基站部署环节极为重要的载体&#xff0c;并且被明确地归入到新型基础设施建设的重点范畴之内。相关政策提出&#xff0c;要在2025年达成重点区域5G网络全面且深度覆盖的目标&#xff0c;与此同时…

护照阅读器:国外证件识别的 OCR “解码师”

国外证件版式多样、语种繁杂&#xff0c;人工识别不仅耗时&#xff0c;还易因翻译误差、格式不熟悉导致信息错漏。尤其在跨境业务场景中&#xff0c;传统识别方式严重影响效率与准确性。护照阅读器搭载的 OCR 技术成为破局关键。它能精准提取国外护照、驾照等证件上的多语种文字…

Linux部署Python服务

1、创建项目目录与虚拟环境#确保安装 Python 和 python3-venv 工具 sudo apt update sudo apt install python3 python3-pip python3-venvmkdir myproject cd myproject python3 -m venv venv # 创建虚拟环境#Linux source venv/bin/activate # 激活虚拟环境#Windowds venv\S…

【Python办公】使用Python和Tkinter构建Excel数据导入MySQL工具(GUI版)

目录 专栏导读前言项目概述技术栈环境准备核心代码实现1. 导入必要的库2. 主应用类设计3. 用户界面设计数据库配置区域数据库选择区域4. 数据库连接功能测试连接获取数据库列表5. 数据导入功能关键技术点解析1. SQLAlchemy 2.x 兼容性2. MySQL 8.0 认证问题3. 避免启动时连接错…

华为OD机试_2025 B卷_猜数字(Python,100分)(附详细解题思路)

题目描述 一个人设定一组四码的数字作为谜底&#xff0c;另一方猜。 每猜一个数&#xff0c;出数者就要根据这个数字给出提示&#xff0c;提示以XAYB形式呈现&#xff0c;直到猜中位置。 其中X表示位置正确的数的个数&#xff08;数字正确且位置正确&#xff09;&#xff0c;而…

【网络安全】理解安全事件的“三分法”流程:应对警报的第一道防线

1. 简介 在网络安全领域&#xff0c;每天都会产生大量安全警报。作为一名安全分析师&#xff0c;识别、评估并优先处理这些警报的能力至关重要。三分法&#xff08;Triage&#xff09; 是确保安全团队高效响应安全事件的核心流程&#xff0c;它能够帮助我们合理分配资源、集中精…

AI大模型计数能力的深度剖析:从理论缺陷到技术改进

AI大模型计数能力的深度剖析&#xff1a;从理论缺陷到技术改进 AI大模型在计数任务上表现出明显的局限性&#xff0c;这不仅反映了模型架构的核心缺陷&#xff0c;也揭示了当前深度学习技术在处理结构化信息时的本质挑战。通过对文本计数、图像计数以及相关技术改进方向的全面分…

[C语言初阶]结构体初阶

目录一、结构体的声明二、结构体的定义和初始化三、结构体成员访问四、结构体传参五、函数调用的参数压栈&#xff08;了解&#xff09;在C语言中&#xff0c;我们知道数组是一组相同类型元素的集合&#xff0c;而结构体则更为灵活&#xff0c;它允许我们将不同类型的数据组合在…