阿丁的笔记
2022-10-05 21:05:24 59 举报
AI智能生成
11111
作者其他创作
大纲/内容
第一阶段
Subtopic
Subtopic
第二阶段
MySQL
概念
数据库是一个存储和管理数据的仓库
分类
网状结构
层次结构
关系结构
非关系结构
一般处理海量数据,作为关系结构的补充。
MySQL简介
MYSQL_HOME:配置mysql的安装后的路径
在path中添加%MYSQL_HOME%\bin;
mysql的目录结构
bin:命令
lib:库文件
include:头文件
share:默认引擎
SQL语言
SQL:结构化查询语言
即常用的数据库操作,简称C(create)R(read)U(upadte)D(delete),增删改查
连接数据库和数据库基本命令
打开cmd窗口,输入命令:mysql -u root -p 回车后输入自定义的密码,就会连接上数据库。
show databases; 查看所有数据库
use 某个数据库的名称; 切换到某个数据库
show tables; 查看数据库中的所有的表名
数据库的所有命令需要以分号结束
数据查询
基本查询
SELECT 列名 FROM 表名
建议写出所有需要查询的列名。多个列名之间用逗号隔开。
算术运算
在查询时,可以进行算术运算,包括+ - * /,但是不能使用%进行求模运算,因为%在sql中表示通配符
别名
别名是在sql语句中给一个列名或表名一个其他的名称,使用关键字AS,该关键字也可以省略
去重
在查询结果中,如果有多行结果完全一致,可以使用distinct关键字去重,以去掉重复的行。
排序查询
在查询语句后面使用ORDER BY 列名 排序规则默认是升序
ASC升序
DESC降序
条件查询
将查询的结果根据条件进行筛选
等值查询
使用=来判断是否相等
多条件逻辑判断
可以使用AND, OR, NOT 等关键字
不等值判断
使用>、 <、 >=、<=、!=、<>来进行不等值判断
区间判断
使用BETWEEN...AND来进行区间判断,包含区间临界点
必须是由小到大,不能由大到小
NULL值判断
可以使用NULL、NOT NULL来进行为空判断
需要使用IS NULL或者IS NOT NULL,不能使用 = NULL
使用IN枚举判断
如果要得到薪资等于6000、8000、9000、10000的,可以使用OR来判断,但是IN显得更简单
模糊查询
模糊查询的关键字是LIKE,而且必须要与通配符配合才有效
通配符
_ 表示匹配一个字符
% 表示匹配0到多个字符,例如:%s表示以s结尾,s%表示以s开头,%s%表示包含s,%表示所有。
字符串一定要加上单引号,不能使用双引号,如果不使用引号,会自动识别为列名。
分支结构查询
分支结构查询相当于Java中的if-else if-else结构
语法:
SELECT CASE WHEN 条件 THEN 结果
WHEN 条件 THEN 结果WHEN 条件 THEN 结果 ELSE 结果 END FROM 表名
多个when之间不要使用逗号隔开
多个when之间不要使用逗号隔开
时间函数
基本时间查询,可以使用>、<等
字符串函数
字符串函数就是处理字符串的函数,相当于Java中的字符串函数,也可以象Java中函数的嵌套使用
在SQL语句中,如果有关键字要被使用被表名或者列名,需要在该名称两边加上符号`(此符号位于ESC按键下面)
INSERT函数既可以当作插入,也可以当作修改,也可以作为删除
在SQL的字符串函数中,位置从1开始,不是从0开始,如果写了0,会没有任何效果
LOWER(str)和UPPER(str)与Java中相同
substr()、substring()截取字符串,作用一样
聚合函数
count():数数量,使用count(1)性能最好
avg():求平均数
min():求最小值
max():求最大值
sum():求和
分组查询
关键字GROUP BY
分组过滤查询
在分组之后,可能还需要添加一些查询条件,如果是一般条件,该条件可以使用where,但是需要写在group by之前,也可以使用having,需要写在group by之后。
限定查询
使用LIMIT 跳过行数, 查询的行数
基础查询总结
基础查询语句的顺序:
(查询内容)
SELECT 列名
FROM 表名
(查询条件)
WHERE 条件
GROUP BY 列名
HAVING 条件(聚合函数)
ORDER BY 排序列名
LIMIT 跳过行数,查询行数
(查询内容)
SELECT 列名
FROM 表名
(查询条件)
WHERE 条件
GROUP BY 列名
HAVING 条件(聚合函数)
ORDER BY 排序列名
LIMIT 跳过行数,查询行数
执行顺序:
FROM 确定数据来源
WHERE 第一次过滤
GROUP BY 将数据分组
HAVING 第二次过滤
SELECT 选择部分列
ORDER BY 将结果排序
LIMIT 选取部分行
FROM 确定数据来源
WHERE 第一次过滤
GROUP BY 将数据分组
HAVING 第二次过滤
SELECT 选择部分列
ORDER BY 将结果排序
LIMIT 选取部分行
复杂查询
子查询
将查询结果作为条件(单行单列)
SELECT * FROM WHERE 列名 = (SELECT ...)
将查询结果作为条件(多行单列)
如果子查询的结果是单列多行的,可能需要使用IN,可能需要使用ALL,可能需要使用ANY
将查询结果(虚拟表)当作表做二次查询
查询结果当作表时一定要起别名
合并查询
合并查询是指将多个查询语句的结果的行拼接在一起
多个查询结果列数必须一致,且数据类型尽量保持一致
可以使用UNION或者UNION ALL来实现
区别是UNION会去掉重复(所有的列信息一致)的记录,而UNION ALL不会去重。
连接查询
内连接
内连接是指多个表通过条件建立关联,不能关联的行会被过滤
SELECT * FROM 表1
INNER JOIN 表2
ON 关联条件
INNER JOIN 表2
ON 关联条件
尽量给所有查询的列名前面加上表名(表的别名),避免出错,因为当一个列在多个表中都有时,如果不指明该列的来源,会报错
外连接
左外连接:以左边的表为主,显示所有的内连接的数据之外,还会显示左边表所有其他的没有关联的数据,对应的右边表的数据会显示NULL
右外连接:与左外连接相反,只是方向问题,可以互换
交叉连接
显示笛卡尔集,一个表5条记录,另一个表3条记录,会显示15条记录
SELECT * FROM emp e
CROSS JOIN
dept d
-- 也可以写作
SELECT * FROM emp e
,dept d
SQL语言的分类
DDL Data Definition Language 数据定义语言
CREATE, ALTER,DROP,TRUNCATE等
DML Manipulation 数据操纵语言
SELECT, INSERT, UPDATE, DELETE等
DCL Control 数据控制语言
GRANT, REVOKE等
DQL 数据查询语言
SELECT、FROM、WHERE等
TCL(TPL) Transaction Control
Process 事务控制(处理)语言
COMMIT, ROLLBACK等
DML(增删改)
添加
INSERT INTO 表名(列名...) VALUES (值...)
如果添加数据时,是全列添加,也可以省略掉列名
修改
UPDATE 表名 SET 列名1=值1, 列名2=值2, 列名3=值3... WHERE 条件
如果没有写条件,会修改表中所有的数据
删除
DELETE FROM 表名 WHERE 条件
删除时一定要加条件,否则会删除整张表中的数据
清空表
TRUNCATE TABLE 表名
DELETE 是将表中的数据一条条删除(慢),结果会有影响的行数显示
TRUNCATE 是直接将表删掉(快),然后重新创建一张表
数据表操作
创建、修改、删除表结构
整数用int,小数用double,日期用date,时间用time,日期时间用datetime或timestamp,字符串一般使用varchar,除非定长才使用char,二进制使用blob,长文本使用text
创建表结构
CREATE TABLE 表名(
列名 类型 [约束],
列名 类型 [约束],
列名 类型 [约束]
)[charset = utf8];
列名 类型 [约束],
列名 类型 [约束],
列名 类型 [约束]
)[charset = utf8];
修改表结构
ALTER TABLE 表名 操作
删除表
DROP TABLE 表名;
约束
第一范式:域完整性,列不可再分
第二范式:实体完整性,是指当前表中的主键能够唯一决定表中其他的列。primary key
第三范式:引用完整性,如果一个表与另一个表建立关联,只能引用另一个表中的主键,作为当前表中的外键
主键约束,唯一,不能为空
如果用多列作为主键,叫组合主键,此时,单列是可以重复,组合不能重复。
唯一约束,该列唯一
在创建表时,在列后面添加上UNIQUE关键字即可
自动增长列,使用AUTO_INCREMENT,从1开始,每次自增1
当自增时,如果自增列到了5,但是手动添加时添加了一个100,下次再自增就会是101
外键约束:
引用其他表的主键来关联当前表中的外键列
引用其他表的主键来关联当前表中的外键列
CONSTRAINT dept_fk FOREIGN KEY (dept_id) REFERENCES dept(id);
事务
事务的四大特征
ACID(一原久隔)
Atomicity:原子性,事务不可再分
Consistency:一致性,事务执行过程中,所有的执行状态一致。
Isolation:隔离性,事务的操作不受其他事务操作影响
Durability:持久性,事务执行后,数据会写入到数据库
DCL权限操作
创建用户
语法:CREATE USER 用户名 IDENTIFIED by 密码;
语法:CREATE USER 用户名 IDENTIFIED by 密码;
授权:
语法:GRANT 权限名(ALL) ON 数据库.表 TO 用户名;
权限名:SELECT、DELETE、UPDATE、INSERT等,如果要授予全部的权限,可以直接用ALL
数据库.表可以使用*作为通配符
语法:GRANT 权限名(ALL) ON 数据库.表 TO 用户名;
权限名:SELECT、DELETE、UPDATE、INSERT等,如果要授予全部的权限,可以直接用ALL
数据库.表可以使用*作为通配符
撤销:
语法:REVOKE 权限名(ALL) ON 数据库.表 FROM 用户名;
语法:REVOKE 权限名(ALL) ON 数据库.表 FROM 用户名;
权限的修改,要想生效,需要刷新
FLUSH PRIVILEGES
删除用户:
语法:DROP USER 用户名;
语法:DROP USER 用户名;
视图
视图是一种虚拟的表,作用是将复杂的sql操作变得简单。
视图主要是用来简化查询,也可以有条件做一些DML操作,但是尽量不要做DML操作。
语法:
创建视图:
CREATE VIEW 视图名 AS 查询语句
创建视图:
CREATE VIEW 视图名 AS 查询语句
修改视图:
方法一:CREATE OR REPLACE VIEW 视图名 AS 查询语句
方法二:ALTER VIEW 视图名 AS 查询语句
方法一:CREATE OR REPLACE VIEW 视图名 AS 查询语句
方法二:ALTER VIEW 视图名 AS 查询语句
删除视图:
DROP VIEW 视图名
DROP VIEW 视图名
JDBC
概念
Java Database Connectivity Java数据库连接
名词解释
驱动:对应的数据库生产厂商提供的数据库的操作的代码
jar包:数据库生产厂商提供的数据库的操作的代码会进行打包,打包后以jar为后缀名,所以也称为jar包。
操作流程
业务代码 -> java中提供的通用接口 -> 找到对应的数据库厂商提供的实现类 -> DB
jar包与数据库的版本要对应
通用接口
DriverManager:驱动管理类,作用是获取数据库的连接
Connection:数据库连接接口
Statement:数据库操作接口
PreparedStatement:数据库操作接口
ResultSet:查询的返回结果
数据库操作步骤
基本增删改操作
基础封装
新建一个dao(data access object数据访问对象)包,来放数据库操作(此处是JobDAO),新建util包存放数据库连接帮助类DBConnection
java中提供一个接口PreparedStatement来进行数据库操作。
查询操作
如果是单表,直接使用对应的实体封装即可
如果是多表,可能没有合适的实体来封装,此时可以创建一个新的实体来封装。
常见异常
ClassNotFoundException:类找不到异常,一般原因是数据库驱动没有导入
SQLException:数据库操作错误,一般原因与数据库相关
Duplicate Entry for Primary Key,主键重复,一般是添加时主键相同
MySQLSyntaxErrorException:数据库操作语句有问题
使用Properties文件来优化连接
使用Properties文件来保存连接信息,再在代码中去加载相应的信息。
在工程中添加resources文件夹,并Mark Directory As Resources Root
在resources文件夹中添加properties文件
修改DBConnection文件
对象关系映射
ORM,Object Ralational Mapping,对象关系映射。
将实体类的对象与关系型数据库的表中的一条记录相对应,让实体类中的属性与表中的列相对应
service层
service层是业务逻辑层,该层会包含多个数据库操作,以及复杂的业务逻辑
开发的流程,应该是view层-> service层->DAO层
事务
创建连接后,使用conn.setAutoCommit(false);来关闭自动提交
在操作成功后使用conn.commit()来提交事务
在操作失败后使用conn.rollback()来回滚事务
如何来正确的执行事务:采用ThreadLocal类
ThreadLocal类
ThreadLocal是使用当前线程关联一个map,将数据放入到该map中进行共享
所以ThreadLocal主要作用是将数据进行线程内共享
三层架构
界面层:User Interface Layer (view)
业务层:Business Logic Layer (service)
数据访问层:Data Access Layer (dao)
DAO的封装
将增删改操作,封装成一个方法。
数据库连接池
连接池是对数据库连接进行的管理
常用的连接池有c3p0、DBCP、druid
DBUtils
是Apache的一个对JDBC简单封装的一个帮助类
导入相关依赖。commons-dbutils-1.7.jar
编写相关代码
查询时可以使用以下的结果来封装
BeanHandler:封装单个对象
BeanListHandler:封装集合对象
ScalarHandler:封装单行单列数据,例如查询条数(long类型)
BeanHandler和BeanListHandler原理是采用反射处理的
要求实体类属性与数据库字段名必须一致
要求实体类属性与数据库字段名必须一致
如果实体类属性名称和列名不一致时,可以使用ResultSetHandler
HTML
结构标签
html:根标签
head:头部
title:标题
body:正文
排版标签
用来实现页面布局
注释标签:`<!-- 注释内容 -->`
换行标签:`<br/>`,br标签没有结束标签
段落标签:`<p></p>`,让标签中的内容独立成为一段
换行标签与段落标签的区别:两种标签都可以换行,但是换行标签仅仅只是折行,段落标签会空一行
水平线标签:`<hr size="70px" color="#ff0000" width="50%" align="left"/>`
标题标签
h1~h6是标题标签
块标签
`<div>`:行级块标签,独占一行,与p标签的区别在于没有空行
`<span>`:行内块标签,允许多个标签在一行
文字标签(应该使用样式来替代)
`<font>`:设置文字大小颜色以及字体。
文本格式化标签(不常用)
`<b>`、`<strong>`:加粗(黑体)
`<em>`、`<i>`:斜体
`<sub>`:表示文字变小,并放到下角
`<sup>`:表示文字变小,并放到上角
`<del>`:文字删除线
`<em>`、`<i>`:斜体
`<sub>`:表示文字变小,并放到下角
`<sup>`:表示文字变小,并放到上角
`<del>`:文字删除线
列表标签
无序列表
`<ul>`标签作为根标签,列表项使用`<li>`标签
默认type是实心圆,disc,可以改成空心圆circle,或者黑色方块square
有序列表
<ol>`标签作为根标签,列表项使用`<li>`标签。
默认type使用数字作为序号(type="1")
可以改成A(大写字母),a(小写字母),i(小写的罗马数字),I(大写的罗马数字)
列表嵌套
无序列表和有序列表之间可以相互嵌套,嵌套后会自动缩进
图片标签
图片使用`<img>`标签在页面上显示
尽量使用相对路径,不要使用电脑上的盘符路径,可以使用网络路径
常见属性
src:图片的路径
width:宽度
height:高度
align:对齐方式,一般用于图文混排
alt:提示文字
title:提示文字,
vspace:垂直(上下)空出空间
hspace:水平(左右)空出空间
宽度和高度只需要设置一个,另一个会等比缩放
链接标签
基本使用
使用`<a>`标签来使文字或图片能进行跳转
href:作用是跳转的页面地址,如果要跳到网站,只需要页面的相对路径
target:设置页面打开的方式
_blank:在新的窗口中打开
_self:在当前窗口打开(默认值)
_parent:在父窗口中打开
_top:在顶层窗口中打开
自定义:在自定义的窗口中打开
锚点
在指定的位置定义一个锚点,可以在其他的位置使用链接直接跳转到当前锚点
定义锚点:`<a name="锚点名称"></a>`
跳转锚点:`<a href="页面#锚点名称">文本或图片内容</a>`
跳转到其他页面的锚点,需要写页面的名称,跳转到当前页面的锚点,只需要写锚点名称即可
<a href="#bottom1">跳转到底部</a><br/>
<a name="top1"></a>
<!-- 省略中间很多内容-->
<a name="bottom1"></a>
<a href="#top1">回到顶部</a><br/>
表格标签
表格标签是在页面上显示表格的标签
使用`<table>`、`<tr>`、`<td>`、`<th>`来实现。
table:表格的根标签
tr:行
td:单元格
th:显示标题单元格(会自动居中,黑体)
基础表格用来显示数据内容
合并单元格
表单标签
表单标签用于收集不同类型的用户输入数据
form标签
action:表示表单数据提交到服务器的地址
method:表示表单提交的方式,默认为get,可以设置为post
enctype:表单表单数据提交的类型,一般是指是否有文件上传等
常用表单元素
不常用的表单元素
下拉框和文本域
select表示下拉框
name属性表示名称
下拉框一般是单选
multiple表示支持多选
一般不常用
文本域
rows表示行数
cols表示列数
框架标签
框架集frameset【有些浏览器不支持】
采用frameset将页面分为多个部分,然后每个部分集成一个页面
iframe
其他标签
link:引用样式表
script:引用JavaScript
特殊字符:
空格: ;
小于号:`<`
大于号:`>`
注册符号:`®`
版权符号:`©`
双引号:`"`
人民币符号:`¥`
CSS
HTML页面三元素
HTML标签:决定页面上的内容主体
CSS样式表:对页面上内容主体进行美化
Javascript脚本:对页面上的内容或者样式进行动态处理
CSS简介
cascading style sheets,层叠样式表,简称样式(表)
作用是将页面上的元素进行美化。
基本语法
语法结构:选择器名称{样式属性名:值;属性名:值}
导入方式
内联
直接在HTML标签中写样式。通常使用标签的style属性
内部
在HTML页面的Head标签中来定义样式,通常使用style标签来定义
外部
在专门的css文件中定义样式,然后在页面引入样式
使用@import来引入
基本选择器
选择器:指对页面HTML元素的选取
常见有三种
元素(标签)选择器
直接使用元素标签作为选择器名称,表示当前页面上所有的该标签都引用该样式
ID选择器
使用HTML元素的ID名称作为选择器的名称,并且在前面加个#。表示只有此名称的id对应的元素才会引用
当ID选择器与标签选择器属性冲突时,ID选择器优先
class(类)选择器
为多个HTML元素同时可以引用的样式
语法:在定义样式时,自定义一个名称,前面加一个.
在HTML元素中需要使用class属性来引用
在HTML元素中使用class属性引用时不要加.
选择器的优先级
ID选择器>类选择器>标签选择器
其他选择器
属性选择器
使用元素的属性名称(可以自定义属性)对应属性值,来选中相应的元素
伪类选择器
伪类选择器是针对部分标签的某种状态使用的选择器
a标签的四个伪类
link:代表打开页面超链接的原始状态
visited:链接被访问过后的状态
hover:鼠标悬停在超链接上的状态
active:当鼠标被按下去的状态
层级选择器
后代选择器:
语法:父级选择器 后代选择器
父级选择器里面的所有的后代选择器(不论是多少层级)
子级选择器
语法:父级选择器>子级选择器
父级选择器里面的所有的子级选择器。(只能是一层)
文字属性和文本属性
文字属性font
font-size:大小
font-family:字体
font-style:斜体等
font-weight:粗细
文本属性
color:文本颜色
text-indent: 2em 首行缩进,2em表示两个字,无论字体多大
text-decoration: line-through 设置文本的装饰线
text-align: center 文本对齐方式。[注意:]()是在父级容器中的对齐方式
text-shadow: 5px 5px 5px rgba(0,0,0,0.5); 文本阴影 (水平偏移 垂直偏移 模糊值 颜色)
line-height:行高。
背景、列表和显示属性
背景属性
background-color:背景颜色
background-image:背景图片,当容器大小比图片小时,背景图片只会显示局部。容器大,图片小时会自动向水平和垂直方向重复。
background-repeat:重复方式。no-repeat不重复,repeat-x:水平重复,repeat-y:纵向重复,repeat默认值。
background-position:背景定位。当容器大小比图片小时,背景图片只会显示局部,此时可以通过position来设置容器中显示背景图片的位置。(可以使用像素100px等,也可以使用bottom top right left之类的关键字)
列表属性
list-style-type:列表前面的图标,disc,circle,square等,使用none可以不显示任何图标。
list-style-image:列表前面使用自定义的图片来替代图标。
list-style-position:默认值是outside,表示图标在ul的区域,如果使用inside,图标会在li的区域。
尺寸显示属性
width:宽度,可以使用百分比或大小
height:高度,可以使用百分比或大小
outline-width: 10px; 轮廓宽度
outline-color: blue; 轮廓颜色
outline-style: dashed; 轮廓线条的样式
div是块级元素,独占一行,可以直接设置宽高,即使宽高不足一行,也会占据一行的位置
span是行级元素,会多个元素在一行,设置宽高也无效,只会与内容等宽高
display:显示方式
- block,按块显示(类似于div),
- inline,按行显示(类似于span),当前元素按行显示
- none,隐藏元素,连空间都不会占据。
- flex,当前元素中的子元素按行显示
- inline-block,当前元素按行显示,子元素按块显示
浮动属性【不推荐使用】
float:浮动属性
- left:浮动到左边
- right:浮动到右边
clear:规定元素的那一边不允许出现浮动元素
- left:左边不允许
- right:右边不允许
- both:两边都不允许
- none:默认值,允许
定位属性
position: 元素的位置
- absolute 绝对定位,通过位置(坐标)来设置元素的位置。
- static 默认值
- fixed:固定在屏幕的位置
- relative:当容器中的元素使用绝对定位时,是以整个浏览器为参照物,如果希望以外部的容器作为参照物,且外部的容器还是留在原来的文档布局中,那么外部容器需要使用相对定位
盒子模型
将元素看作一个盒子,元素与边框的距离叫内边距(padding),边框与其他元素的距离叫做外边距(margin)
边框
border:
- border-style:线条的形式(虚线,点线,双线等)
- border-width:宽度
- border-color:颜色
可以缩写为:border: 1px solid red;(width,style,color)
外边距
margin:边框与其他元素的距离
margin-top, margin-left等
margin: 5px 10px 15px 20px,上右下左
margin: 20px; 相当于设置4边的距离。也是一种缩写。
margin: 10px 60px; 上下10px,左右60px
margin: 10px 60px 120px; 上10px,左右60px,下120px
内边距
padding:边框与当前元素的距离
扩展属性
圆角
border-radius: 设置边角为圆角效果。
border-radius:10px 50px 80px 100px; 左上、右上、右下、左下
如果需要把元素设置为圆形,需要把圆角设置为元素的宽度的一半
阴影
box-shadow:设置元素的阴影
box-shadow: 5px 5px 5px rgba(0,0,0,0.5); 文本阴影 (水平偏移 垂直偏移 模糊值 颜色)
Javascript
简介
JavaScript(后面简称JS),是一门动态类型、弱类型的解释性脚本语言
主要用来给网页上的HTML元素或者CSS添加动态行为
组成
ECMAScript:标准的页面script语言
DOM:针对页面HTML元素添加的操作
BOM:针对浏览器添加的操作
JS的使用方式
类似CSS的内联、内部、外部,JS也分为此三种使用方式
1、直接在HTML标签中编写。
2、在页面的任意位置编写。
推荐写在最后。好处是先把整个页面加载出来后再加载js,用户体验相对较好
使用`<script></script>`标签来编写
3、在JavaScript文件(后缀名是js)中编写,然后在页面引入该文件
推荐写在最后。好处是先把整个页面加载出来后再加载js,用户体验相对较好。
基本语法
变量
var num = 15;
var 可以不写,分号可以不写
基本类型
Number、String、Boolean、Undefine、Null
可以通过typeof(变量名或表达式)来得到变量的类型
引用类型
在JS中引用类型就只有一种Object
数组是一种Object,map(也作为各种类型)也是一种Object
object的这些写法,称为JavaScript Object Notation 即JS对象标记,简称JSON
运算符
算术运算符与Java的用法一致
赋值运算符与Java中一致
逻辑运算符与Java中一致
关系运算符与Java中基本一致
在JS中是比值。例如:1=="1",返回true
在JS中===(全等于)是即比较值还比较类型
三元(目)运算符与Java中一致
分支结构
if结构与Java用法一致
但是判断条件与Java有区别,Java中判断条件必须是布尔值
而JS中0、null、undefine、NaN表示false,其他表示true。
switch与Java一致
循环结构
JS中的for的基本用法,while、do-while、break、continue与Java一致
for循环中一定不要写int i,JS中没有int
for...in循环
函数
函数的定义与调用
函数定义的语法:
function 函数名(参数列表){
}
function 函数名(参数列表){
}
函数调用的语法:
函数名()
函数名()
传入的参数都是按顺序匹配
可以传相应的参数,也可以少传或不传
函数变量
类似于Java中方法引用
函数参数
匿名函数
函数的返回值
弹窗函数
alert(msg):弹出一个带确定按钮的提示框
confirm(msg):弹出一个带确定取消的提示框。
prompt(提示信息, 默认值):弹出输入框
常用函数
parseInt:将字符串转换为整数,也可以将浮点数转换成整数
parseFloat:将字符串转换成浮点数,与上面的函数作用相似
isNaN:检查某个值是否不是数字
toFixed(n):保留n位小数
事件
change事件
onchange:HTML元素内容改变
鼠标相关事件
onclick:鼠标单击事件,能看到的元素才能点击
鼠标其他相关事件:
// onmousedown 鼠标按下
// onmouseup 鼠标弹起
// onclick 鼠标单击
// onmouseenter 鼠标移动到元素里 等同于onmouseover
// onmouseleave 鼠标从元素里移到外面其他地方 等同于onmouseout
// onmousemove 鼠标在元素上移动会一直重复调用
// onmousewheel 鼠标移动到元素上方,然后滚动滚轮会重复执行
键盘相关事件
// 需要光标在该元素上
// onkeydown键盘按下事件
// onkeypress键盘敲击事件
// onkeyup键盘弹起事件
光标相关事件
需要元素具备获得(光标)焦点的能力
// onblur 失去光标事件
// onfocus 获得光标事件
// onfocus 获得光标事件
其他常用事件
onload:页面加载完成事件
onsubmit:表单提交时执行
正则表达式
正则表达式是一个用来匹配字符串的格式的表达式
在项目中一般用来验证字符串是否符合要求或者检索字符串中的内容。
语法
1、new RegExp(pattern, modifiers)
2、/pattern/modifiers
修饰符
`i` 不区分大小写
`g` 全局匹配,而不是匹配到第一个就停止
`m` 多行匹配
格式
字符的匹配,表示匹配一个字符
`[abc]`匹配括号中的任何一个字符
`[^abc]`匹配不是括号中的任何一个字符。
`[0-9]`匹配任意一个数字。
`[a-z]`匹配任意一个小写字母。
`[A-Z]`匹配任意一个大写字母。
`[A-z]`匹配任意一个大小写字母。
`(red|blue|green)`表示匹配三个单词中的任意一个单词
元字符,有特殊含义的字符,一般可以看作转义字符
`.`匹配单个字符,除了换行符和行结束符
`\w` 匹配单词字符(字母数字下划线)
`\W`匹配非单词字符
`\d` 数字
`\D` 非数字
`\s` 空白字符
`\S` 非空白字符
量词,表示重复的次数
`+` 表示一到多 (一个或多个,至少要有一个)
`*` 表示0到多(零个到多个)
`?`表示0到1个
`{n}` 表示n个
`{n,}` 表示至少n个
`{n,m}` 表示n个到m个
表达式的开始和结束:
`^`:开始
`$`:结束
正则表达式常用方法
reg.test(str):表示判断字符串是否与表达式匹配
str.match(reg):表示找到字符串中正则表达式的匹配
DOM
Document Object Model文档对象模型
整个网页当作一个文档(document),又分为Head和Body,Body和Head中间又有很多元素,这些元素都可以使用文档对象来操作
查找DOM对象
1、getElementById 根据id查找单个对象
2、getElementsByName 根据元素的name来获取一组元素。
3、getElementsByTagName 根据元素的标签名称来获取一组元素
4、getElementsByClassName 根据class属性值获取一组元素
修改元素内容
标签中间的叫做内容。例如:`<a href="1.html">体育频道</a>` 体育频道就是内容
1、innerHTML属性能够设置或者获取内容,以html标签的方式
2、innerText属性能够设置或者获取内容,以文本的方式
document.write表示将页面document中的元素删除掉,换成新的内容
修改元素属性
修改页面元素的属性值。例如:`<a href="1.html">体育频道</a>` 1.html就是href属性的值
1、直接使用对象.属性来设置或获取值
2、使用getAttribute和setAttribute方法
修改CSS
1、获取style对象
2、通过属性来设置css
var v = document.getElementById("div1");
alert(getStyle(v, "width"));
v.style.width = "300px";
动态操作事件
可以动态的给元素添加或移除事件
可以直接使用对象.onclick=函数
使用此方式只能给元素指定一个点击事件,如果多次指定,以最后一次为准。
也可以使用addEventListener和removeEventListener方式来添加和移除事件
addEventListener可以多次添加事件,所有的事件都会执行。移除事件必须指定移除的事件函数
addEventListener和使用onclick指定的函数之间没有不能相互影响
创建和删除元素
创建元素分两步:1、创建元素对象,2、添加到指定的位置
删除元素需要先获取元素,后删除。
BOM操作
BOM,Browser Object Model(浏览器对象模型)。
主要是指浏览器中的一些组件操作。
主要是指浏览器中的一些组件操作。
window:窗口,整个js的顶层对象
history:历史,前进,后退等
location:地址栏操作
screen:屏幕尺寸等
navigator:得到浏览器的信息等。
window
顶层对象,直接能够使用的函数,都可以使用window来调用
screen对象
屏幕高度和宽度描述对象
location对象
对浏览器地址栏操作。
得到地址栏的地址。
通过改变地址栏的地址来跳转页面。
history对象
操作历史页面进行前进后退操作
前提是必须要有浏览历史
navigator
获得浏览器相关的信息
定时器
定时执行任务。
setTimeout(function, time); // 单位是毫秒,作用是定时执行一次任务。
setInterval(function, time);作用是定时不间断执行任务。(多次)
clearTimeout(对象); 停止执行
clearInterval(对象);停止执行
类和对象的使用方式
可以采用函数的类似构造方法的方式来定义类
JQuery
简介
JQuery是一个JS的框架,能够简化JS的操作
有非常多的选择器,能够快速的找到需要操作的页面元素。
JQuery的基本使用方式
两种方式引入jQuery框架
下载到本地并引用
使用CDN
https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.min.js
jQuery的两种版本
一般的js都会分为开发版(完整版)和产品版(min版)
适合于开发时查看和调试源代码。体积比较大
min版:体积较小,是一种混淆的代码版本
jQuery选择器
jQuery的语法:`$(内容)`
`$(document).ready(函数)可以简写为$(函数)`
基本选择器
- id选择器
$("#id")等同于document.getElementById("id")
- 标签选择器
$("div")等同于document.getElementsByTagName("div")
class选择器
$(".btn")等同于document.getElementsByClassName("btn")
*选择器
$("*")表示得到页面所有元素
selector1,selector2,selectorN多种选择器组合
$("div,#btn,.c1")表示得到包含所有的div以及id为btn以及class为c1的一组元素
层级选择器
p c:空格表示所有的后代元素
p>c:表示所有的子元素
p+n:表示当前元素后面的第一个元素(兄弟)
p~s:表示所有的兄弟元素
常用索引操作选择器
:first 第一个元素
:last 最后一个元素
:not() 取反,例如:not(:first) 除了第一个
:even 得到所有的偶数索引(0、2、4)元素
:odd 得到所有的奇数索引(1、3、5)元素
:eq(index) 得到某一个索引元素
:gt(index) 得到大于某一个索引的所有元素
:lt(index) 得到小于某一个索引的所有元素
内容选择器
:empty 内容为空的元素
:contains(text) 内容包含某文本的元素
:has(selector) 内容包含其他选择器元素
:parent 包含有内容的元素
可见性选择器
:hidden 得到隐藏元素
:visible 得到没有隐藏的元素
属性选择器
[属性名] : 得到包含某属性的元素
[属性名=value] : 得到某属性匹配value的元素
[属性名!=value] : 得到某属性不匹配value的元素
[属性名^=value] : 得到某属性匹配以value开头的元素
[属性名$=value] : 得到某属性匹配以value结尾的元素
[属性名*=value] : 得到某属性匹配包含value的元素
`[属性名][属性名*=value]` :可以同时使用多个属性选择器
子元素选择器
:first-child 得到所有的第一个子元素
:last-child 得到所有的最后一个子元素
:nth-child(index) 得到所有的第index号子元素
表单选择器
针对表单元素的选择器。
:input 得到所有的input元素
:text 得到所有的文本框
:password 得到所有的密码框
:radio 得到所有的单选框
:checkbox 得到所有的复选框
:submit 得到所有的提交按钮
:image 得到所有的图片域
:reset 得到所有的重置按钮
:button 得到所有的普通按钮
:file 得到所有的文件域
:hidden 得到所有的隐藏表单域
表单对象属性选择器
enable 得到所有的没有disabled属性的表单元素
:disabled 得到所有的有disabled属性的表单元素
:checked 得到所有的选中的单选复选框
:selected 得到所有选中下拉框选项
属性操作
属性基本操作
获取属性值:
attr("属性名称")
prop("属性名称")
设置属性值:
attr("属性名称", "属性值")
prop("属性名称", "属性值")
删除属性:
removeAttr("属性名称")
removeProp("属性名称")
文本操作
text():获取标签文本内容,等同于innerText
text("内容"):设置标签文本内容,等同于innerText="内容"
html():获取标签内容,等同于innerHTML
html("内容"):设置标签内容,等同于innerHTML="内容"
val():获取元素的值,等同于.value
val("内容"):设置元素的值,等同于.value="内容"
CSS操作
直接对CSS操作:
通用方法:
css("css属性名称"):获取css属性的值
css("css属性名称", "css属性值"):仅设置一个属性值,
如果要设置多个css属性值,需要使用对象:css({"css属性名称1":"css属性值1", "css属性名称2":"css属性值2"})
如果要将已经写好的样式表中的样式进行操作:
addClass("className"):添加指定的样式
removeClass("className"):删除指定的样式
removeClass():删除所有样式(注意,只会删除通过addClass添加的样式)
toggleClass("className")存在样式就删除该样式,不存在就添加该样式
文档操作
内部插入:
a.append(b):表示向a标签中最后追加内容b
a.appendTo(b):将标签a追加到b标签中最后面
a.prepend(b):表示向a标签中最前面插入内容b
a.prependTo(b):将标签a追加到b标签中最前面
外部插入:
a.after(b):将a添加到b标签的后边
a.before(b):将a添加到b标签的前边
包裹
a.wrap(b):将b标签包裹在a标签外面
a.unwrap():将a标签外面包裹的标签去掉
删除:
a.empty():将a里面的内容删除掉
a.remove():将a删除
筛选
过滤
与前面的部分选择器作用相同,区别在于,如果使用选择器是静态选择,使用过滤是动态过滤。
first()、last()、eq(index)、has()、not()
hasClass()判断是否存在某样式。
filter():通过的过滤,例如:$("p").filter(".selected, :first")
查找
children() 所有子元素
find() 查找,例如:$("p").find("span")
next() 后面的元素
prev() 前面的元素
siblings() 兄弟元素
parent() 父元素
parents() 所有祖先元素
事件
给元素添加事件。事件的名称即原生的事件名称去掉on。例如:click、change、blur
one("事件名称", 事件函数) :仅执行一次的事件。
动画
show(millseconds) 显示 ,有一个简单的动画
hide(millseconds) 隐藏,有一个简单的动画
滑动:
slideDown
slideUp
slideDown
slideUp
淡入淡出
fadeOut
fadeIn
fadeOut
fadeIn
自定义动画
animate
stop 停止
animate
stop 停止
其他通用函数
$.each(arr, function(index, obj){}) 循环
$.trim(str) 字符串去掉两边空格
多库共存
如果其他js的库占用了`$`,此时可以直接使用jQuery来替换`$`。如果需要重新定义一个符号来替代`$`的作用
可以使用以下方式:
// 如果其他js的库占用了$,此时可以直接使用jQuery来替换$
var j = jQuery.noConflict();
// 基于 jQuery 的代码
j("div p").hide();
jQuery与原生js之间的转换
使用[0],将jQuery对象转换成原生对象。
使用$(),将原生对象转换成jQuery对象。
AJAX
JSON简介
JSON JS对象标记。是指JS中的变量值。
JSON与XML格式
JSON:体积较小。适用于一般互联网的数据传输。
XML:非数据内容(标签)比较多,导致体积较大。描述清晰,有多种头的格式,适用于功能要求较高的数据。
JSON解析
JSON作为数据传输格式,会随着请求或响应来进行传递,涉及到将Java对象转换成json格式,或者将json格式转换成Java对象的过程称为JSON解析
在Java中一般使用第三方库来处理JSON解析问题:
常见有以下三种库:
阿里公司的FastJson
Jackson
Google的Gson
浏览器页面json的解析
// 转换成json字符串
JSON.stringify(s);
// 转换成json对象
JSON.parse(str);
AJAX简介
AJAX全称是asynchronous javascript and xml
AJAX是一种页面局部刷新机制
AJAX实现步骤
1、创建xmlhttprequest对象
var req = new XMLHttpRequest();
// 如果需要支持IE6,要使用以下方式
if(window.XMLHttpRequest){
req = new XMLHttpRequest();
}else{
req = new ActiveXObject("Microsoft.XMLHTTP");
}
2、设置回调函数
// status状态码:200、404
// readystate是Ajax执行过程步骤,分为0-4,0表示开始,4表示接收结果完毕。
req.onreadystatechange = function(){
if(req.readyState == 4 && req.status == 200){
}
};
3、打开连接
req.open(method, url, asyn);
// method: get ,post
// url请求发送地址
// asyn: 是否异步,true默认值,异步,false, 同步
4、发送请求
req.send(params);
params: 发送给服务器的数据,一般用于post请求,因为get请求数据直接放到url上
AJAX响应
req.responseText : 得到响应的文本
req.responseXML:得到响应XML格式
JSP
概念
JSP全称Java Server Pages,Java服务器页面。
作用是动态显示页面数据,代替Servlet。
JSP的基本使用
1、脚本,在页面上写Java代码:
语法:`<% java代码; %>`
2、显示,显示变量的值:相当于out.print()
语法:`<%= 变量名 %>`
3、声明,在页面上定义方法,变量
语法:`<%! 方法或者变量 %>`
[注意:]()使用声明的方式定义的变量是属性,使用脚本定义的变量是临时变量。
4、注释,服务端注释,不会发送到客户端
语法:`<%-- --%>`
`<!-- -->`这是html上的注释,会发送到客户端。
JSP的执行原理
JSP本质上就是一个Servlet,作用是简化了页面开发,避免大量的out.print()编写。
jsp并不会直接执行,会先转译(翻译)成servlet源代码,再编译成字节码,最后运行。
可以在tomcat的work目录中找到对应的翻译后的servlet源代码。
JSP指令
JSP指令主要是用来设置页面属性。
page指令:设置页面属性
属性:
language:语言,默认是java,也只能是Java,可省略
contentType:页面格式与字符集
pageEncoding:页面字符集,与contentType只需要存在一个即可
session:默认为true,页面是否允许使用session
import:导入包
isErrorPage:指定当前页面是否错误页面,当为true时,页面为错误页面,此时可以使用exception对象
errorPage:指定当前页面如果出现异常会跳转到哪个页面
isELIgnored:设置页面是否忽略EL表达式。默认是true
如果使用jsp设置错误页面,可以直接在web.xml中进行全局设置,不需要每个页面设置errorPage
include指令:一个页面包含另一个页面
taglib指令:导入自定义(第三方)的标签库
JSP标准动作[了解]
JSP在运行时的一些命令
语法:
使用`<jsp:命令名称>`
include动作
是指一个页面包含另一个页面。
JSP页面上的include动作和include指令区别?
include指令属于静态包含,在jsp转译成Java源代码(servlet)时,就将两个jsp放入了一个源代码中。然后再编译运行。
include动作是动态包含,在jsp转译成Java源代码(servlet)时,会将两个文件分别转译,并编译成字节码,直到运行时才会加载包含的页面。
useBean、setProperty、getProperty
useBean创建一个对象,setProperty给该对象设置属性,getProperty获取该对象的属性。
forward和param
forward跳转页面,请求转发
param在forward动作内部使用,表示请求转发时传递的参数。在转发后的页面上可以使用request.getParameter来获取
内置对象
在JSP页面上不需要定义就可以直接使用的对象。也叫隐式对象。一共有九个
输入输出对象
request:接收用户请求,作为输入对象
response:返回用户响应,作为输出对象
out:返回用户响应,作为简单输出对象
作用域对象
都是一个使用键值对的集合。有共同的setAttribute和getAttribute、removeAttribute方法。
pageContext:只在同一个页面有效。
request:在请求转发相关的页面有效。
session:一次会话。在同一个浏览器中项目相关的所有的页面有效(除非手动销毁或删除,关闭浏览器,超时)。通常用来存放用户相关信息(用户基本信息、权限信息等)。
application:存放在服务器上,所有的用户共享。除非手动删除、关闭服务器。通常用来存放服务器设置数据。用户能不使用就不要使用
由小到大:pageContext < request < session < application
使用经验:尽量使用request,用户信息可以放session,尽量不用application。
servlet相关配置对象
config:servlet的配置
page:servlet本身,当前对象,this
exception对象
exception:异常对象,包含出现异常的信息,只能在错误页面才能使用
EL表达式
常用方式[重点]
EL表达式,Expression Language表达式语言,
作用主要是在页面上显示数据
在EL表达式相对应的名字分别为:pageScope、requestScope、sessionScope、applicationScope
语法:
`${某个作用域内的对象.属性名称}`,注意,此时并非真的是属性名称,应该是get方法的简写
`${某个作用域内的对象.属性名称}`,注意,此时并非真的是属性名称,应该是get方法的简写
lombok生成的get方法是普通的规则,如果属性的第一个或第二个字母大写,会出现一些问题。建议第一个和第二个字母都不要大写。
显示数组和集合的数据
显示数组或list中的数据直接使用下标。
显示map直接使用map的key作为下标或属性名称
EL表达式中,所有的.属性都可以与[]互换,[]中单引号和双引号没有区别。
运算符
在EL表达式中,会先把运算符左右的内容转换成数字再运算,不会拼接字符串之类。单引号与双引号没有区别。
整数相除可能会出现小数。
and or eq not lt gt le ge
empty判断空值
隐式对象
EL表达式中也定义一些隐式对象:例如:pageScope等
JSTL
全称是JSP(Java Server pages) Standard Tag Library, JSP标准标签库
流程逻辑处理(if,for) core 核心标签库
数据库操作 sql 【基本不使用】
国际化和格式化操作 fmt 【很少使用】
xml处理 xml 【基本不使用】
使用步骤
1、导入依赖 jstl-1.2.jar
2、在页面使用taglib指令导入要使用的标签库
`<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>`
3、在页面使用标签
条件标签
if标签
if 与Java中的if一样,但是没有else,else-if
多重分支标签
语法是:choose标签表示多重分支的开始和结束
迭代标签
foreach标签
基本语法:
items:要迭代的集合或数组 [注意:]()要使用EL表达式
var:临时变量名
begin:从第几个开始迭代
end:迭代到第几个
step:步长,每几个显示一个
varStatus:得到集合中循环过程中的一些信息(例如:下标)
格式化标签
属于国际化与格式化标签库。
时间或数字格式化等
out标签
显示数据。
一般情况下,EL表达式就可以显示数据,
基本不会使用out标签,但是如果希望能够将html标签代码直接以文本的形式显示,
而不要显示执行后的效果,就需要使用out标签
基本不会使用out标签,但是如果希望能够将html标签代码直接以文本的形式显示,
而不要显示执行后的效果,就需要使用out标签
MVC模式
MVC模式,即Model、View、Controller模式,模型视图控制器。
Model:模型,JavaBean,即实体类,DAO、service等类都称为JavaBean。
View:视图,采用JSP开发界面。
Controller:控制器,接收并处理用户请求,并给予响应。采用Servlet开发。
MVC模式作用是将视图和模型分离,采用控制器来处理用户请求
Servlet的抽象
可以编写BaseServlet来实现方法的分发,其他的Servlet继承该BaseServlet
分页代码编写
Servlet
CS架构和BS架构
CS架构,Client/Server,客户端以及服务器
运行流畅、显示效果非常好
BS架构,Browser/Server,浏览器以及服务器
无需下载、更新是后台进行,浏览器中无察觉,无需考虑兼容性
BS架构主要是http协议。
CS架构TCP、UDP、FTP、HTTP
CS架构TCP、UDP、FTP、HTTP
服务器
web服务器是运行和发布web应用的服务器。
运行:将web项目启动
发布:将web项目发布到网络中,让其他的用户可以通过浏览器访问
静态资源:HTML、CSS、JS
动态资源:Servlet、JSP
在Java中,动态资源访问的技术统称Java web技术
Tomcat服务器
tomcat是Apatch基金组织所有的一个开源免费的使用Java开发的web服务器
目录结构:
bin:可执行文件
conf:配置文件
lib:运行所需的jar包
logs:运行产生的日志文件
temp:临时文件
webapps:所有的web应用运行和发布目录
work:jsp生成的servlet和编译后的字节码存放的位置
在webapps下面创建一个项目first,项目中再创建一个WEB-INF目录,WEB-INF目录中应该包含一个web.xml文件以及一个lib文件夹和一个classes文件夹。这是一个标准的web项目目录结构。
HTTP协议
概念
HTTP协议:超文本传输协议,即在网络中传输HTML相关信息的协议
特点:无状态
HTTP协议报文
请求报文
请求报文包含请求头和正文信息。
请求头中包含:method:GET或者POST,请求的url(地址栏中的地址),协议版本,IP地址端口号,请求类型(text/html;),语言(中文zh-CN)、浏览器系统等信息
请求正文:包含用户提交的数据信息,格式为:key1=value1&key2=value2&key3=value3
响应报文
响应报文包含响应头和响应正文。
响应头:协议版本,状态行(状态码和响应的描述)。例如:200 OK,表示请求和响应成功。还包含时间、响应的内容类型(text/html;charset=utf-8),内容的长度。
响应正文:html内容。
常见的状态码:
200 OK 请求成功
400 请求参数不合法
403 forbidden 无法执行请求
404 not found 资源无法找到
405 not support 请求不支持(GET、POST)
500 服务器代码问题
Servlet
Servlet概念
是服务器端的一段代码,作用是为了接收客户端的请求,并且返回给客户端响应。
请求:链接、按钮点击等。
响应:返回数据
开发步骤
1、导入依赖servlet-api.jar
2、编写一个Servlet,过程是实现Servlet接口,然后重写service方法。
3、配置Servlet访问路径
Servlet是一个类,类是不能直接在浏览器中访问的,需要配置一个访问的路径。
4、部署(发布运行)
Servlet核心类和接口
Servlet接口
GenericServlet抽象类
HttpServlet抽象类
Servlet->GenericServlet(实现Servlet接口)-> HttpServlet(继承GenericServlet)
Servlet的配置方式
1、在web.xml中配置
load-on-startup表示加载的时机,
servlet一般是在第一访问时执行创建和初始化的过程
servlet是一个单例对象,再次访问不会重新创建(只会创建一次)。
load-on-startup设置为0或者正数时,都会在启动服务器时即创建
2、在Servlet类中使用@WebServlet注解来配置,需要servlet-api3.0以上的版本。
请求方式
GET
请求参数放到url中。
相对不安全。
POST
请求参数放到请求正文中,不在url里。
相对安全。
适合提交大的数据。
适合文件上传。
请求对象request
Servlet中使用HttpServletRequest的对象来封装请求信息(请求头和正文)。
请求对象可以用来接收用户提交的信息
响应对象response
响应对象是HttpServletResponse的对象。
响应对象封装了响应头和响应正文。
response.setHeader("Content-type", "text/html;charset=utf-8"); // 设置响应头,一般下载文件时需要使用,平时就用默认值
response.setContentType("text/html;charset=utf-8"); // 设置响应头中的ContentType,设置类型和字符集
response.getWriter(); // 获取响应中的输出对象
请求转发和重定向
请求转发(forward)不会显示转发的地址,会将参数传递到下一个路径。
重定向(redirect)会直接显示重定向后的地址,不会传递参数到下一个路径
单元测试
单元测试是程序员对自己的代码进行测试的方式。
使用junit4的步骤:
1、导入依赖
junit-4.12.jar
hamcrest-core-1.3.jar
2、编写测试代码
先新建一个与src平级的目录test,mark as Test Source Root(绿色的图标)
在需要测试的类名上面选中类名,然后ctrl+shift+t,选中Create New Test,勾选中需要测试的方法
断言是在测试过程中,指定一个应有结果,如果结果与指定的结果不一致,会直接提示该方法测试不通过。
Servlet的生命周期
生命周期是指一个对象从创建到消亡的过程。
Servlet的生命周期是指Servlet从创建到消亡的过程,会经历4个阶段
- 创建,创建一个servlet对象,默认是第一次访问时才创建,当指定load-on-startup也可以在系统启动时创建对象。
- 初始化,对应init方法,默认在第一次访问时执行,仅执行一次。
- 服务,对应service方法,每次发送请求时都会访问此方法。
- 销毁,当对象在销毁之前执行的方法。执行一些保存工作。
Servlet特征
如何理解Servlet的单实例多线程?
Servlet是一个单实例的对象,整个容器针对某个Servlet只会创建一个实例(默认第一次访问时创建,也可以在系统容器加载时创建)。
但是servlet提供的服务允许多个客户端同时访问。意味着允许多线程访问。
但是servlet提供的服务允许多个客户端同时访问。意味着允许多线程访问。
状态管理
HTTP协议的无状态
HTTP协议的无状态是指HTTP协议处理用户的请求和响应时,不会记录用户的信息
会话跟踪的四种方式
会话:一个客户端与服务器之间的多次交互叫做一次会话
会话跟踪:将无状态的方式变成有状态
1、隐藏表单域,通过hidden方式提交用户标识。
2、url重写,将url后面添加上用户标识,再提交。
3、cookie
4、session
cookie是将用户信息保存到客户端(即浏览器中),而session是将用户信息保存到服务器上(根本原理还是要将用户标识保存在cookie中)。
cookie
客户端发送请求,服务器返回响应,会在响应头中将cookie信息返回,并保存到客户端,
后面每次客户端发送请求时,在请求头中会自动包含cookie的信息,服务器读取该信息,
就知道是哪个用户,以此方式来实现有状态。
后面每次客户端发送请求时,在请求头中会自动包含cookie的信息,服务器读取该信息,
就知道是哪个用户,以此方式来实现有状态。
在cookie中,不支持使用中文,一般情况下写入cookie时使用URLEncoder进行编码,然后读取时使用URLDecoder进行解码
session
当用户第一次访问登录时,服务器会将用户信息保存到session中,key为一串随机的不重复的字符串(sessionid),
将该字符串写入到客户端的cookie中,并将生命周期设置0(关闭浏览器失效),将path设置为当前工程名称。
后面每次访问时cookie会自动将sessionid提交到服务器,服务器通过sessionid来识别用户,并获取对应的存储的用户信息。
将该字符串写入到客户端的cookie中,并将生命周期设置0(关闭浏览器失效),将path设置为当前工程名称。
后面每次访问时cookie会自动将sessionid提交到服务器,服务器通过sessionid来识别用户,并获取对应的存储的用户信息。
基本使用:
创建:request.getSession();
存储数据:session.setAttribute(key, value);
获取数据:session.getAttribute(key);
删除数据:session.removeAttribute(key);
sesssion的生命周期:
开始:第一次访问时会自动创建,request.getSession()
结束:
- 浏览器关闭。浏览器关闭导致sessionid对应的cookie无效。最终导致服务器的session无法访问。
- 当session会话超时,默认为30分钟,即30分钟用户没有访问一次服务器,session即失效。可以通过session.setMaxInActiveInterval(seconds);方法来改变默认时长。
- 手动注销。session.invalidate();
session使用的流程:
登录时将用户信息写入到session中--->访问其他页面时检查session中是否存在用户信息,如果存在,视为已经登录,如果不存在,则跳转到登录页面。
application
ServletContext的对象。Servlet上下文。全局范围有效。
application作用域整个服务器有效。
getContextPath()得到上下文路径(得到工程路径名称)
getRealPath("/")得到文件夹的路径(真实路径)
Filter
Filter是指过滤器,可以拦截所有的用户请求,并且根据规则放行。
原理:
客户端发送请求,过滤器拦截请求,根据规则,将符合规则的请求放行,过滤器链上的另一个过滤器接着继续拦截请求,直到所有的过滤器全部放行后,才能够返回响应。
生命周期:
创建---初始化---过滤---销毁
创建---初始化---过滤---销毁
使用步骤:
1、创建过滤器,并编写代码
2、在web.xml中配置或者使用注解配置拦截路径(任选一种)
使用注解配置的过滤器,执行顺序默认按照文件排序(字母规则).如果两种配置方式都有,web.xml配置优先于注解配置。
文件上传下载
上传
文件上传的步骤:
1、设置表单method为post,enctype为multipart/form-data
2、后台接收
以流(inputStream)的方式接收,因为流中包含整个表单的内容以及文件的内容,需要进行解析后,才能保存到服务器。
3、使用@MultipartConfig注解对流的内容进行解析,并封装到request对象中。(Servlet3.0以上的版本才支持)
文件在线显示
文件的在线展示,可以直接将文件的流响应到客户端即可。
文件下载
只需要将之前的显示的代码,添加上响应头设置即可。
第三阶段
Maven
Maven简介
项目生命周期
清理缓存—校验—编译—测试—打包—安装—部署
Maven是一个`基于项目对象模型(POM)用于进行项目的依赖管理、生命周期管理的`工具软件
核心功能
依赖管理
生命周期管理
聚合工程
Maven安装及配置
Maven安装
直接解压即可 目录结构:
bin 存放指令文件
boot 包含了一个类加载框架的jar文件
conf 包含了Maven的核心配置文件settings.xml
lib 存放了maven运行所需的jar文件
配置环境变量
MAVEN_HOME D:\mvn\apache-maven-3.6.3
Path 增加 %MAVEN_HOME%\bin
Maven的项目结构
fmwy(项目名称)
--src
--main (存放项目的源文件)
--java (存放java代码,相当于传统项目中的src目录)
--resources (存放配置文件和静态资源的目录,相当于传统项目的web目录)
--test (存放项目的单元测试代码)
--java(测试代码)
--pom.xml
pom.xml
项目中需要依赖,直接在pom.xml进行配置即可
依赖管理
Maven仓库配置
在maven_home/conf/settings.xml中进行配置
配置本地仓库<localRepository>d:\repo</localRepository>
配置公共仓库
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
项目生命周期管理
生命周期介绍
项目开发结束之后部署到运行环境运行的过程
清除缓存
检查
编译
测试(就会执行maven项目中test目录下的单元测试)
打包(war 、 jar)
安装 (jar会被安装到本地仓库)
部署 (将项目生成的包放到外部服务器中—私服仓库)
基于IDEA的Maven使用
在IDEA中关联Maven
使用IDEA创建Maven项目
web项目
创建maven项目:maven-demo2
在pom.xml文件设置打包方式为war
完成web项目结构
配置web组件—Tomcat
部署web项目
在IDEA中使用Maven进行依赖管理
查找依赖坐标 https://mvnrepository.com/
添加依赖 将依赖的坐标配置到项目的pom.xml文件dependencies标签中
依赖范围
在通过dependency添加依赖时,可以通过scope标签配置当前依赖的适用范围
test 只在项目测试阶段引入当前依赖(编译、测试)
runtime 只在运行时使用(运行、测试运行)
provided 在(编译、测试、运行)
compile 在(编译、测试、运行、打包)都引入
在IDEA中使用Maven进行项目构建
Maven项目构建生命周期说明
clean 清理缓存 清理项目生成的缓存
validate 校验 验证项目需要是正确的(项目信息、依赖)
compile 编译 编译项目专供的源代码
test 测试 运行项目中的单元测试
package 打包 将项目编译后的代码打包成发布格式
verify 检查 对集成测试的结果进行检查、确保项目的质量是达标的
install 安装 将包安装到maven的本地仓库,以便在本地的其他项目中可以引用此项目(聚合工程)
deploy 部署 将包安装到私服的仓库,以供其他开发人员共享
私服
私服搭建
下载Nexus https://help.sonatype.com/repomanager2/download
解压nexus
安装并运行nexus
进入到nexus-2.14.11-01/bin目录
管理员身份打开cmd命令行,执行指令
登录Nexus http://localhost:8081/nexus
配置私服
在maven的settings.xml文件的servers标签中
在maven的settings.xml文件的profiles标签中
在maven的settings.xml文件的activeProfiles配置激活profile
MyBatis
MyBatis介绍
MyBatis是一个`半自动`的`ORM`框架
ORM(Object Relational Mapping)对象关系映射,将Java中的一个对象与数据表中一行记录一一对应。
ORM框架提供了实体类与数据表的映射关系,通过映射文件的配置,实现对象的持久化。
支持XML和注解配置方式自定完成ORM操作,实现结果映射
支持自定义SQL、存储过程
对原有的JDBC进行了封装,几乎消除了所有JDBC代码,让开发者只需关注SQL本身
MyBatis框架部署
创建Maven项目
在项目中添加MyBatis依赖
在pom.xml中添加依赖
mybatis
mysql driver
创建MyBatis配置文件
创建自定义模板:选择resources----右键New----Edit File Templates
在resources中创建名为`mybatis-config.xml`的文件
在`mybatis-config.xml`文件配置数据库连接信息
单元测试
添加单元测依赖
junit
创建单元测试类
在被测试类名后alt+insert --- 选择Test
MyBatis的CRUD操作
MyBatis工具类封装
MyBatisUtil
事务管理
qlSession 对象
getMapper(DAO.class) : 获取Mapper(DAO接口的实例)
事务管理
手动提交事务
`sqlSession.commit();`提交事务
sqlSession.rollback();`事务回滚
**业务逻辑层手动事务管理**
自动提交事务
通过SqlSessionFactory调用openSession方法获取SqlSession对象时,可以通过参数设置事务是否自动提交
如果参数设置为true,表示自定提交事务: factory.openSession(true);
如果参数设置为false,或者不设置参数,表示手动提交:factory.openSession();/factory.openSession(false);
MyBatis主配置文件
mybatis-config.xml 是MyBatis框架的主配置文件,主要用于配置MyBatis数据源及属性信息
properties标签
用于设置键值对,或者加载属性文件
在resources目录下创建`jdbc.properties`文件
在mybatis-config.xml中通过`properties`标签引用`jdbc.properties`文件;引入之后,在配置environment时可以直接使用jdbc.properties的key获取对应的value
settings标签
<!--设置mybatis的属性-->
typeAliases标签
<!--typeAliases标签用于给实体类取别名,在映射文件中可以直接使用别名来替代实体类的全限定名-->
plugins标签
<!--plugins标签,用于配置MyBatis插件(分页插件)-->
environments标签
<!-- 在environments配置数据库连接信息 -->
<!-- 在environments标签中可以定义多个environment标签,每个environment标签可以定义一套连接配置 -->
<!-- default属性,用来指定使用哪个environment标签 -->
<!--transactionManager标签用于配置数据库管理方式
type="JDBC" 可以进行事务的提交和回滚操作
type="MANAGED" 依赖容器完成事务管理,本身不进行事务的提交和回滚操作 -->
<!--dataSource标签就是用来配置数据库连接信息 POOLED|UNPOOLED -->
mappers标签
加载映射配置(映射文件、DAO注解)
映射文件
MyBatis Mapper初始化
XML文件解析:读取xml文件中的标签配置封装到Java对象中
mapper根标签
mapper文件相当于DAO接口的‘实现类’,namespace属性要指定`实现`DAO接口的全限定名
insert标签
useGeneratedKeys属性, 设置添加操作是否需要回填生成的主键
keyProperty属性,指定回填的id设置到参数对象中的哪个属性
timeout属性,设置此操作的超时时间,如果不设置则一直等待
主键回填
<insert id="*Id" useGeneratedKeys="true" keyProperty="*Id">
delete标签
声明删除操作
update标签
声明修改操作
select标签
id属性, 指定绑定方法的方法名
声明查询操作
resultMap属性,指定从数据表到实体类的字段和属性的对应关系
resultMap标签
<!-- resultMap标签用于定义实体类与数据表的映射关系(ORM) -->
cache标签
设置当前DAO进行数据库操作时的缓存属性设置
<cache type="" size="" readOnly="false"/>
sql和include
SQL片段
分页插件
分页插件是一个独立于MyBatis框架之外的第三方插件
添加分页插件的依赖
pagehelper
配置插件
在mybatis的主配置文件`mybatis-config.xml`中通过`plugins`标签进行配置
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
关联映射
实体关系
实体——数据实体,实体关系指的就是数据与数据之间的关系
**一对一关联**
**一对多关联**、**多对一关联**
**多对多关联**
动态SQL
根据查询条件动态完成SQL的拼接
if
where
trim
foreach
模糊查询
模糊查询需要使用${}取值,与sql进行拼接
在使用${}时,即使只有一个参数也需要使用@Param注解声明参数的key(非String对象参数可以不用声明)
<!--如果参数是String类型,需要parameterType声明参数类型-->
${key} 表示获取参数,先获取参数的值拼接到SQL语句中,再编译执行SQL语句;可能引起SQL注入问题
#{key} 表示获取参数,先完成SQL编译(预编译),预编译之后再将获取的参数设置到SQL语句中 ,可以避免SQL注入问题
MyBatis日志配置
MyBatis框架本身支持log4j日志框架,对运行的过程进行跟踪记录。我们只需对MyBatis进行相关的日志配置,就可以看到MyBatis运行过程中的日志信息。
添加日志框架依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
添加日志配置文件
在resources目录下创建名为 `log4j.properties`文件
在 log4j.properties文件配置日志输出的方式
日志信息的级别
根据输出的日志信息的重要程度分为5个级别
DEBUG
输出调试信息
INFO
输出提示信息
WARN
输出警告信息
ERROR
一般性错误信息
FATAL
致命性错误信息
配置数据库连接池-整合Druid
常见的连接池
DBCP
C3P0
Druid 性能也比较好,提供了比较便捷的监控系统
Hikari 性能最好
添加Druid依赖
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
创建Druid连接池工厂
将DruidDataSourceFactory配置给MyBatis数据源
MyBatis缓存
缓存的工作原理
缓存,就是存储数据的内存
MyBatis缓存
MyBatis缓存分为一级缓存和二级缓存
一级缓存也叫做SqlSession级缓存,为每个SqlSession单独分配的缓存内存,无需手动开启可直接使用;多个SqlSession的缓存是不共享的。
二级缓存也称为SqlSessionFactory级缓存,通过同一个factory对象获取的Sqlsession可以共享二级缓存;在应用服务器中SqlSessionFactory是单例的,因此我们二级缓存可以实现全局共享;二级缓存只能缓存实现序列化接口的对象。
在mybatis-config.xml开启使用二级缓存
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
在需要使用二级缓存的Mapper文件中配置cache标签使用功能二级缓存
<cache/>
被缓存的实体类实现序列化接口
public class * implements Serializable{}
延迟加载
延迟加载——如果在MyBatis开启了延迟加载,在执行了子查询(至少查询两次及以上)时,默认只执行第一次查询,当用到子查询的查询结果时,才会触发子查询的执行;如果无需使用子查询结果,则子查询不会执行.
<resultMap id="classMap" type="Clazz">
<collection property="stus" select="com.qfedu.dao.StudentDAO.queryStudentsByCid" column="cid" fetchType="lazy"/>
Spring
轻量级 AOP IOC 容器
架构:core container AOP Aspects DATA ACCESS web test
Spring IOC
DI
依赖注入 spring容器创建对象的同时完成对象属性值的注入
自动装配
通过Spring容器,按照特定的装配规则,在创建对象时自动完成属性值的注入
IOC工作原理
IOC注解配置
IoC常用注解
**`@Component`/`@Service`/`@Repository`**
代理设计模式
静态代理
只能为特定的类产生代理对象
动态代理
几乎可以为所有的类进行代理
JDK动态代理、CGLib动态代理
CGLib动态代理
添加CGLib依赖
创建CGLib动态代理类
动态代理测试
Spring AOP
对原有的业务进行拦截,并且在这个横切面上添加特定的业务逻辑
AOP开发流程
添加依赖
spring-context
spring-aspects
创建切面类
begin()
commit()
AOP配置
在spring配置文件引入aop命名空间
进行AOP配置:就是将切面类的方法 配置到原有的业务逻辑中
切入点定义
定义切入点:一个切入点的定义可以是一个方法,也可以是一组方法
AOP的通知策略
aop:before
aop:after
aop:after-returnning
aop:after-throwing
aop:around
AOP注解配置
SpringIoC使用注解配置
导入spring依赖
spring-context
创建Spring配置文件,并声明使用注解配置
context:annotation-config
context:component-scan base-package="com.qfedu.aop"
导入spring-aspects依赖
在spring配置文件添加aop命名空间,同时声明AOP使用注解配置
aop:aspectj-autoproxy
创建切面类,在切面类中通过注解完成aop配置
@Aspect
Spring整合MyBatis
IoC
创建Maven工程
完成MyBatis框架部署
添加MyBatis依赖
mysql-connector-java
mybatis
在resources目录创建mybatis配置文件:mybatis-config.xml
创建MyBatis工具类:MyBatisUtil.java
完成Spring框架部署
添加依赖(context、aspects、jdbc)
在resources目录创建spring配置文件:applicationContext.xml
添加整合依赖
添加整合依赖:mybatis-spring
Spring整合MyBatis配置-IoC
在resources目录下创建`jdbc.properties`配置数据库连接信息
在spring配置文件`applicationContext.xml`完成IoC整合配置
Spring整合druid
添加druid依赖
配置DruidDataSource数据源
在resources目录创建`druid.properties`
在spring配置文件`applicationContext.xml`加载`druid.properties`,并修改数据源配置为DruidDataSource
Spring整合MyBatis-AOP
加载spring-jdbc中的事务管理
事务管理配置(aop配置)
在spring配置文件中引入aop和tx的命名空间
通过tx标签声明事务管理类的管理策略
将事务管理器通过aop配置到业务代码中
事务的隔离级别
SpringMVC
SpringMVC概述
Model 模型层 View 视图层 Controller 控制层
SpringMVC体系架构
SpringMVC是一个MVC框架,能够实现web项目开发过程中的MVC控制,替代Servlet的作用
SpringMVC核心组件
前端控制器 DispatcherServlet
处理器映射 HandlerMapping
处理器适配器 HandlerAdapther
处理器/控制器 Handler
ModelAndView
视图解析器 ViewResolver
视图 View
SpringMVC框架部署
创建一个Maven的web工程
添加SpringMVC依赖
SpringIoC、AOP:spring-context 、 spring-aspects
SpringMVC: spring-web 、spring-webmvc
创建SpringMVC配置文件
在resources目录下创建spring配置文件`spring-servlet.xml`,添加`mvc`命名空间
在web.xml中配置前端控制器
SpringMVC框架使用(基于注解)
在spring-servlet.xml中配置注解声明
创建控制器
创建一个类,添加`@Controller`注解,即声明此类为一个控制器类
在类上添加`@RequestMapping("/url")`声明此控制器类的请求路径
在控制器类中创建处理请求的方法
在每个方法上通过`@RequestMapping("/url")`指定当前方法的访问路径
页面提交数据到控制器的方法
在控制器接收页面提交的数据
属性接收
参数名需要与页面提交数据的name属性保持一致
对象接收
控制器中处理请求的方法添加对象类型的参数,页面提交数据的key要与对象的属性名保持一致
从控制器跳转到页面
控制器处理请求的方法返回类型为String,请求处理完成之后直接return页面路径即可
控制器方法返回ModelAndView
控制器处理请求的方法返回类型为ModelAndView,请求处理完成之后将返回的页面路径封装到ModelAndView对象,return这个对象
从控制器传值到页面
控制器类方法返回String
在控制器方法中添加Model参数
在跳转到页面之前,将参数设置到model对象中
也可以使用HttpServletRequest对象
控制器类方法返回ModelAndView
在返回modelAndView对象之前,将数据设置到modelAndView对象
SpringMVC 使用细节
控制器接收前端数据
@RequestParam 接收请求行提交数据
form表单、超链接提交数据都是通过HTTP请求行传值
在控制器中通过`@RequestParam`注解接收**请求行**数据绑定到控制器方法的形参
如果控制器方法的形参名称与提交数据的key保持一致,则可省略@RequestParam注解
@RequestHeader接收请求头提交数据
前端使用异步请求,通过请求头提交数据
在控制器中通过`@RequestHeader`注解接收**请求头**数据绑定到控制器方法的形参
@RequestBody接收请求体提交数据
当前端提交数据方式为 POST时,是可以通过请求体传递数据的
使用jQuery的Ajax请求,使用data参数可以传递数据
如果请求方式为post
data后的数据为对象(键值对)
data后的数据为json格式字符串,需要设置`contentType="application/json"
@PathVariable接收请求路径数据
请求路径传值:将需要传递的数据作为urlPath的一部分
超链接通过请求路径传值
控制器方法通过`@PathVariable`获取请求路径中的数据
控制器响应前端请求
响应同步请求
控制器方法返回String
控制器方法返回ModelAndView
响应异步请求
当前端发送异步请求到控制器方法,控制器方法无需跳转到下一个页面,只需返回对应的数据即可
使用输出流响应ajax请求
直接使用@ResponseBody注解处理
解决中文乱码问题
设置前端编码
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
设置服务器编码
tomcat/conf/server.xml
URIEncoding="UTF-8"
设置SpringMVC编码
在web.xml中配置SpringMVC的编码过滤器,设置编码方式为UTF-8
静态资源处理
/ 和 /* 都表示拦截浏览器发送的所有的HTTP请求
**/*** SpringMVC前端控制器拦截所有请求,并将所有请求的URL都识别为控制器类的请求路径,去寻找与之匹配的控制器方法
SpringMVC前端控制器拦截所有请求,但是会过滤jsp请求,如果请求路径是以`.jsp`结尾的请求,会直接寻找jsp文件资源并相应;其他的请求作为控制器路径处理
静态资源配置
在SpringMVC配置文件spring-servlet.xml中进行静态资源放行配置
jsp页面访问配置
通过控制器转发对JSP资源的请求(在SpringBoot应用会频繁使用)
自定义日期转换器
文件上传
前端提交文件数据
表单提交方式必须为post提交
表单数据传输设置 不压缩 ` enctype="multipart/form-data"`
控制器方法接收文件
添加文件上传所需的依赖
commons-io
commons-fileupload
在`spring-servlet.xml`配置文件处理器
在控制器接收文件
统一异常处理
拦截器
SSM整合
创建Maven的web工程
部署MyBatis
mysql-connector-java
mybatis
创建MyBatis配置文件:mybatis-config.xml
Spring整合之后由Spring创建数据源,因此在mybatis-config.xml无需做任何配置
部署Spring、SpringMVC框架
添加依赖- spring-context
- spring-aspects
- spring-jdbc(整合MyBatis时需要事务管理类)
- spring-web
- spring-webmvc
- jackson-databind
- spring-aspects
- spring-jdbc(整合MyBatis时需要事务管理类)
- spring-web
- spring-webmvc
- jackson-databind
创建Spring配置文件
声明注解配置、配置自定义类
整合mybatis配置(IoC)
配置事务管理
mvc注解声明、静态资源配置、自定义转换器配置等
配置Spring前端控制器
在web.xml中配置前端控制器,加载spring配置文件
在web.xml中配置SpringMVC编码过滤器
spring-mybatis.xml整合MyBatis配置
添加整合配置依赖 mybatis-spring
配置数据源(druid)
添加druid依赖
在resources中创建druid.properties,并配置属性
在spring-context.xml加载属性文件,配置数据源
配置SqlSessionFactory
在spring-context.xml配置SqlSessionFactory
配置MapperScannerConfigurer
在spring-context.xml配置MapperScannerConfigurer
spring-context.xml整合Spring事务管理(注解)
在spring-context.xml配置事务
spring-context.xml中Spring声明使用注解
spring-context.xml中Spring MVC配置
在spring-context.xml配置声明使用注解
SpringBoot
SpringBoot介绍
SSM使用总结
SpringBoot概念
SpringBoot概念:SpringBoot采用`习惯优化配置/约定大于配置`的理念快速搭建项目的开发环境,开发者无需或者进行很少的配置就可以让项目快速的运行起来
优缺点
第一个SpringBoot应用
SpringBoot应用的创建过程
使用浏览器创建SpringBoot应用
使用IDEA创建SpringBoot应用
SpringBoot应用的项目结构
SpringBoot原理解析
SpringBoot的pom文件
SpringBoot starter
Java配置方式
SpringBoot自动配置原理
@SpringBootApplication注解
启动类加载流程
基于SpringBoot的SSM整合
创建SpringBoot应用
添加依赖
创建SpringBoot应用
MyBatis配置
在SpringBoot的配置文件`application.properties`中进行自定义配置
在SpringBoot应用启动类添加`@MapperScan`注解,指定DAO接口所在的包路径
整合Druid连接池
添加druid的starter
配置连接池数据源
SpringBoot全局配置文件
配置方式
基于properties配置
基于yaml配置
SpringBoot默认配置
启动图标设置
SpringBoot应用整合JSP
添加JSP支持依赖
修改pom文件
创建webapp目录
配置SpringMVC视图解析规则
控制器跳转到页面
Thymeleaf动态模版技术
Thymeleaf简介
SpringBoot应用整合Thymeleaf
Thymeleaf模版语法
th:text
th:inline 内联
标签属性赋值
th:object和*
th:each - 循环
th:if - 分支
th:switch - 分支
SpringBoot+Thymeleaf综合案例
业务需求(原型图)
实现流程设计
添加功能
图书列表
删除图书
修改图书
UI设计
数据库设计
项目环境搭建
功能实现
按照流程图,数据库——servcie——controller——页面 进行实现
数据库操作实现
Service层实现
Controller层实现
SpringBoot应用开发
基于SpringBoot单元测试
基于Junit4单元测试
基于SpringBoot内置版本单元测试
全局异常处理
SpringBoot应用热部署
热部署
热部署配置
SpringBoot应用的打包和部署
SpringBoot应用多环境配置
自定义Starter
自定义starter流程说明
自定义starter
自定义starter扩展
0 条评论
下一页