SpringMVC--记录学习历程
1. SpringMVC
1.1 SpringMVC介绍
介绍:Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。
SpringMVC框架主要功能:实现前后端的交互
交互:
1. 前端通过http请求可以携带参数访问后端服务器 请求
1. 后端服务器可以将结果通过响应交给前端 响应
1.2 SpringMVC入门案例
关于Tomcat服务端口说明
SpringMVC框架使用需要借助tomcat服务器. 默认端口号8080. 可以随意修改.
# 应用名称
spring.application.name=springmvc_demo1
# 应用服务 WEB 访问端口
server.port=8080
SpringMVC入门案例hello
@Controller //将类交给SpringMVC管理,SpringMVC交给Spring管理
@ResponseBody//将数据转化为”特殊的字符串“返回
public class UserController {/*** URL地址:http://localhost:8080/hello get请求* http://localhost:8080/dog get请求* http://localhost:8080/cat get请求* 参数: 无* 返回值: 你好,SpringMVC!*/@RequestMapping("/hello")public String hello(){return "你好,SpringMVC!";}
}
框架之间的关系图
1.3 SpringMVC参数接收
简单参数传递
/*** 需求:查询后端数据 参数2个数据 name=tomcat,age=18* URL :http://localhost:8080/findUserByNA?name=tomcat&age=18* 返回值:数据正确:name:age* 知识点:* 1.通过URL中的key获取数据**/@RequestMapping("/findUserByNA")public String findUserByNA(String name,int age){return "数据正确:"+name+":"+age;}
对象方式传参
编辑pojo
说明:
- 属性类型必须为包装类型
- pojo必须添加get/set方法
- pojo必须实现序列化接口
/*** 需求:查询后端数据 参数多个数据 id=20,name=tomcat,age=18,sex=男* URL :http://localhost:8080/findUserByNA?id=20&name=tomcat&age=18&sex=男* 返回值:user.toSting 字符串* 知识点:* 2.如果参数众多则可以采用对象的方式接受(必须得有set相对的方法)*/@RequestMapping("/findUserByNA2")public String findUserByNA2(User user){return user.toString();}
同名参数提交
案例说明
说明: 如果遇到同名提交问题,数据一般采用**,**号的方式连接.
/*** URL:http://localhost:8080/hobby?hobby=敲代码,睡觉,玩游戏,熬夜* 参数: hobby=敲代码,睡觉,玩游戏,熬夜* 返回值:获取的参数返回即可* 知识点:如果遇到同名提交问题,则SpringMVC可以采用数组接受,内部自动完成分割* 底层实现:hobby.split(",")*/@RequestMapping("/hobby")public String hobby(String[] hobby){return Arrays.toString(hobby);}
1.4 restFul风格
传统的get方式
URL:http://localhost:8080/findUser?name=tomcat&age=18
URL:http://localhost:8080/findUser?id=100&name=tomcat&age=18&sex=男
需求:上述参数的传递是否可以简化?
简化写法:
URL:http://localhost:8080/findUser/100/tomcat/18/&男
restFul风格说明
要求:
- restFul的风格数据位置一旦确定,不能修改
- 参数与参数之间使用"/"的方式风格
- restFul的风格适用于get/post/put/delete 请求类型
请求类型种类:get/post/put/delete
/*** URL:http://localhost:8080/findUser/100/tomcat/18/&男* 参数:tomcat/18/男* 返回值:* restFul语法:* 1.参数与参数之间使用“/”分割* 2.需要接收的参数使用{}包裹* 3.参数接收时采用@PathVariable* 简写:如果{name}的属性与对象的属性名称一直,则可以使用对象接收* 调用对象的set方法,为属性赋值*/@RequestMapping("/findUser/{name}/{age}/{sex}")public String findUser(@PathVariable String name ,@PathVariable int age ,@PathVariable String sex ) {return name+age+sex;}@RequestMapping("/findUser1/{name}/{age}/{sex}")public String findUser1(User user ) {return user.toString();}
1.5 JSON
JSON介绍
JSON是一种轻量级的数据交换格式
基本数据格式
JOSN格式–对象格式
对象(object) 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
{id="18",name="张三"}
JSON–数组格式
数组(array) 是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
[100,200,300]
["张三","李四","王五"]
JOSN格式–嵌套格式
值(value) 可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
[100,true,"冇得问题",{"id":"10086","name":"中国移动","method":["语音","短信","上网"]},[10086,{"id":"10010","name":"中国联通"},{"id":"10001","name":"中国电信"}]]
1.6 SpringMVC前后端交互
业务说明
问题说明1:前端访问后端服务器,一般采用Ajax方式进行数据的传递。后端服务器返回给前端页面,通常采用JSON格式数据
问题说明2:后端服务器怎么接受前端参数的–servlet机制
问题:后端服务器如何返回JOSN
/*** URL:http://localhost:8080/findJSON?name=tomcat&age=18* 参数:name=tomcat&age=18* 返回值:User对象JSON* 知识点:* 1.@ResponseBody//将返回值转化为JSON串的* 2.如果返回String类型,则@ResponseBody将字符串本身返回前端*/@RequestMapping("/findJSON")@ResponseBody//将返回值转化为JSON串的public User findJSON(User user){user.setId(100);user.setSex("男");return user;}
- @ResponseBody 将返回值转化为json串
- @RestController 将当前类的所有返回值转化为json串
2. Ajax
项目环境的搭建
IDEA: HbuilderX:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T168MFaC-1638533419888)(D:\notes\img\3.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LNBCczGJ-1638533419891)(D:\notes\img\4.png)]
1 Ajax介绍
功能和作用:Ajax主要实现前后端交互,提高用户页面与服务器之间的效率
特点:局部刷新,异步访问
2 Ajax异步原理说明
组成部分:
1. 用户
2.**Ajax引擎--代理**
3. 服务器
异步的特点:
- 由Ajax引擎直接访问后端服务器
- 在回调函数没有执行之前,用户可以执行自己的任务----异步
3 入门案例
<html><head><meta charset="utf-8"><title></title><script src="../js/axios.js"></script></head><body><h1>Axios测试案例-1</h1><script>/** 1.可以编辑Axios 发送ajax请求* 2.不同的服务器之间发送ajax请求时会有“跨域”问题* 3.解决跨域问题 通过注解搞定@CrossOrigin* var关键字没有作用域的概念!!!* let相当于var 有作用域 更安全* const 定义常量的* 关于axios数据返回值对象的说明:* axios为了接收后端服务器的数据,利用promise对象封装参数*/let url="http://localhost:8080/hello"axios.get(url).then(function(result){//回调函数console.log(result)}) </script></body>
</html>
4 关于请求异常
- 405异常 ajax的请求类型与后端接收的请求类型不匹配
- 400异常 参数类型不匹配
- 404异常 请求路径找不到
Axios
1 . Axios post提交
- form表单提交 method=“post” 同步(要素:页面是否刷新)
- axios.post() 异步操作
2. 编辑js
let url1="http://localhost:8080/axios/saveUser"
let user1={id:100,name:"尿尿",age:2,sex:"母"}axios.post(url1,user1).then(function(promise){console.log(promise.data)})
3. 编辑AxiosController
/*** URL="http://localhost:8080/axios/saveUser"* 参数:{id: 100, name: "尿尿", age: 2, sex: "母"}* 返回值:“新增用户成功!!!”* 难点:* 1.Get请求数据通过?key=value1&key2=value2的方式获取* Post请求 数据是json串 数据结构不同 所以不能使用User对象接收* 2.JSON串 想办法转化为User对象* User转换为JSON串 @ResponseBody* JSON串转换为User @RequestBody* 3.JSON串转化 要求json串中的属性与对象中的属性一致,并且赋值时调用对象的set方法* 4.@RequestMapping 可以支持任意类型的请求* 改进:只接收支持的类型* @PostMapping* @GetMapping * @DeleteMapping* @PutMapping*///@RequestMapping(value="/saveUser",method = RequestMethod.POST)@PostMapping("/saveUser")public String saveUser(@RequestBody User user){System.out.println(user);return "新增用户成功!!!";}
4. 请求类型与业务的关系
常见的请求类型:
Get 查询操作
Delete 删除操作 用法相同
Post 1.表单数据提交 2.新增操作
Put 修改操作 用法相同
3. 前后端交互案例
3.1 Axios-Get请求
3.1 业务需求说明
需求:根据ID查询信息
URL地址:http://localhost:8080/axios/getUserById?id=100
参数:id = 100
返回值:User对象的JSON 伪造一个User对象
3.1.1 编辑后端Controller
@RestController
@CrossOrigin //主要解决跨域问题
@RequestMapping("/axios")
public class AxiosController {@RequestMapping("/getUserById")public User getUserById(Integer id){//根据Id查询数据库User user = new User();user.setId(id);user.setName("张三");user.setAge(18);user.setSex("男");return user;}
}
3.1.3 前端代码
<script>/**var关键字没有作用域的概念!!!* let相当于var 有作用域 更安全* const 定义常量的* 关于axios数据返回值对象的说明:* axios为了接收后端服务器的数据,利用promise对象封装参数* */ let url="http://localhost:8080/axios/getUserById?id=100";axios.get(url).then(function(promise){console.log(promise.data)})</script>
3.2 Axios-Get对象参数请求
3.2.1 业务需求说明
需求:根据ID查询信息
URL地址:http://localhost:8080/axios/getUserByNA?id=xxx&name=xxx
参数:id = xxx name=xxx
返回值:List [user1,user2]
3.2.2 编辑后端Controller
@RequestMapping("/getUserByNA")public List<User> getUserByNA(User user){List<User> list=new ArrayList();list.add(user);//简化赋值操作,直接返回list.add(user);return list;}
3.2.3 编辑前端
<script>/** 1.get请求,对象传参* 2.语法说明:* 关键字:{params:user2}*/let user2={name:"tomcat",age:"100"}let url2="http://localhost:8080/axios//getUserByNA";axios.get(url2,{params:user2}).then(function(promise){console.log(promise.data)})</script>
3.3 Axios-Get-restFul结构
3.3.1 业务需求说明
需求:查询name=tomcat sex=“男” 的用户 要求请采用restFul的风格实现数据获取
URL:http://localhost:8080/axios/findUserByNS/tomcat/男
参数:name/sex
返回值:List
3.3.2 编辑后端Controller
@RequestMapping("/findUserByNS/{name}/{sex}")//调用set的方法为属性赋值public List<User> findUserByNS(User user){List<User> list = new ArrayList<>();list.add(user);list.add(user);return list;}
3.3.3 编辑前端
<script>/*** 需求:利用* URL:http://localhost:8080/axios/findUserByNS/tomcat/男* 难点:* 1.tomct/男 直接写死在url地址中,后期扩展不方便* 模板字符串写法:ES6引入的新功能* 语法:* 1.使用反引号 ``* 2.作用:* 1.可以保证字符串的格式* 2.可以动态获取变量的值*/let user3={name:"tomcat",sex:"男"}let url3=`http://localhost:8080/axios//findUserByNS/${user3.name}/${user.sex}`;axios.get(url3).then(function(promise){console.log(promise.data)})
</script>
4. 前后端调用补充知识
1. axios简化写法
@RestController
@CrossOrigin //标识 跨域
@RequestMapping("/web")
public class webController {/*** URL:http://localhost:8080/web/hello* URL:http://localhost:8080/web/hello1* URL:http://localhost:8080/web/hello2* 类型:get* 返回值:String*/@GetMapping("/hello")public String hello(){return "好好学习,天天向上!";}
}
<html><head><meta charset="utf-8"><title>Axios测试</title><script src="../js/axios.js"></script></head><body><h1>Axios简化测试</h1><script>/*简化方式1:抽取后端服务器地址*/axios.defaults.baseURL="http://localhost:8080"/*简化方式2:箭头函数shiy如果参数只有一个可以省略括号*/// let url1="http://localhost:8080/web/hello"axios.get("/web/hello").then(promise=>{alert(promise.data)}) /**简化方式3:async await简化调用 重点*问题描述:如果ajax嵌套的层数较多,则引发“回调地狱”问题* 解决问题:能否将axios中的then进行简化。* 语法:* 1.使用async关键字标识函数* 2.通过await标识ajax请求* 3.必须同时出现*/async function getHello(){ //定义函数let {data:result}=await axios.get("/web/hello")alert(result)}//调用函数getHello()</script></body>
</html>
2. 跨域问题----@CrossOrigin
1. 同源策略
要素:
- 浏览器中URL地址:http://localhost:8848/webDemo/demo/3-axios.html
- Ajax请求的URL地址:http://localhost:8080/web/hello
要求:上述要素必须满足 协议/域名/端口号都相同时,表示满足同源策略
说明:如果满足同源策略,则称之为同域访问,反之称之为跨域访问 跨域访问浏览器一般都会出现报错
2. 关于跨域的案例讲解
案例1:
浏览器地址:http://localhost:8080/xx/xx
Ajax地址:https://localhost:8080/yy/yyy 跨域请求:协议不同
案例2:
域名与IP地址对应
浏览器地址:http://www.jt.com:8080/xx/xx
Ajax地址:http://172.233.5.123:8080/yy/yyy 跨域请求:域名不同
案例3:
浏览器地址:http://www.jt.com:/xx/xx
Ajax地址:http://www.jt.com:80/yy/yyy 同域请求:默认端口就是80
案例4:
浏览器地址:https://www.jt.com:443/xx/xx
Ajax地址:https://www.jt.com:/yy/yyy 同域请求:https协议默认是443端口
案例5:
迷惑:IP表示同意网段
浏览器地址:http://192.148.10.2:80/xx/xx
Ajax地址:http://192.168.11.2:80/yy/yyy 跨域请求!!!域名不同
3. 跨域解决方法
1. jsonp 方式跨域---淘汰了
1. CORS 跨域资源共享
总结:CORS要求在服务器端标识那个网站可以访问我–@CrossOrigin
SpringMVC--记录学习历程相关推荐
- ionic3学习历程(1)
因为最新版的ionic3国内资料比较少,对于小白学习踩了很多坑,现记录学习历程,以供参考. 如果你也是用的 typescript3+angular4+ionic3,去作为前端开发框架,你可以先学习 1 ...
- Web学习历程记录(七)——Tomcat
Web学习历程记录--Tomcat Web 静态Web资源 指Web页面中供人们浏览的数据始终是不变的 动态Web资源 指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容 ...
- PhotoShop学习历程以及网站分享
博主将开启为期两周的PhotoShop学习计划,今天是2021/7/25 仅仅是学习历程记录,与大家分享学习心得,分享觉得好的网站.如果有好的建议可以在底下留言,大家共同进步! 内容将 ...
- 我的首篇博客——记录学习,不忘初心
Hello,大家好!我是阿冰!今天是2022年12月2日,受疫情影响,我们学校的同学都早早的回家了,今天就是我回家的第五天.其实,这并不算是真正意义的寒假,因为过两天我们还有将近一个月的实训,大约到1 ...
- 【小白】【大学】一名嵌入式软件开发小白的单片机学习历程、心路历程、经验分享
我的嵌入式学习之路 我为什么写这篇文章 先简单介绍一下我自己 与每一个技术小白共勉 这篇文章写给谁 我的学习经验分享 我的成长之路 我的单片机学习历程分享 51系列单片机学习历程 预备知识:(可以查百 ...
- SpringMVC基础学习之Controller的两种实现方式和RequstMapping注解的使用
前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...
- 一个程序员的学习历程
一个程序员的学习历程 转眼工作已经四年多了,一直想找个时间总结一下,却迟迟懒得动手.今天一定要强迫自己写出来,不光是为了工作过的四年,也是为了和同样作技术的朋友和即将工作的学友一起共勉. 2000年从 ...
- Master-MatPyon:学习历程
日日思君不见君,共饮长江水. 希望能在这个地方记录自己的学习历程. 每一天我们都应该活得更有价值,活得更有意义. 信心远比努力更重要!!!
- MySQL必知必会学习历程(一)
MySQL必知必会学习历程(一) 前言 第1章 了解SQL 1.1 关键术语介绍 1.2 数据表解释实例 第2章 MySQL简介 2.1 关键术语介绍 2.2 安装mysql命令行实用程序(可选) 2 ...
- SpringMVC基础学习之Restful风格的简单使用
前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...
最新文章
- OpenResty学习中的几个小例子汇总
- LeetCode - 34. Search for a Range
- 一个球从100米高度自由落下,每次落地后反弹回原高度的一半; * 再落下,求在第几次之后反弹高度小于0.1米, * 并计算在这一次落地时共经过多少米?...
- Java I/O在Android中应用(一)
- java 反取字符串
- 最会数据分析的护士!全世界最有名的白衣天使是如何走上可视化之路的?
- 关于改变ListView选中项的状态方法
- iperf 服务端发送数据_iperf 流量测试
- 苹果手机装android应用程序,Android/iOS手机安装HP打印机的详细方法和操作步骤
- 项目实战之微信、微信公众号登陆和支付调起
- 计算机在哪里设置定时休眠,win7系统设置定时开关机休眠唤醒的详细办法
- JAVA导出EXCEL——POI(转)
- 全能修图工具:Pixelmator Pro for Mac
- CF1143F/1142C U2
- PS在园林计算机辅助设计中有哪些应用,计算机辅助设计在园林设计中的运用
- #程序员的办公桌面是怎么样的?网友晒的真是逼格满满啊
- 论文解读:《一种利用二核苷酸One-hot编码器识别水稻基因组中N6甲基腺嘌呤位点的卷积神经网络》
- 蓝桥杯12题c语言,2012.C语言‘蓝桥杯“预赛.真题.高职
- git push遇到错误: [rejected]master - master (non-fast-forward)的解决方法
- 青龙面板获取京东ck的新老方法