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

说明:

  1. 属性类型必须为包装类型
  2. pojo必须添加get/set方法
  3. 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风格说明

要求:

  1. restFul的风格数据位置一旦确定,不能修改
  2. 参数与参数之间使用"/"的方式风格
  3. 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;}
  1. @ResponseBody 将返回值转化为json串
  2. @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. 服务器

异步的特点:

  1. 由Ajax引擎直接访问后端服务器
  2. 在回调函数没有执行之前,用户可以执行自己的任务----异步

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 关于请求异常

  1. 405异常 ajax的请求类型与后端接收的请求类型不匹配
  2. 400异常 参数类型不匹配
  3. 404异常 请求路径找不到

Axios

1 . Axios post提交

  1. form表单提交 method=“post” 同步(要素:页面是否刷新)
  2. 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. 请求类型与业务的关系

常见的请求类型:

  1. Get 查询操作

  2. Delete 删除操作 用法相同

  3. Post 1.表单数据提交 2.新增操作

  4. 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. 同源策略

要素:

  1. 浏览器中URL地址:http://localhost:8848/webDemo/demo/3-axios.html
  2. 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--记录学习历程相关推荐

  1. ionic3学习历程(1)

    因为最新版的ionic3国内资料比较少,对于小白学习踩了很多坑,现记录学习历程,以供参考. 如果你也是用的 typescript3+angular4+ionic3,去作为前端开发框架,你可以先学习 1 ...

  2. Web学习历程记录(七)——Tomcat

    Web学习历程记录--Tomcat Web 静态Web资源 指Web页面中供人们浏览的数据始终是不变的 动态Web资源 指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容 ...

  3. PhotoShop学习历程以及网站分享

    博主将开启为期两周的PhotoShop学习计划,今天是2021/7/25 仅仅是学习历程记录,与大家分享学习心得,分享觉得好的网站.如果有好的建议可以在底下留言,大家共同进步!         内容将 ...

  4. 我的首篇博客——记录学习,不忘初心

    Hello,大家好!我是阿冰!今天是2022年12月2日,受疫情影响,我们学校的同学都早早的回家了,今天就是我回家的第五天.其实,这并不算是真正意义的寒假,因为过两天我们还有将近一个月的实训,大约到1 ...

  5. 【小白】【大学】一名嵌入式软件开发小白的单片机学习历程、心路历程、经验分享

    我的嵌入式学习之路 我为什么写这篇文章 先简单介绍一下我自己 与每一个技术小白共勉 这篇文章写给谁 我的学习经验分享 我的成长之路 我的单片机学习历程分享 51系列单片机学习历程 预备知识:(可以查百 ...

  6. SpringMVC基础学习之Controller的两种实现方式和RequstMapping注解的使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...

  7. 一个程序员的学习历程

    一个程序员的学习历程 转眼工作已经四年多了,一直想找个时间总结一下,却迟迟懒得动手.今天一定要强迫自己写出来,不光是为了工作过的四年,也是为了和同样作技术的朋友和即将工作的学友一起共勉. 2000年从 ...

  8. Master-MatPyon:学习历程

    日日思君不见君,共饮长江水. 希望能在这个地方记录自己的学习历程. 每一天我们都应该活得更有价值,活得更有意义. 信心远比努力更重要!!!

  9. MySQL必知必会学习历程(一)

    MySQL必知必会学习历程(一) 前言 第1章 了解SQL 1.1 关键术语介绍 1.2 数据表解释实例 第2章 MySQL简介 2.1 关键术语介绍 2.2 安装mysql命令行实用程序(可选) 2 ...

  10. SpringMVC基础学习之Restful风格的简单使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...

最新文章

  1. OpenResty学习中的几个小例子汇总
  2. LeetCode - 34. Search for a Range
  3. 一个球从100米高度自由落下,每次落地后反弹回原高度的一半; * 再落下,求在第几次之后反弹高度小于0.1米, * 并计算在这一次落地时共经过多少米?...
  4. Java I/O在Android中应用(一)
  5. java 反取字符串
  6. 最会数据分析的护士!全世界最有名的白衣天使是如何走上可视化之路的?
  7. 关于改变ListView选中项的状态方法
  8. iperf 服务端发送数据_iperf 流量测试
  9. 苹果手机装android应用程序,Android/iOS手机安装HP打印机的详细方法和操作步骤
  10. 项目实战之微信、微信公众号登陆和支付调起
  11. 计算机在哪里设置定时休眠,win7系统设置定时开关机休眠唤醒的详细办法
  12. JAVA导出EXCEL——POI(转)
  13. 全能修图工具:Pixelmator Pro for Mac
  14. CF1143F/1142C U2
  15. PS在园林计算机辅助设计中有哪些应用,计算机辅助设计在园林设计中的运用
  16. #程序员的办公桌面是怎么样的?网友晒的真是逼格满满啊
  17. 论文解读:《一种利用二核苷酸One-hot编码器识别水稻基因组中N6甲基腺嘌呤位点的卷积神经网络》
  18. 蓝桥杯12题c语言,2012.C语言‘蓝桥杯“预赛.真题.高职
  19. git push遇到错误: [rejected]master - master (non-fast-forward)的解决方法
  20. 青龙面板获取京东ck的新老方法

热门文章

  1. 小题目——给出n阶方阵里所有的数,求方阵里所有数的和
  2. 今天项目报错: No operations allowed after connection closed
  3. 租一个月的云服务器要花费多少?
  4. 关于系统对接,你需要关注的点都在这里
  5. IDEA 设置4个空格代替tab
  6. es查询所欲_elasticsearch之查询的两种方式
  7. CAR-T细胞疗法最新研究进展
  8. 那些 Cynthia 教我的事 之 PMSec (二)
  9. 1014 科学计数法 (C++)
  10. 分享百度下拉软件技术方法,手机蛙下拉教程,