三层架构
三层架构划分
- 表述层:负责处理浏览器请求、返回响应、页面调度
- 业务逻辑层:负责处理业务逻辑,根据业务逻辑把持久化层从数据库查询出来的数据进行运算、组装,封装好后返回给表述层,也可以根据业务功能的需要调用持久化层把数据保存到数据库、修改数据库中的数据、删除数据库中的数据
- 持久化层:根据上一层的调用对数据库中的数据执行增删改查的操作
模型对整个项目中三层架构的每一层都提供支持,具体体现是使用模型对象封装业务功能数据。
Java实体类有很多不同名称:
- POJO:Plain old Java Object,传统的普通的Java对象
- entity:实体类
- bean或Java bean
- domain:领域模型
模型开发的要求
ORM
ORM:Object Relative Mapping对象关系映射
对象:Java对象
关系:关系型数据库
映射:Java对象和数据库表之间的对应关系
| Java类 | 数据库表 |
|---|---|
| 类 | 表 |
| 属性 | 字段/列 |
| 对象 | 记录/行 |
| 属性按照驼峰式命名 | 字段名各个单词之间用下划线分开 |
实体类的要求
-
必须有一个无参构造器
将来使用框架后,大量的对象都是框架通过反射来创建的。
Class clazz = Class.forName("全类名");
clazz.newInstance();
-
通过getXxx()、setXxx()方法定义属性:getXxx()或setXxx()方法去掉get或set后,Xxx把首字母小写,得到的xxx就是属性名。
DAO概念
DAO:Data Access Object数据访问对象
DAL:Data Access Layer数据访问层
注册逻辑
前后端工程师对接方式
- 服务器端渲染:前端工程师把前端页面一整套做好交给后端工程师
- 前后端分离:开会商量JSON格式,然后分头开发。在后端程序尚不可用时,前端工程师会使用Mock.js生成假数据使用,在后端程序可用后再连接实际后端程序获取真实数据。
业务逻辑
登录
注册
过滤
Cookie介绍
本质
- 在浏览器端临时存储数据
- 键值对
- 键和值都是字符串类型
- 数据量很小
Cookie时效性
-
会话级Cookie
- 服务器端并没有明确指定Cookie的存在时间
- 在浏览器端,Cookie数据存在于内存中
- 只要浏览器还开着,Cookie数据就一直都在
- 浏览器关闭,内存中的Cookie数据就会被释放
-
持久化Cookie
-
服务器端明确设置了Cookie的存在时间
-
在浏览器端,Cookie数据会被保存到硬盘上
-
Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
-
持久化Cookie到达了预设的时间会被释放
-
session
前提:浏览器正常访问服务器
-
服务器端没调用request.getSession()方法:什么都不会发生
-
服务器端调用了request.getSession()方法
-
服务器端检查当前请求中是否携带了JSESSIONID的Cookie
-
有:根据JSESSIONID在服务器端查找对应的HttpSession对象
- 能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回
- 找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
-
无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
-
-
拦截器
Filter生命周期
和Servlet生命周期类比,Filter生命周期的关键区别是:在Web应用启动时创建对象
| 生命周期阶段 | 执行时机 | 执行次数 |
|---|---|---|
| 创建对象 | Web应用启动时 | 一次 |
| 初始化 | 创建对象后 | 一次 |
| 拦截请求 | 接收到匹配的请求 | 多次 |
| 销毁 | Web应用卸载前 | 一次 |
代码
- 精准拦截
<!-- 配置Filter要拦截的目标资源 -->
<filter-mapping>
<!-- 指定这个mapping对应的Filter名称 -->
<filter-name>Target01Filter</filter-name>
<!-- 通过请求地址模式来设置要拦截的资源 -->
<url-pattern>/Target01Servlet</url-pattern>
</filter-mapping>
- 模糊拦截
<filter-mapping>
<filter-name>Target02Filter</filter-name>
<!-- 模糊匹配:前杠后星 -->
<!--
/user/Target02Servlet
/user/Target03Servlet
/user/Target04Servlet
-->
<url-pattern>/user/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>Target04Filter</filter-name>
<filter-class>com.atguigu.filter.filter.Target04Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>Target04Filter</filter-name>
<url-pattern>*.png</url-pattern>
</filter-mapping>
不允许前杠后缀,星号在中间!!!!
事务
并发问题
| 并发问题 | 问题描述 |
|---|---|
| 脏读 | 当前事务读取了其他事务尚未提交的修改 如果那个事务回滚,那么当前事务读取到的修改就是错误的数据 |
| 不可重复读 | 当前事务读取同一个数据,第一次和第二次不一致 |
| 幻读 | 当前事务在执行过程中,数据库表增减或减少了一些记录,感觉像是出现了幻觉 |
隔离级别
| 隔离级别 | 描述 | 能解决的并发问题 |
|---|---|---|
| 读未提交 | 允许当前事务读取其他事务尚未提交的修改 | 啥问题也解决不了 |
| 读已提交 | 允许当前事务读取其他事务已经提交的修改 | 脏读 |
| 可重复读 | 当前事务执行时锁定当前记录,不允许其他事务操作 | 脏读、不可重复读 |
| 串行化 | 当前事务执行时锁定当前表,不允许其他事务操作 | 脏读、不可重复读、幻读 |