学习环境:
技术储备:
数据层:
整个流程是:
整个页面基于HTML、CSS,然后基于JavaScript的jQuery库发送了一个动态交互的请求,给接入层controller进行通用处理,然后我们基于SpringMVC的controller层会向业务层调用相应的服务,
业务层会调用数据层的Dao,通过事务管理数据DaoMapper的方式将数据的增删改查落入到数据库中,最后到本地电脑中
数据模型(Data Object):借助于Mybatis的ORM操作将关系型数据库的表结构,通过XML的方式,定义成Java的Object结构
领域模型(Domain Model):具有一个对象的生命周期(创建、更新、删除、消亡),它可以和数据模型组合,比如用户对象是一个领域模型,它是由用户基本信息+用户密码信息两个数据模型共同组成的。
贫血模型:项目里的用户对象就设计成贫血模型:指的是拥有各种属性信息和get、set方法,但是不包含有登陆、注册等功能
ViewObject:与前端对接的模型,供展示的聚合模型
{% note info %}
问题1. 为什么要将商品的库存表item_stock与商品表item分开?
{% endnote %}
{% note success %}
问题2. 跨域请求问题
{% endnote %}
在存在跨域请求问题的类前都加上一句支持跨域操作(服务端解决方式):
@CrossOrigin(origins = {
"*"},allowCredentials = "true")
问题出现在:由于我们是做前后端分离的设计,jQuery会有跨域限制,用ajax请求对应网页的url文件位置时,静态资源文件和jQuery动态请求是分离状态,所以在ajax请求要加上一句:
xhrFields:{withCredentials:true}
,因为要解决客户端上session共享的问题(客户端session共享)
跨域感知session需要解决两个问题,第一个是解决跨域问题,第二个是解决跨域cookie传输问题
解决跨域问题就如上面问题2所示,使用了springboot自带的crossOrigin注解
@CrossOrigin(origins = {"*"},allowCredentials = "true")
注解加上后,所有的http response头上都会加上Access-Control-Allow-Origin * 以及 Access-Control-Allow-Headers * 两个头部,这样可以满足CORS的跨域定义,我们的ajax看到这两个头部就认定对应的域名接收任何来自或不来自于本域的请求
跨域和跨域传递cookie是两个不同纬度的问题,我们依靠上述的方式解决了跨域问题,但要做到跨域感知seesion需要解决在跨域的前提下将cookie也能传上去,这时候就需要设置另外一个头部,我们的cross origin变成
@CrossOrigin(origins = {
"*"},allowCredentials = "true",allowedHeaders = "*")
使用了allowCredentials后Access-Control-Allow-Credentials头被设置成true,同时前端设置xhrField:{withCredential:true}后,浏览器在ajax请求内带上对应的cookie头部和后端的allowCredentials配合在一起解决跨域传递cookie的问题。由于课程中仅仅使用了get和post的方法,而这两个方法在跨域请求中都是可以用的,因此allowedHeaders可以不加。
{% note primary no-icon %}
问题3.404、405问题
{% endnote %}
404问题就是页面URL访问不到,之前异常处理的方式是定义BaseController层捕获,但是对于没有进入Controller层就无法处理。
405问题就是比如该传的url参数没有传,url绑定路由问题
解决方法:
定义GlobalExceptionHandler,类前添加注释@ControllerAdvice 面向切面编程,在配置文件application.properties
中添加spring.mvc.throw-exception-if-no-handler-found=true
和spring.resources.add-mappings=false
@ControllerAdvice
public class GlobalExceptionHandler{
@ExceptionHandler(Exception.class)
@ResponseBody
public CommonReturnType doError(...Excetion e)
{
if(ex instanceof BusinessException) {
//BusinessExcetion打印errCode和errMsg
}
if(ex instanceof ServletRequestBindingException){
//ServletRequestBindingException打印url绑定路由问题(405)
}
if(ex instanceof NoHandlerFoundException) {
//没有找到对应的访问路径(404)
}
}
}
—————————————————————————————————
【本课程已整理完毕】
01_电商秒杀商品回顾
02_云端部署
03_分布式扩展
04_查询性能优化技术之多级缓存
05_查询性能优化技术之页面静态化
06_交易性能优化技术之缓存库存
07_交易性能优化技术之事务型消息
08_流量削峰技术
09_防刷限流技术
10_课程总结
—————————————————————————————————