JavaWeb
调整代码排版 ctrl+alt+shift+L
web前端
Web标准
- HTML:网页的结构
- CSS:网页的表现
- JavaScript:网页的行为(交互效果)
HTML(HyperText Marekup Language)
- 超文本:超越了文本的限制,可以展示文本、图片、音频和视频等
- 由标签构成的语言。标签都是预定义好的
CSS(Cascading Style Sheet)
层叠样式表
- 选择器,优先级从低往高
- 元素选择器
- id选择器
- 类选择器
表单
- action:表单提交的url,往何处提交数据.如果个指定,默认提交到当前贝面
- method:表单的提交方式.
- get:在url后面拼接表单数据,比如: ?username=Tom&age=12 , url长度有限制﹒默认值
- post:在消息体(请求体)中传递的,参数大小无限制的.
表单项必须有name属性才可以提交
表单项
- <input>:通过type属性克制输入形式
- <select>: 定义下拉列表,
- <textarea>:文本域
JavaScript
<script>
<\script>
var 作用域比较大,是全局变量;可以重复声明
let 只在所在的代码块有效,不能重复声明
const 定义常量,不能被改变
BOM(Browser Oblect Model) 浏览器对象模型
- Window:浏览器窗口对象
- Navigator
- Screen
- History
- Location:地址栏对象
DOM(Document Object Model):文档对象模型
- Document:整个文档对象
- Element:元素对象
- Attribute:属性对象
- Text:文本对象
- Comment:注释对象
事件监听
Vue:是一套前端框架,可以免除原生JS的DOM操作,简化书写
基于MVVM思想,实现数据的双向绑定,将编程的关注点放在数据上
Maven
是一个项目管理和构建工具
... 设置依赖作用范围。
三层架构
- controller:控制层,接受前端发送的请求,对请求进行处理,并响应数据
- service:业务逻辑层,处理具体的业务逻辑
- Dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查
分层解耦
高内聚低耦合
- 控制反转:Inversion of Control(IOC)。对象的创建控制权由程序自身转移到外部容器。@Component(衍生注解 @Controller, @Service, @Respository)
- 依赖注入:Dependency Injection(DI)。容器为应用程序提供运行时,所依赖的资源。 @Autowired(默认按照类型自动装配)
- Bean对象:IOC容器中创建、管理的对象。
当有多个相同类型的Bean的时候,可以通过 1.@Primary(设置优先级) 2.@Autowired+@Qualifier 3.@Resource(默认按照名称注解)
- @Resource 与 @Autowired区别
@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解。
@Autowired默认是按照类型注入,而@Resource默认是按照名称注入。
数据库MySQL
命令
- 启动mysql:net start mysql
- 登录 mysql -u用户名 -p密码 [-hIP地址 -P端口号] 默认ip本机127.0.1.1 默认端口号3306
- 直接 exit
数据库管理系统:database management system(DBMS)
数据模型
- 关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库
SQL
- 通用语法
- 可以单行或者多行,以分号结尾。
- 可以用空行/缩进增强可读性
- 不区分大小写
- 注释:-- 注释内容或者 # 注释内容。多行注释/注释内容/
- DDL(数据库操作)
- 查询所有数据库 show databases;
- 查询当前数据库 select database();
- 创建数据库 create database [if not exists] 数据库名;
- 使用数据库 use 数据库名
- 删除数据库 drop database [if exists] 数据库名;
上述database可以替换成schema - 约束
![]()
- 数据类型
数值类型、字符串类型、日期类型 - 修改表
添加 add;
修改字段类型 modify
修改字段名和字段类型 change
删除字段 drop table [if exits] 表名
修改表名 rename table xx to xx
DML
- insert语法
指定字段添加数据:insert into表名(字段名1,字段名2)values(值1,值2);
全部字段添加数据:insert into表名values(值1,值2,..);
批量添加数据(指定字段):insert into表名(字段名1,字段名2)values(值1,值2),(值1,值2);
批量添加数据(全部字段):insert into表名values(值1,值2,..),(值1,值2,...); - update语法
update 表名 set 字段名1=值1,字段名2=值2,...[where 条件] 如果没有条件,就会修改整个表 - delete语法
delet from 表名 [where 条件]
DQL
-
select 字段列表
查询多个字段:select字段1,字段2,字段3from表名;
查询所有字段(通配符):select*from表名;
设置别名:select字段1[as别名1],字段2[as别名2]from表名; (as可以省略)
去除重复记录:select distinct字段列表from表名; -
from 表名列表
-
where 条件列表
-
group by 分组字段列表
-
having 分组后条件列表
-
order by 排序字段列表
-
limit 分页参数
多表设计
- 一对多:只需要在多的一方关联一的主键
![]()
这是物理外键。
缺点:影响增删改的效率(需要检查外键关系);仅适用于单节点数据库,不适用分布式、集群场景;容易引发数据库的死锁问题 - 一对一:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(UNIQUE)
- 多对多:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
内连接
- 隐式内连接: selcet 字段列表 from 表1,表2 where 条件 ...;
- 显式内连接: select 字段列表 from 表1 [inner] join 表2 on 连接条件;
事务
事务是一个不可分割的工作单位,会把所有的操作作为一个整体一起向系统提交或撤销操作请求。操作要么同时成功,要么同时失败
事务控制:
- 开启事务 start transaction; /begin
- 提交事务 commit
- 回滚事务 rollback
数据库四大特性(ACID)
- 原子性
- 一致性
- 隔离性
- 持久性
Mybatis
- 配置文件 包括驱动类名称、数据库连接的url、用户名、密码
@Mapper
public interface UserMapper{
@Select("select * from user**")
publicList<User> list();
}
JDBC
是sun公司提供的一套操作关系型数据库的API(规范),各个数据库厂商负责提供实现(驱动)
数据库连接池
是个容器,负责分配、管理数据库连接。
标准接口:DataSource。 获取连接 getConnection()
数据封装
- 实体类属性名和数据库表查询返回的字段名一致时,mybatis会自动封装
- 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
- 解决方法:
- 给字段起别名,让别名和实体类属性一致
- 通过@Results,@Result注解手动映射封装
@Results({
@Result(column="", property=""), column是字段名,property是实体类属性
@Result(column="", property="")
})
- 开启mybatis的驼峰命名自动映射开关 a_column-->aColumn
mybatis.configuration.map-underscore-to-camel-case=true
lombok

增删改查
- 根据主键删除 #{}
@Delete("delete from emp where id=#{id}")
public void delete(Integer id);
#{}在预编译时占位符会被?代替,这种方式不仅性能好,安全性也高,通过预编译的SQL可以防止SQL注入. delete from emp where id=?。要注意在字符串中是不能使用#{}的,这时候要使用concat()函数
${}拼接SQL,直接将参数拼接再SQL语句中,存在SQL注入问题。一般对表名、列名进行动态设置时使用。 delete from emp where id=1
- 新增:可以用实体对象进行封装,values是使用属性名而不是字段名
- 新增(主键返回)
在数据添加成功后,需要获取插入数据库数据的主键
加入注解 @Options(keyProperty="id",useGeneratedKeys=True) - 更新(一般根据主键修改)
- 条件查询
XML映射文件

动态SQL
<where> </where>标签可以判断条件是否成立, 成立时加上where,还可以动态去除多余的and 和or;
<set> </set>替换set关键词,可以去掉字段后面多余的逗号
- <if>
用于判断条件是否成立,使用test属性急性条件判断,如果条件为true,就拼接SQL
<if> </if> - <foreach>
collection:遍历的集合
item: 遍历出来的元素
separator: 分隔符
open: 遍历开始前拼接的SQL片段
close: 遍历结束后拼接的SQL片段 - <sql> <include> 增加代码的复用性
<include>中有refid属性来引用唯一命名
案例
- 新建一个工程,所需要的依赖有:Spring Web, MySQL Driver, Lombok, MyBatis Framework
- Resource中的`application.properties进行数据库连接、开启mybatis日志输出、开启驼峰映射
配置文件application.properties中引入mybatis的配置信息,准备对应的实体类
- application.properties
~~~properties
#数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/tlias
spring.datasource.username=xxx
spring.datasource.password=xxx
#开启mybatis的日志输出
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启数据库表字段 到 实体类属性的驼峰映射
mybatis.configuration.map-underscore-to-camel-case=true
- 定义实体类
- 准备对应的Mapper: 用于定义对实体类的各种数据库操作方法。其中mapper注解是告诉mybatis或者springboot这个接口是Mapper,要生成对应的代理实现类,并且将该对象交给IOC容器管理
- 准备业务层Service的接口定义和实现类定义
- 准备控制层Controller: 用于处理HTTP请求,并且返回的是JSON或XML等数据,而不是视图页面
开发规范-Restful
表述性状态转换,是一种软件架构风格。
URL定位资源,HTTP动词描述操作。描述模块的功能通常使用复数
- Get 查询id为xxx的用户
- POST 新增用户
- PUT 修改用户
- DELETE 删除id为xxx的用户
![]()

注意问题
@Slf4j等价于private static Logger logger = LoggerFactory.getLogger(DeptController.class),只用在类名上加入这个注解就相当于记录日志了- @RestController 会在返回数据的时候把数据转为json
- @RequestMapping用来抽取共同路径,一个完整的请求路径,应该是类上的@RequestMapping的value属性 + 方法上的@RequestMapping的value属性
- @RequestParam(defaultValue="1") 设置请求参数默认值
分页插件PageHelper
引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
使用:
- PageHelper.startPage(pageNum, pageSize);
- List
list = empMapper.list(); - Page
page = (Page ) list;
UUID
通用唯一识别码
阿里云OSS(Object Storage Service)
@PathVariable: 从 URL 路径中提取参数,并将其绑定到方法的参数上@RequestBody: 将 HTTP 请求体中的 JSON 或 XML 数据自动转换为 Java 对象,并绑定到方法参数上。
配置文件
- application.properties:键值对=
- application.yml/yaml:有缩进:
- XML
- java系统属性和命令行参数
优先级 命令行参数>系统属性>propoties>yml>yaml
yml数据格式(主流)
- 对象/Map集合
user
name: zhangsan
age: 18
password: 123456
- 数组/List/Set集合:
hobby:
- jave
- game
- sport
@Data //生成get set方法
@Component //交给IOC容器管理
@ConfigurationProperties(prefix = "aliyun.oss") //属性自动注入加上前缀
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
- @ConfigurationPropertied 和@Value 都是用来注入外部配置的属性的
@Value 只能一个一个的进行外部属性的注入
@ConfigurationPropertied 可以批量的将外部的属性配置注入到bean对象的属性中
登录认证功能:通过账号和密码查询
登录校验:
- 会话技术:
- 会话:一次会话中可以包含多次请求
- 会话跟踪:识别多次请求是不是来自同一浏览器,以便在同一次会话的多次请求共享数据
- 会话跟踪方案
- 客户端会话跟踪技术 Cookie, 是HTTP协议中的请求头、响应头。 优点:HTTP协议中支持的技术 ;缺点:移动端APP无法使用Cookie;不安全,用户可以自己禁用Cookie;Cookie不能跨域(跨域区分的三个维度:协议、IP/域名、端口)
- 服务端会话跟踪技术 Session 优点:存储在服务器,安全 缺点:服务器集群环境下无法直接使用Session;Cookie的缺点;
- 令牌技术(主流技术) 优点:支持PC端、移动端;解决集群环境下的认证问题;减轻服务器端存储压力 缺点:需要自己实现
- JWT令牌(JSON Web Token) 基于JSON数据格式安全传输信息
- Header(头) 记录令牌类型、签名算法等。使用Base64编码
- Payload (有效载荷) 携带一些自定义信息、默认信息等
- Signature (签名) 防止Token被篡改、确保安全性。将Header和Payload加入指定密钥,通过指定签名算法计算而来
- 过滤器Filter @WebFilter(urlPatterns="/*"),@ServletComponentScan
- 拦截器Interceptor
![]()
- 全局异常处理器 @RestControllerAdvice @ExceptionHandler
事务管理
- @Transactional 默认RuntimeException异常的时候才回滚,rollbackFor用来控制出现何种异常类型的时候回滚事务。
将当前方法交给spring进行事务管理,方法执行前开启事务,执行完毕提交事务,出现异常回滚事务。 一般在业务层的方法上、类上 - 事务传播行为propagation。默认REQUIRED是加入事务,会受其他事务的影响;指定参数
propagation = Propagation.REQUIRES_NEW的时候才会新建事务,不受其他事务的影响,比如下订单前要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。
AOP
-
Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。
-
@Component @Aspect
![]()
-
通知类型
![]()
-
PointCut 抽取公共的切点表达式
-
通知顺序
- 同一个类中,按照方法名字排序
@Around 最外层(最先进来,最后出去)
@Before 在 @Around 的中间
@AfterReturning 在最后成功返回时
@AfterThrowing 是抛异常时执行
@After 是无论成功失败都会执行(finally)
- 不同类中,按照类名字母顺序排序。可以用@Order(数字) 来定义顺序,越小越早执行
- 切入点表达式
- execution
![]()
- execution
- @annotation,用于匹配标识有特定注解的方法







浙公网安备 33010602011771号