Spring第二课响应的完全,如何理解前后端互联
目录
一、响应
@Control,@RestController
1.Controller的源码,代表什么意思
2.返回数据 @Responsebody
3.返回HTML片段
4.返回JSON
5.那么假如我们使用集合会怎么样呢
设置状态码,虽然不影响展示,但是确实显示起来也就是401的情况。
2.我们可以看到默认的情况下,它是text/html,设置成application/json
设置标头(看响应,多个myhead)
前后端结合小案列
开发中程序报错,如何定位问题呢?
Cookie和Session的弊端
Cookie是客户端机制,Session是服务端机制
Cookie存在的问题是,他可以被伪造
Session存在的区别是分布式问题。
一、响应
@Control,@RestController
1.Controller的源码,代表什么意思
第一个Target后面的Type 表示注解后面可以接类,假如后面有method表示后面可以接方法
第二个是表示这个注解的生命周期
Spring这个东西可以被称为一个容器,可以简简单单加几个注解即可。
Controller的意思是告诉Spring,帮助我们管理这个代码,我们后续访问时候,才能访问到。
@ResponseBody告诉返回的是一个数据
@Control返回的是视图,随着前后端分离,后端开始不处理页面,就返回页面所需要的数据
@RestController=@Control+@ResponseBody的结果

2.返回数据 @Responsebody
可以修饰类,也可以修饰方法,修饰类的时候,表示这个类下的所有方法,返回的均是数据,修饰方法的时候,表示该方法返回的是数据,如果一个类的所有方法返回的都是数据,我们就把这个注解加在类上。
3.返回HTML片段
4.返回JSON
当接口返回的是String时,content-Type是text/html
当我们的接口返回的是对象时,content-Type application-JSON
5.那么假如我们使用集合会怎么样呢
设置状态码,虽然不影响展示,但是确实显示起来也就是401的情况。
@ResponseBody@RequestMapping("/setStatus")public String setStatus(HttpServletResponse response){//状态码不影响页面的展示response.setStatus(401);return "设置状态吗";}
2.我们可以看到默认的情况下,它是text/html,设置成application/json
@ResponseBody // @RequestMapping(value = "/r1",produces = "application/json;charset=utf-8") @RequestMapping(value="/r1")public String r1(HttpServletResponse response){return "{'OK':1}";}
我们可以通过指定的方式,来让这个变成application,可以设置返回类型。当然也不能强制转化成json不然也会报错。
consumes:指定处理请求的提交内容类型,例如application/json,text/html;如果指定application/json(更像是一个限制)
produces:设置返回的内容类型,仅当request请求头中的类型中包含该指定类型才返回。
@ResponseBody@RequestMapping(value = "/r1",produces = "application/json;charset=utf-8") //@RequestMapping(value="/r1")public String r1(HttpServletResponse response){return "{'OK':1}";}设置标头(看响应,多个myhead)
@ResponseBody@RequestMapping(value = "/r1",produces = "application/json;charset=utf-8") //@RequestMapping(value="/r1")public String r1(HttpServletResponse response){//设置header的方法response.setHeader("myhead","myhead");return "{'OK':1}";}
前后端结合小案列
前端的一个计算器代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body>
<form action="calc/sum" method="post"><h1>计算器</h1>数字1:<input name="num1" type="text"><br>数字2:<input name="num2" type="text"><br><input type="submit" value=" 点击相加 ">
</form>
</body></html>
对应着后端代码其中,name1的命名和name2命名,和form中name 保持一致
package com.example.demo;import org.springframework.boot.context.config.InactiveConfigDataAccessException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/calc")
@RestController
public class CalcController {@RequestMapping("/sum")public String sum(Integer num1,Integer num2){Integer sum=num1+num2;return "计算结果:"+sum;}}
开发中程序报错,如何定位问题呢?
通过日志 (打印日志,指的是在最开始就打印一个这种***看你的后端代码能否在执行之前打印出来,从而判定是不是后端有毛病) 请求是否到达后端
1.前端:f12看控制台
2.后端:看接口,控制台日志
还可以我们手动去测试接口,假如这样好使,就说明前端的问题。

我们在访问前端的过程时候,前面8080后面什么也不用接,直接加路径名字即可。

以下是两个前端代码
<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>用户登录首页</title>
</head><body>
登录人: <span id="loginUser"></span><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>//页面加载的时候,就应该去调用后端的请求了,ajax的执行顺序,看你写到哪里,上一个那个是在函数里面才被调用,但是这个是直接到了script也就是一加载,就会被调用的$.ajax({url:"/user/getUserInfo",type:"get",success :function (username){//放值就用text,不是放值,就去用html$("#loginUser").text(username)}})</script>
</body></html>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>登录页面</title>
</head><body>
<h1>用户登录</h1>
用户名:<input name="userName" type="text" id="userName"><br>
密码:<input name="password" type="password" id="password"><br>
<input type="button" value="登录" onclick="login()"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>//form表单使页面进行跳转,页面跳转要搭配后端来进行页面跳转的,因为我们后端不再搭配前端来进行显示了。所以用ajax完成页面的请求function login() {console.log("登录...")//这种就属于是加日志,它是为了检测是否到达了这个函数$.ajax({url:"/user/login",type:"post",data:{"userName":$("#userName").val(),"password":$("#password").val()},success:function (result){if(result){location.href="/index.html"//location.assign();}else{alert("密码错误");}}});}</script>
</body></html>
下面是对应的后端代码,要注意的是看后端的思想
package com.example.demo;import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")/*1.登录接口/user/loginuserName=?password=?接口返回:校验成功/失败 true密码正确false密码错误*/public Boolean login(String userName, String password, HttpSession session) {
// if(userName==null||userName.length()==0||password==null||password.length()==0){
// return false;
// }/*上面的过于麻烦,Spring为我们提供来一个好东西,去判断这个字符串有没有长度*/if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {return false;}//进行用户名和密码的校验,假装账号等于admin,密码也是adminif ("admin".equals(userName) && "admin".equals(password)) {//设置sessionsession.setAttribute("username", "admin");return true;}return false;}/*获取用户的登录信息/user/getUserInfo接口名称:当前登录用户的名称*//*@RequestMapping("/getUserInfo")public String getUserInfo(HttpSession session){//从session中获取登入用户String userName=(String) session.getAttribute("username");return userName;}*///下面这种方式更加规范,因为上面那种假如说没有session会自动创建一个session,但是假如说session创建了,他也是空的不影响问题。@RequestMapping("/getUserInfo")public String getUserInfo(HttpServletRequest request){//Session获取登录用户,下面这个方式就是,假如session不为空,那么他也就不会去创建一个sessionHttpSession session= request.getSession(false);String username=null;if(session!=null){username=(String) session.getAttribute("username");}return username;}
}
相关文章:
Spring第二课响应的完全,如何理解前后端互联
目录 一、响应 Control,RestController 1.Controller的源码,代表什么意思 2.返回数据 Responsebody 3.返回HTML片段 4.返回JSON 5.那么假如我们使用集合会怎么样呢 设置状态码,虽然不影响展示,但是确实显示起来也就是401的情况。 2.我…...
html实现各种瀑布流(附源码)
文章目录 1.设计来源1.1 动态响应瀑布流1.2 分页瀑布流1.3 响应瀑布流 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134613121 html实现各种瀑布流(附源码),…...
万字解析设计模式之责任链模式、状态模式
目录 一、责任链模式 1.1概述 1.2结构 1.3实现 1.4 优缺点 1.5应用场景 1.6源码解析 二、状态模式 2.1概述 2.2结构 2.3实现 2.4优缺点 2.5应用场景 三、责任链模式实验 任务描述 实现方式 编程要求 测试说明 四、状态模式实验 任务描述 实现方式 编程要…...
二十三种设计模式全面解析-深入探讨状态模式的高级应用技术:释放对象行为的无限可能
在软件开发中,状态管理是一个常见的挑战。当对象的行为随着内部状态的变化而变化时,有效地管理对象的状态和相应的行为变得至关重要。在这方面,状态模式提供了一种优雅而灵活的解决方案。它允许对象在运行时根据内部状态的改变而改变其行为&a…...
论文笔记--Toolformer: Language Models Can Teach Themselves to Use Tools
论文笔记--Toolformer: Language Models Can Teach Themselves to Use Tools 1. 文章简介2. 文章概括3 文章重点技术3.1 Toolformer3.2 APIs 4. 文章亮点5. 原文传送门 1. 文章简介 标题:Toolformer: Language Models Can Teach Themselves to Use Tools作者&#…...
stm32实现0.96oled图片显示,菜单功能
stm32实现0.96oled图片显示,菜单功能 功能展示简介代码介绍oled.coled.holedfont.h(字库文件)main函数 代码思路讲解 本期内容,我们将学习0.96寸oled的进阶使用,展示图片,实现菜单切换等功能,关…...
sqlite外键约束 保证数据一致性
1. 外键约束 在SQLite中,可以通过使用外键(Foreign Key)约束和CASCADE选项来实现通过外键删除相关信息。 CASCADE选项是指在主键表中删除记录时,相应的外键表中的相关记录也将被自动删除。 -- 创建主键表 CREATE TABLE Persons…...
Vue轻松入门,附带学习笔记和相关案例
目录 案例 一Vue基础 什么是Vue? 补充:mvvm框架 mvvm的组成 详解 Vue的使用方法 1.直接下载并引入 2.通过 CDN 使用 Vue 3.通过npm安装 4.使用Vue CLI创建项目 二插值表达式 什么是插值表达式? 插值表达式的缺点 解决方法 …...
【青蛙跳台阶问题 —— (三种算法)】
青蛙跳台阶问题 —— (三种算法) 一.题目介绍1.1.题目1.2.图示 二.解题思路三.题解及其相关算法3.1.递归分治法3.2.动态规划算法(Dynamic Programming)3.3.斐波那契数列法 四.注意细节 一.题目介绍 1.1.题目 一只青蛙一次可以跳上1级台阶&am…...
联想yoga AMD处理器 转接头无法电量外接显示器
第一次买AMD的处理器,当时就是为了yogaAMD这款的接口要比英特尔的接口多,没想到AMD处理器真的问题多。经常蓝屏不说,偶尔还点不亮外接显示器。遇到这种问题,不是什么驱动问题,可能你按照网上各种方法打开设备管理器→显…...
OSG粒子系统与阴影 - 阴影shadow(7)
OSG阴影 在虚拟现实仿真中,为了真实地模拟自然效果,阴影效果是不可缺少的,它对一个场景的真实性是非常重要的。在游戏或仿真中,一个高效的阴影往往能够提供非常强悍的视觉真实感。 osgShadow库 在OSG中专门定义了一个名字空间osg…...
vue3项目中使用富文本编辑器
前言 适配 Vue3 的富文本插件不多,我看了很多插件官网,也有很多写的非常棒的,有UI非常优雅让人耳目一新的,也有功能非常全面的。 如: Quill,简单易用,功能全面。editorjs,UI极其优…...
Java EE 进程线程
JavaEE 进程&线程 文章目录 JavaEE 进程&线程1. 进程1.1 概念1.2 进程管理1.3 PCB (Process Control Block) 2. 线程2.1 概念2.1 线程与进程的区别2.3 创建线程 1. 进程 1.1 概念 什么是进程? 进程是操作系统对一个正在执行的程序的一种抽象 我们可以打开…...
GPT写SQL的模版
表:profit_loss_sum_m_snapshot 计算字段:成本cost_whole求和,收入income_whole求和,收入求和-成本求和,成本目标cost_target求和,收入求和-成本目标求和 条件:日期statis_date在2023-11-01&…...
蓝桥杯官网练习题(平均)
问题描述 有一个长度为 n 的数组( n 是 10 的倍数),每个数 ai 都是区间 [0,9] 中的整数。小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为 bi,他想更改若干个数的值使得这 10 种数出现的次数相等…...
【无标题】动手学深度学习_现代神经网络_未完
这里写目录标题 深度学习之前的网络 AlexNetAlexNet得到了竞赛冠军AlexNet架构Alex net更多细节数据增强 VGGNiN知识补充flop暂退法 drop_out 深度学习之前的网络 1、核方法 机器学习 SVM现在还是很广泛的使用,因为对调参的需求不那么大,对调参不太敏感…...
Java王者荣耀
GameFrame 图片 package 王者荣耀;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;import javax.soun…...
【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令
🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言:你只管努力,剩下的交给时间! 目录 🍠操作寄存器实现UART🍟UART原理🍟编程 🍠…...
python 左值查找 右值查找
左值查找 在一组数据中查找出 数字x 在这组数据中第一次出现的索引并输出,没有找到则输出-1查找方式:二分查找 数据前提:一组数据要有序一组数据: arr [2, 3, 3, 3, 5, 7, 9, 11, 13, 15, 17]测试: 示例1ÿ…...
机器学习之自监督学习(四)MoCo系列翻译与总结(二)
MoCo中相关工作的对比分析 去噪自动编码器(Denoising Autoencoder)是一种用于学习数据表示的神经网络模型。它的主要目标是通过去除输入数据中的噪声,学习到输入数据的有用表示,从而提高模型对干净数据的鲁棒性。下面是对去噪自动…...
tao-8k嵌入模型实战效果:基于Xinference的文本聚类与去重案例
tao-8k嵌入模型实战效果:基于Xinference的文本聚类与去重案例 1. 引言:从海量文本中快速找到“同类项” 想象一下,你手头有成千上万条用户评论、新闻摘要或产品描述。你想知道哪些内容是相似的,哪些是重复的,或者想把…...
Ubuntu家族大比拼:Gnome、KDE与Xfce桌面环境全解析
1. Ubuntu家族三剑客:Gnome、KDE与Xfce的定位差异 第一次接触Ubuntu系列发行版的朋友,往往会被各种"*buntu"搞得晕头转向。我自己刚入门时也分不清Kubuntu和Xubuntu的区别,直到把三个系统都装了一遍才发现:它们的内核和…...
我的数字记忆宝库:用m4s-converter守护那些即将消失的美好
我的数字记忆宝库:用m4s-converter守护那些即将消失的美好 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 去年冬天,我整…...
避坑指南:Raspberry Pi5安装LineageOS21常见问题全解(SSD启动/存储扩容/Play商店报错)
Raspberry Pi5安装LineageOS 21避坑指南:从SSD启动到Play商店认证全流程解析 当Raspberry Pi5遇上LineageOS 21,这个组合让单板计算机瞬间变身高性能Android设备。但实际安装过程中,从存储介质选择到Google服务集成,每个环节都可能…...
LS-Dyna模态分析实战:从模型构建到结果解读的全流程指南
1. 认识LS-Dyna模态分析:为什么它值得掌握 我第一次接触LS-Dyna模态分析是在一个汽车零部件振动问题排查项目中。当时客户抱怨某款发动机支架在特定转速下会出现异常噪音,我们团队花了三天时间都没找到症结所在。直到用LS-Dyna做了模态分析,才…...
WarcraftHelper终极指南:快速解决魔兽争霸III 5大兼容性问题
WarcraftHelper终极指南:快速解决魔兽争霸III 5大兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III在新系…...
QWEN-AUDIO企业实操:金融产品语音说明书自动化生成
QWEN-AUDIO企业实操:金融产品语音说明书自动化生成 你有没有想过,金融产品那些复杂的说明书,如果能用语音讲给客户听,该有多好?客户不用再费力阅读密密麻麻的条款,开车、做家务时就能轻松了解产品。但问题…...
带行星传动装置的电动螺旋拆卸器设计【说明书 cad图纸 solidworks三维】
在机械维修与设备拆解领域,传统工具常因扭矩不足或操作空间受限,导致螺栓卡滞、部件损坏等问题。带行星传动装置的电动螺旋拆卸器通过集成行星齿轮系统与电动驱动模块,有效解决了这一痛点。其核心作用在于利用行星齿轮的行星轮系结构…...
保姆级教程:用Python复现DMP动态运动基元,手把手验证收敛性(附完整代码)
从零实现DMP动态运动基元:Python代码实战与收敛性可视化分析 在机器人运动控制领域,动态运动基元(Dynamic Movement Primitives, DMP)因其出色的轨迹生成能力和稳定的收敛特性,已成为模仿学习的核心算法之一。本文将带您用Python完整实现DMP…...
数据库关系演算实战:元组演算与域演算的5个典型查询案例解析
数据库关系演算实战:元组演算与域演算的5个典型查询案例解析 在数据库理论中,关系演算是一种声明式的查询语言,它允许用户描述想要获取的数据,而不需要指定如何获取这些数据。关系演算主要分为两种形式:元组关系演算和…...










