当前位置: 首页 > news >正文

【JavaEE进阶】——Spring Web MVC (响应)

目录

🚩学习Spring MVC

🎈返回静态网页

🎈返回数据@ResponseBody

🎈返回html代码片段

🎈返回JSON

🎈设置状态码

 🎈设置Header


🚩学习Spring MVC

既然是 Web 框架, 那么当⽤⼾在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤⼾的请求, 并给予响应.
咱们学习Spring MVC, 重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互
主要分以下三个⽅⾯:
  • 1. 建⽴连接:将⽤⼾(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。
  • 2. 请求: ⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能.
  • 3. 响应: 执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾, 也就是响应.

⽐如⽤⼾去银⾏存款
  • 1. 建⽴连接: 去柜台
  • 2. 请求: 带着银⾏卡, ⾝份证去存款
  • 3. 响应: 银⾏返回⼀张存折.
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC

上一章我们学了用spring mvc进行从客户端发出的请求中获取参数的功能。

  • 1.传递数组  同一个请求参数有多个时,会自动封装成数组
  • 2.传递集合  @RequestParam
  • 3.传递JSON  @RequestBody  (最重要,将json语句转成对象)
  • 4.上传文件  @RequestPart 
  • 5.Cookie & Session & Header 

   <1>结合传统的获取方式

   <2>简洁获取方式(注解获取) 

          @CookieValue

          @SessionAttribute

          @RequestHeader

cookie和Session的区别,两者都是会话机制,会话就相当于对话,cookie是客户端机制,session是服务器机制,它们之间是由sessionId作为桥梁进行关联的。在Cookie中保存Session ID,然后服务器根据这个ID来管理和存取Session数据,从而平衡安全性和性能。


这一章通过学习spring MVC如何返回响应给客户端。


🎈返回静态网页

创建前端页面index.html,注意路径,路径是在src/main/resources/static路径下。

html前端代码:

后端代码:

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

返回的是index.html的视图

我们如何返回index.html中的数据呢?

我们就需要用到注解@RestController。

@RestController包含了@Controller和@ResponseBody,如果我们想返回视图就加上@Controller,如果我们想返回视图我们需要在@Controller的基础上加上@ResponseBody注解,因为@RestController是包含了@Controller和@ResponseBody注解,只有@RestController才能返回数据信息

单有@ResponseBody返回数据是不行的,我们需要@Controller告诉spring帮我们管理这个,后续我们要访问这段代码的时候,才能访问到。@Controller是类注解,能让spring管理着这个类,需要访问的时候,我们就可以访问。

综上所述:返回数据【@Controller+@ResponseBody】或者【@RestController】

                  返回视图   @Controller                                                                           

  • @Controller : 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
  • @ResponseBody : 定义返回的数据格式为⾮视图, 返回⼀个 text/html 信息
   @Target

@Target ({ElementType.TYPE})表示类类型(修饰的是对象)

@Retention(RetentionPolicy.RUNTIME)表示生命周期

@RestController

@Controller+@ResponseBody


🎈返回数据@ResponseBody

@ResponseBody可以修饰类也可以修饰方法。

  • 修饰类的时候,表示这个类下的所有方法,返回的均为数据

如果一个类中的所有方法返回的都是数据,我们就把这个注解加在类上。

  • 修饰方法时,表示该方法返回的是数据


🎈返回html代码片段

   @ResponseBody@RequestMapping("/returnHtml")public String returnHtml(){return "<h1>返回HTML代码片段<h1>";}


🎈返回JSON

  • 当我们接口返回的是String时,content-Type是text/html
  @ResponseBody@RequestMapping("/returnDate")public String returnIndex2(){return "查看视图需要的数据";}


  • 当我们的接口返回的是对象时,content-Type自动设置成application/json
    //返回JSON@ResponseBody@RequestMapping("/returnJson1")public Person returnJson(){Person person=new Person();person.setAge(20);person.setName("张老师");person.setId(1);return person;}


   @ResponseBody@RequestMapping("/returnJson2")public Map<Integer,String> returnJson2(){Map<Integer,String>map=new HashMap<>();map.put(1,"张三");map.put(2,"李四");map.put(3,"王五");return map;}


🎈设置状态码

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


 🎈设置Header

 @ResponseBody@RequestMapping(value = "/setHeader",produces = "application/json;charset=utf-8")public String setHeader(HttpServletResponse response){return "{\"ok\",1}";}

 


不生气,不吃醋,就开开心心的就好了。

相关文章:

【JavaEE进阶】——Spring Web MVC (响应)

目录 &#x1f6a9;学习Spring MVC &#x1f388;返回静态网页 &#x1f388;返回数据ResponseBody &#x1f388;返回html代码片段 &#x1f388;返回JSON &#x1f388;设置状态码 &#x1f388;设置Header &#x1f6a9;学习Spring MVC 既然是 Web 框架, 那么当⽤⼾在…...

基于springboot+vue的公司资产网站(全套)

一、系统架构 前端&#xff1a;vue2 | element-ui 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 管理后台-登录 02. 管理后台-首页 03. 管理后台-个人中心-修改密码 04. 管理后台-个人…...

Element-UI10分钟快速入门

Element-UI 是一个基于 Vue.js 的桌面端组件库&#xff0c;它为开发者提供了一套完整、易用、美观的组件解决方案&#xff0c;极大地提升了前端开发的效率和质量。以下是一个 Element-UI 的快速入门指南&#xff1a; 1. 安装 Element-UI 首先&#xff0c;确保你已经创建了一个…...

深入解析:如何在遍历List时安全地删除元素

什么是并发修改异常&#xff08;ConcurrentModificationException&#xff09; 在深入探讨解决方案之前&#xff0c;我们首先要理解什么是并发修改异常。当我们使用迭代器&#xff08;Iterator&#xff09;遍历一个List时&#xff0c;如果在迭代过程中结构被修改&#xff08;比…...

RT_Thread内核源码分析(一)——CM3内核和上下文切换

目录 一、程序存储分析 1.1 CM3内核寻址空间映射 1.2 程序静态存储和动态执行 二、CM3内核相关知识 2.1 操作模式和特权极别 2.2 环境相关寄存器 2.2.1 通用寄存器组&#xff0c; 2.2.2 状态寄存器组 2.2.3 模式切换环境自动保存 2.2.4 函数调用形参位置 2.3 …...

Android 13 高通设备热点低功耗模式

需求: Android设备开启热点,使Iphone设备连接,自动开启低数据模式 低数据模式: 低数据模式是一种在移动网络或Wi-Fi环境下,通过限制应用程序的数据使用、降低数据传输速率或禁用某些后台操作来减少数据流量消耗的优化模式。 这种模式主要用于节省数据流量费用,特别是…...

律所电子签章有效吗,怎么操作?

电子签章在很多国家和地区是合法有效的&#xff0c;但其有效性、使用条件和操作流程可能依据具体的法律法规而有所不同。在中国&#xff0c;随着《中华人民共和国电子签名法》的实施&#xff0c;电子签章在满足一定条件下是具有法律效力的。电子签章可以提高合同签订的效率&…...

详解 Scala 的变量、标识符、数据类型

一、注释 Scala 注释与 Java 一致 // 单行注释/** 多行注释*//*** 文档注释*/二、变量与常量 1. 语法 // 变量&#xff0c;类型可以省略 var varName:varClass value // 常量&#xff0c;类型可以省略 val valName:valClass value2. 案例 // 使用 var/val 才会在类中声明属…...

JVM-调优之-高内存占用问题排查

排查思路 1&#xff09;检查jvm内存的分配情况 2&#xff09;检查jvm的gc情况 3&#xff09; 找出占用量比较大的对象 第一步&#xff1a;jmap -heap PID 查看jvm内存使用情况 jmap -heap 2525 可以看到老年代年轻代等其他内存区域内存使用率百分比 第二步&#xff1a;jsta…...

全球排名第一的免费开源ERP:Odoo与微信集成的应用场景解析

概述 本文介绍了世界排名第一的开源免费企业应用软件Odoo ERP和企业微信、个人微信的各种对接功能。包括微信登录的对接、微信公众号的对接、微信消息的对接、微信支付的对接、微信打卡的对接、微信小程序的对接。 微信登录的对接 Odoo的登录&#xff0c;除了标准的用户名/密码…...

C++中的两类智能指针std::unique_ptr与std::shared_ptr

在C中&#xff0c;std::unique_ptr和std::shared_ptr是两种智能指针&#xff0c;用于管理动态分配的内存资源&#xff0c;避免内存泄漏和提高代码的安全性。它们之间有一些重要的区别&#xff0c;下面对它们进行简要比较&#xff1a; std::unique_ptr: 独占所有权&#xff1a…...

java中Future使用详细介绍

一、什么是Future&#xff1f; 在并发编程中&#xff0c;可以通过Future对象来异步获取结果。 使用Thread或runnable接口都不能获取异步的执行结果&#xff0c;因为他们没有返回值。而通过实现Callable接口和Future就可以获取异步执行的结果&#xff0c;当异步执行结束后&…...

docker和containerd的区别

docker和containerd的区别 1、容器运行时 1.1 容器运行时概念 容器运行时&#xff08;Container Runtime&#xff09;是一种负责在操作系统层面创建和管理容器的软件工具或组件。它是容器化技术的核心组件之一&#xff0c;用于在容器内部运行应用程序&#xff0c;并提供隔离…...

汇编实现流水灯

1.使能时钟&#xff1a; 1使能GPIO的外设时钟ldr r0,0x50000A28ldr r1,[r0]orr r1,r1,#(0x3<<4)//使能第&#xff14;&#xff0c;&#xff15;位str r1,[r0] 2.设置为输出模式 设置GPIOE10为输出模式ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1…...

SQL生成序列浅析

01.sqlserver版本 使用sqlserver将数据复制n条 selectt.indx,t.name,tmp.vlue from (values(1,苹果) ) as t(indx, name) ,(select[number] as vluefrom master.dbo.spt_valueswhere [type] pand [number] between 1 and 10 ) as tmpspt_values是什么 spt_values是SQL Se…...

24年gdcpc省赛C题

1279:DFS 序 先不考虑多节点,先看着颗二叉树,假设他们的父亲节点是第k个被访问的点,如果先访问左子树,那么得到的结果是a1*ka2*(k1)b1*(2k)b2*(2k1),可以发现,先访问左子树,那么右子树每次的乘以的p值实际上是左子树乘以的p值加上左子树的节点个数,比如a1*k和b1*(2k),如果不看2…...

以梦为马,不负韶华(3)-AGI在企业服务的应用

AGI在企业服务中&#xff0c;各应⽤已覆盖企业全流程&#xff0c;包含⼈⼒、法务、财税、流程⾃动化、知识管理和软件开发各领域。 由于⼤语⾔模型对⽂本处理类场景有着天然且直接的适配性&#xff0c;⽂本总结、⽂本内容⽣成、服务指引等发展起步早且应⽤成熟度更⾼。 在数据…...

Xshell 使用

Xshell 使用 ①xshell 安装包 ②xshell 卸载 ③xshell 同时控制多窗口 ①xshell 安装包 Xshell 7 破解版 ②xshell 卸载 第一步: 打开控制面板卸载xshell 第二步: win+R,输入regedit,打开注册表,删除xshell相关注册信息 注册表目录: 在下面两个目录中查找xshell相关…...

【yijiej】mysql报错 之 报错:Duplicate entry 字段 for key ‘表名.idx_字段’

一、问题操作 Mysql 进行insert 操作&#xff0c;报错&#xff1a;Duplicate entry 字段 for key ‘表名.idx_字段’ 原因解析&#xff1a;idx 是做的索引键&#xff0c;是具有唯一性二、问题原因&#xff08;三种情况&#xff0c;当前我遇到的情况是第一种&#xff09; 1、当 …...

解决npm卡死,无法安装依赖

npm卡死&#xff0c;无法安装依赖 异常描述原因分析与解决方法 异常描述 1.无法进入命令行&#xff0c;或是很慢没反应 2.装表格无限滚动的el-table-infinite-scroll依赖一上午了&#xff0c;也不能装&#xff0c;报错提示 原因分析与解决方法 1.命令行的问题&#xff1a;缓…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Selenium 查找页面元素的方式

Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素&#xff0c;以下是主要的定位方式&#xff1a; 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...