根据老师上课内容,自己对于学习的整理
Spring总结
IOC-DI
IOC:控制反转 对象的生命周期由Spring容器管理
xml配置文件的写法 bean标签 id/class xml容器的实现类
注解写法@bean 配合类
单例多例问题 默认单例对象 @Scope('prototype')多例对象
懒加载 @Lazy 用户使用时创建
生命周期方法 对象创建(无参构造)/对象初始化(@Postxxx)/业务调用/对象销毁(@Prexxx)
DI:依赖注入 为对象的属性赋值!
简单属性赋值:@Value注解
引用赋值:@Autowired1.默认按照类型匹配2.按照名称匹配
注入方式:1.set注入2.构造方法注入3.工厂模式注入(一定可以创建出来对象)
AOP
面向切面编程 在不修改源码的条件下对方法进行扩展 解决了业务的耦合性
底层核心机制:动态代理机制 JDK/CGLib动态代理
关键词
1.切入点表达式:如果用户调用满足切入点表达式 则创建代理对象,执行AOP的通知
2.通知:对业务的扩展5哥通知 环绕通知可以对方法进行控制
3.连接点:用户调用的方法满足切入点表达式 则该方法称作连接点。
Spring框架优势
1.Spring框架的设计让程序从底层到业务实现了松耦合
2.Spring基于这样的设计思路,可以整合其他的第三方框架,使得程序可以以统一的方式进行调用
SpringMVC
SpringMVC是Spring框架后续开发的web模块,主要负责与前端用户进行交互
SpringMVC基于Servlet进行开发的框架,目的简化前后端的调用
Servlet
Servlet是java针对前后端交互,开发的一种调用的机制
弊端:
一个业务需求 就需要准备一个Servlet数量繁多
需要编辑大量的配置文件web.xml开发繁琐
从servlet中获取的参数都是String数据类型,需要手动的转化类型
Servlet只提供了get/post请求类型,不满足当下的需求
注意事项:
开发时完毕注意包路径在著启动类的同包及子包下
现在开发一般都使用前后端分离的方式,所以服务器的返回的一般都是JSO串
每次编辑完成代码,需要重启tomcat服务器
注解:
@RequetMapping("/路径")
负责用户的路径请求与后台服务器之间的映射关系
如果请求路径不匹配,则用户报错404
@ResponseBody
作用:讲服务器的返回值转化为JSON串,如果服务器返回的是String类型,则按照自身返回
因为现在时前后端分离,所以已经不走视图解析器了
SpringMVC底层实现原理
重要组件:
1.前端控制器,DispatcherServlet 获取和响应请求
2.处理器映射器,handlerMapping
3.处理器适配器,handlerAdapter
4.视图解析器 ViewResolver
SpringMVC调用流程:
1.用户发起请求之后,第一步访问就是前端控制器
2.前端控制器只负责请求的转发/响应,没有办法直接处理业务
3.当SpringMVC容器启动时,处理器映射器首先会加载所有的@RequsetMapping注解。将请求路径与方法进行绑定。保存在Map中。Map</url,method方法>,当前端控制器发送请求被处理器映射器接受,如果URL地址匹配,则报纸应该执行哪个方法,如果url地址不匹配,则提示用户404
4.前端控制器得知将要执行的方法是谁,但是前端控制器,没有办法执行业务。
所以请求处理器适配器执行业务逻辑
5.处理器适配器针对配置文件(xml方式/注解方式/其他方式)的格式,挑选合适的处理器去执行业务逻辑,业务执行成功之后返回ModelAndView对象 Model:业务数据 View:页面
历史版本: 需要返回页面名称,及将数据填充到页面中
6. 前端控制器接收到返回的ModelAndView之后,交给视图解析器去解析数据. 视图解析器通过自身的配置获取页面的名称 (/web/user.html).
7. 最终通过经过视图渲染,将数据填充到页面中.最终用户看到的页面就包含了业务数据.
前后端分离方式:
关键用法: @ResponseBody 要求返回业务数据并且转化为JSON串. 程序直接跳过6-7直接将数据返回给用户.
SpringMVC参数接收用法
@RestController @Controller+@ResponseBody
RestFul结构
Get类型 数据写在url?后面
例如:http://localhost:8080/user/getUser?id=110&name="张三"
RestFul请求:http://localhost:8080/user/getUser/110/张三
RestFul语法
1.URL中请求的参数使用/分割
2.服务器端参数接受时,变量使用{xx}进行包裹,并且位置固定
3.利用@PathVariable注解,动态获取路径中的数据,要求名称必须匹配
请求类型与业务的关系
1.请求类型
1.Get 2.HEAD(不常用) 3.POST 4.PUT
5.DELETE 6.CONNECT(不常用) 7.OPTIONS(不常用) 8.TRACE(不常用)
2.规则:随着业务的深入,请求类型与业务渐渐的绑定
@RequestMapping(path = "/login", method=RequestMethod.GET)
path指定路径,method可以标识方法,有的公司不使用GetMapping等
新增:post请求类型@PostMapping("")
删除:delete请求类型@DeleteMapping("")
修改:put请求类型@PutMapping("")
查询:get请求类型@GetMapping("")
同名参数提交
页面说明:name=“hobby” 口 篮球 口 排球 口 乒乓球
前端URL:http://localhost:8080/user/saveHobby?hobby=篮球,排球,乒乓球
用数组接收
Controller类
@GetMapping("/saveHobby")
public String[] saveHobby(String[] hobby){
return hobby;
}
前后端调用
Ajax
使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,再也不需要重载(刷新)整个网页,这使得程序能够快速地回应用户的操作
Ajax特点
局部刷新,异步访问
同步请求
浏览器发起请求到服务器时,如果服务器没有响应,用户则无法获取页面数据,处于等待状态。不可以做其他的操作。(没有刷新出来就一直转圈)
异步请求
异步请求时,浏览器可以进行其他的操作,当ajax数据获取之后,信息在页面的局部刷新(可以理解为多线程操作方式)[刷新出来的先显示,没刷新出来的再次请求]
Ajax异步的原理
Ajax为什么可以异步:中间有Ajax引擎
回调函数:服务器返回数据,通过回调函数通知用户
同步:请求过程没有返回数据时,只能等待
堂食,师傅没做好你就只能等着
异步:浏览器解析请求时,可以继续执行后续的操作,无需等待,直到回调函数被调用之后的请求数据返回了
外卖,你选择好了等小哥给你打电话即可,外卖小哥这时就是Ajax引擎(代理)
@CrossOrigin 允许跨域
- GET/DELETE 参数提交的方式一致
- POST/PUT 参数提交的方式一致
- restFul结构适用于所有的请求类型
跨域
同源策略
浏览器的网址与Ajax请求的网址必须满足协议://域名:端口号必须相同.
如果满足要求就是同域访问,如果不满足要求,则是跨域访问
常用API
request.getParameter("属性名")
servlet获取地址中的数据
Integer.parseInt(需要转换的数据名)
string转int
面试题【可能会考】
404除了路径不匹配还有什么可能?
没有添加@ResponseBody注解,返回值找不到视图解析器
http协议默认端口号?https默认端口号
http默认端口号80,https默认端口号443