目录
1.MVC设计思想
M: Model 数据层
V: View 视图层
C: Control 控制层
SpringMVC是Spring基于MVC思想.专门针对于前后端交互的开发的框架.
总结: MVC 主要的目的降低代码的耦合性,提高扩展性.方便后续开发.
1.1 Ajax
- Ajax特点: 局部刷新,异步访问!
- 什么是同步: 当用户刷新页面时,必须等到所有的页面数据加载回来之后,统一刷新显示.
- 什么是异步: 当用户刷新页面是,在内部发起多个请求.页面数据先回来的,则局部页面先刷新展现.
- Ajax为什么可以异步: Ajax引擎!!!
1.2 传统Servlet的弊端
传统的Servlet 一个业务方法,需要编辑一个Servlet. 如果业务复杂则导致Servlet数量增多.
Servlet的请求的方式 只能支持 get/post请求.
通过Servlet获取的参数的类型 都是String,需要手动的进行类型转化.
如果编辑servlet 则需要编辑大量的web.xml(8行配置) 文件.
1.3 框架之间的调用关系
1.4 JSON结构
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
根源: 网络传输协议http/https,本质传输的数据都是字符串/字节信息. 协议与系统无关. 所以采用JSON的方式将数据按照特定的顺序进行排列. JSON中的特殊的数据结构,可以很好的解析字符串.
1.4.1 JSON的格式
对象格式
对象(object) 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组格式
数组(array) 是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
嵌套格式
值(value) 可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
1.5 RestFul结构(难点)
1.5.1RestFul参数接收
1.5.2 RestFul请求路径的通用写法
优化: restFul风格的请求名称的要求,不能出现动词
http://localhost:8080/userById?id=100 类型: GET 查询业务逻辑
http://localhost:8080/userById?id=100 类型: Delete 删除业务逻辑
http://localhost:8080/userById?id=100&name=tomcat 类型: PUT 更新业务逻辑
http://localhost:8080/user 类型: POST 新增业务逻辑
1.5.3 请求类型的种类
2. "三层"代码结构
1. Controller层 主要与页面进行交互 @Controller
2. Service层 主要实现后端的业务逻辑 @Service
3. Dao层/Mapper层 主要与数据库进行交互 也把该层称之为 “持久层” @Repository/@Mapper
2.1 代码结构实现
包名: mapper 类2个 一个接口UserMapper/一个实现类 UserMapperImpl
包名: service 类2个 一个接口UserService/ 一个实现类UserServiceImpl
包名: controller 一个类: UserController
知识说明: 被调用的一般会有接口和实现类
3.Spring---AOP
3.1 业务说明
事务特性: 1. 原子性 2. 一致性 3.隔离性 4.持久性
业务说明: 在增/删除/修改的操作过程中添加事务控制.
3.2 AOP中专业术语(难点)
1).连接点: 用户可以被扩展的方法
2).切入点: 用户实际扩展的方法
3).通知: 扩展方法的具体实现
4).切面: 将通知应用到切入点的过程
3.3切入点表达式
1 bean(“对象的Id”) 每次拦截,只拦截1个
@Pointcut(“bean(userServiceImpl)”) 只匹配ID为userServiceImpl的对象
2 within(“包名.类名”)
@Pointcut(“within(com.jt.demo2.service.*)”) 匹配xx.xx.service下的所有对象
3 execution(返回值类型 包名.类名.方法名(参数列表))
4 @annotation(注解的路径)
3.4 导入jar包
3.5 定义切面类
3.6 让AOP生效
3.7自定义注解
4. JDK动态代理
4.1 关于代理模式说明
在业务层不方便做,但是又不得不做的事情,可以放到代理对象中. 通过这样的设计就可以解决业务层耦合的问题. 代理对象看起来和真是的对象 一模一样.所以用户使用不会察觉.
4.2 JDK动态代理特点
- 类型名称: class com.sun.proxy.$Proxy9
- 要求: 要求被代理者,必须是接口或者是实现类.
- JDK代理是java原生提供的API 无需导包.
- JDK动态代理在框架的源码中经常使用.
5. CGlib动态代理
5.1特点说明
历史原因: JDK动态代理要求必须"有接口",但是某些类它没有接口,则无法使用JDK代理生成代理对象. 所以为了填补知识的空缺,则引入cglib代理.
问题说明: cglib动态代理 要求有无接口都可以创建代理对象. 问题? 如何保证和被代理者"相同"
答案(特点): 要求cglib动态代理继承被代理者.代理对象是被代理者的子类.
5.2 作用
说明1: 一般我们将业务层中的耦合性高的代码,采用动态代理的方式进行解耦.使得程序更加具有扩展性. (业务逻辑的解耦)
说明2: Spring专门针对动态代理的规则.封装了一套API 起名 AOP
6. 通知方法
6.1 关于通知方法解析
1.前置通知 在目标方法执行之前执行.
2.后置通知 在目标方法执行之后执行. 记录目标方法的返回值
3.异常通知 在目标方法执行之后抛出异常时执行. 抛出的异常信息
4.最终通知 都要执行的通知 记录程序最后的状态
说明: 上述的四大通知一般用于记录程序的运行状态.只做记录.
5.环绕通知 在目标方法执行前后都要执行的通知
环绕通知特点:
* 1.方法执行前后,通知都要执行.
* 2.环绕通知可以控制目标方法是否执行.
* 3.环绕通知必须添加返回值.
* 2. proceed()
* 作用1: 如果有下一个通知,则执行下一个通知
* 作用2: 如果没有下一个通知,则执行目标方法
7. Spring 总结
知识总结:
1.Spring的作用: Spring可以整合其它的第三方框架!从架构的角度,实现了代码的松耦合!
2. Spring-IOC/DI IOC控制反转/数据结构Map集合<id,反射实例化对象>/ xml文件写法/注解写法
DI: 依赖注入 类型注入/名称注入/一般接口都是单实现.
3. Spring-AOP 在不修改源码的条件下对方法进行扩展!!!
4. 动态代理 JDK动态/Cglib动态代理 method.invoke()
5. 切面 = 切入点表达式 + 通知方法
6. AOP中因为切面较多,每个切面都完成特定的功能,所以一般不会研究顺序. @Order注解 可有控制顺序.