JavaWeb

JavaWeb

在这里插入图片描述
什么是JavaWeb?
使用Java语言开发互联网项目

前言

一、Junit单元测试

1、测试分类

黑盒测试:不需要写代码,输入值,看程序能否输出期望的值。
百盒测试:需要写代码。关注程序具体的执行流程。

2、Junit使用:白盒测试

(1)、 步骤:
a. 定义一个测试类(测试用例)
建议:
测试类名:被测试的类名Test XxxTest
包名:xxx.xxx.xxx.test
b. 定义测试方法:可以独立运行
建议:
方法名:test测试的方法名 testXxx()
返回值:void
参数列表:空参
c. 给方法加@Test
d. 导入 junit 依赖环境

(2)、 判定结果
红色:失败
绿色:成功
一般会使用断言操作来处理结果
Assert.assertEquals(expected ,result);

(3)、
@Before
初始化方法,用于资源的申请,所有测试方法在执行之前都会执行该方法
@After
释放资源方法,在所有测试方法执行完后,都会自动执行

二、反射:框架设计的灵魂

Java代码在计算机中经历的三个阶段:
Source 源代码阶段
Class 类对象阶段
Runtime运行是阶段

1、框架:

半成品软件。可以在框架的基础上进行软件开发,简化代码

2、反射:

将类的各个组成部分封装为其他对象,这就是反射机制
好处:
可以在程序运行过程中,操作这些对象
可以解耦,提高程序的可扩展性

3、获取Class对象的方式

(1)、Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。读取文件,加载类
(2)、类名.class:通过类名的属性class获取
多用于参数的传递
(3)、对象.getClass():getClass()方法在Object类中定义着
多用于对象获取字节码的方式
结论:同一个字节码文件(x.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

4、Class对象功能

(1)、 获取功能
a. 获取成员变量们
Field[] getFields():获取所有public修饰的成员变量
Field getField(String name):获取所有public修饰的成员变量

Field[] getDeclaredFields():获取所有成员变量,不考虑修饰符
Field getDeclaredField(String name)

b. 获取构造方法们
Constructor< ? >[] getConstructors()
Constructor< T >[] getConstructor(类< ? >… parameterTypes)

Constructor< ? >[] getDeclaredConstructors()
Constructor< T >[] getDeclaredConstructor(类< ? >… parameterTypes)

c. 获取成员方法们
Method[] getMethods()
Method getMethod(String name,类< ? >… parameterTypes)

Method[] getDeclaredMethods()
Method getDeclaredMethod(String name,类< ? >… parameterTypes)

d. 获取类名
String getName()

(2)、
a. Field :成员变量
操作:
设置值
void set(Object obj,Object value)
获取值
get(Object obj)
忽略访问权限修饰符的安全检查
setAccessible(true); //暴力反射

b. Constructor:构造方法
创建对象:
T newInstance(Object… initargs)
如果使用空参构造方法创建对象,操作可以简化:Class对象的newInstance方法

c. Method:方法对象
执行方法:

三、注解



数据库

数据库的基本概念
1 、数据库的英文单词:DateBase 简称:DB

2、什么是数据库?
用于存储和管理数据的仓库

3、数据库的特点
(1)、持久化存储数据的。其实数据库就是一个文件系统
(2)、方便存储管理数据
(3)、使用了统一的方式操作数据库 SQL

4、常见的数据库软件
Oracle:收费的大型数据库,Oracle公司的产品。
DB2:IBM公司的数据库产品,收费的。常应用在银行系统中。
SQLServer:MicroSoft 公司收费的中型数据库。C#、.net等语言常用。
SyBase:已经淡出历史舞台。提供了一个非常专业的数据建模工具PowerDesigner。
SQLite:嵌入式的小型数据库,常用在手机端。
常用的数据库:MYSQL,Oracle

在web应用中,使用的最多的就是MYSQL数据库原因如下:
(1)、开源、免费
(2)、 功能足够强大,足以应付web应用开发(最高支持千万级别的并发访问)



MySQL

![在这里插入图片描述](https://img-blog.csdnimg.cn/54ffafcb5b4e4c09b84c4fc6917e5eba.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6Z2S5LqR5qKm5bCY,size_20,color_FFFFFF,t_70,g_se,x_1
在这里插入图片描述

一、SQL

1、什么是SQL?

Structured Query Language:结构化查询语言
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为”方言“。

2、SQL通用语法

(1)、 SQL语句可以单行或多行书写,以分号结尾。
(2)、可使用空格和缩进来增强语句的可读性
(3)、MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
(4)、3种注释
单行注释:-- (空格)注释内容 或 # (空格可有可无)注释内容(MySQL特有)
多行注释:/* 注释 */

3、SQL分类

(1)、DDL(Date Definition Language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create, drop, alter 等
(2)、DML(Date Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
(3)、DQL(Date Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where 等
(4)、DCL(Date Control Language)数据控制语言(了解)
用来定义数据库的访问权限和安全级别,即创建用户。关键字:GRANT, REVOKE 等

4、DDL(操作数据库,表)

(1)、操作数据库:CRUD

C(Create):创建
创建数据库:
create database 数据库名称;
创建数据库,判断不存在,再创建:
create database if not exists 数据库名称;
创建数据库,并指定字符集
create database 数据库名称 character set 字符集名;

R(Retrieve):查询
查询所有数据库的名称:
show databases;
查询某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称;

U(Update):修改
修改数据库的字符集
alter database 数据库名称 character set 字符集名称;

D(Delete):删除
删除数据库
drop database 数据库名称;
判断数据库是否存在,存在再删除
drop database if exists 数据库名称;

使用数据库
查询当前正在使用的数据库名称
select database();
使用数据库
use 数据库名称;

(2)、操作表
C(Create):创建
create table student(
id int,
name VARCHAR(20),
age int,
score double(4,1),
birth date,
insert_time timestamp
);
复制表: create table 表名 like 被复制的表名;

R(Retrieve):查询
查询某个数据库中所有的表名称
show tables;
查询表结构
desc 表名;

U(Update):修改
修改表名
alter table 表名 rename to 新的表名;
修改表的字符集
alter table 表名 character set 字符集名称;
添加一列
alter table 表名 add 列名 数据类型;
修改列名称 类型
alter table 表名 change 列名 新列名 新数据类型;
alter table 表名 modify 列名 新数据类型;
删除列
alter table 表名 drop 列名;

D(Delete):删除
drop table 表名;
drop table if exits 表名;

5、DML(增删改表中数据)

(1)、添加数据
insert into 表名(列名1,列名2,…列名n) values (值1,值2,…值n);
注意:
a. 列名和值要一一对应。
b. 如果表名后,不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,…值n);
c. 除了数字类型,其他类型需要使用引号(单双都可以)引起来

(2)、删除数据
a. 语法:
delete from 表名 where 条件;
b. 注意:
&如果不加条件,则删除表中所有记录。
&如果要删除所有记录
delete from 表名; 不推荐使用。有多少条记录就会执行多少次删除操作
TRUNCATE TABLE 表名; 推荐使用,效率更好,先删除表,然后再创建一张一样的表。

(3)、修改数据
语法:
update 表名 set 列名1 = 值1,列名2 = 值2,… where 条件;
eg : update pet set name =‘旺旺财’ where name = ‘旺财’;
注意:如果不加任何条件,则会将表中所有记录全部修改。

6、DQL(查询表中的记录)

select *from 表名;
(1)、语法
select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定

(2)、基础查询
a. 多个字段的查询
select 字段名1,字段名2… from 表名; 如果查询所有字段,则可以使用*来替代字段列表。
b. 去除重复
distinct
c. 计算列
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
表达式1:哪个字段需要判断是否为null
表达式2:如果该字段为null后的替换值。
在这里插入图片描述

d. 起别名
as:as也可以省略
在这里插入图片描述

(3)、条件查询
a. where 子句后跟条件
b. 运算符
‘>、<、<=、>=、=、<>’ <>在 SQL 中表示不等于,在 mysql 中也可以使用!=,没有==。

--查询 math 分数大于 80 分的学生
select * from student3 where math>80;

--查询 english 分数小于或等于 80 分的学生
select * from student3 where english <=80;

--查询 age 等于 20 岁的学生
select * from student3 where age = 20;


--查询 age 不等于 20 岁的学生,注:不等于有两种写法
select * from student3 where age <> 20;
select * from student3 where age != 20;

BETWEEN…AND

select *  from student3 where english between 75 and 90;

IN(集合)

--查询 id 是 1 或 3 或 5 的学生
select * from student3 where id in(1,3,5);
--查询 id 不是 1 或 3 或 5 的学生
select * from student3 where id not in(1,3,5);

IS NULL 查询某一列为 NULL 的值,注:不能写=NULL

select * from student3 where english is NULL;

and 或 &&
or 或 ||
not 或 !

-- 查询 age 大于 35 且性别为男的学生(两个条件同时满足)
select * from student3 where age>35 and sex='男';
-- 查询 age 大于 35 或性别为男的学生(两个条件其中一个满足)
select * from student3 where age>35 or sex='男';
-- 查询 id 是 1 或 3 或 5 的学生
select * from student3 where id=1 or id=3 or id=5;

LIKE ‘张%’
MySQL 通配符
% 匹配任意多个字符串
_ 匹配一个字符

-- 查询姓马的学生
select * from student3 where name like '马%';
select * from student3 where name like '马'
-- 查询姓名中包含'德'字的学生
select * from student3 where name like '%德%';
-- 查询姓马,且姓名有两个字的学生
select * from student3 where name like '马_';

(4)、排序查询
a. 语法:
order by 子句
order by 排序字段1 排序方式1, 排序字段2 排序方式2…

select * from student order by math asc, english desc;

b. 排序方式:
ASC:升序,默认的。
BESC:降序。
c. 注意:
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。

(5)、聚合函数:
格式:select 聚合函数() from 表名;

select count(english) from student;

a. count:计算个数
一般选择非空的列:主键
count(*):只要一行有一个不为null,就加一。
b. max:计算最大值
c. min:计算最小值
d. sum:计算和
e. avg:计算平均值
注意:
聚合函数的计算,排除null值
解决方案:‘1. 选择不包含非空的列进行计算 ’2. IFNULL函数

 select count(IFNULL(english,0)) from student;

(6)、分组查询
a. 语法:group by 分组字段;
b. 注意:
&分组之后查询的字段:分组字段,聚合函数
&where 和 having 的区别
where 和 having的区别
where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来。
where后不可以跟聚合函数,having可以进行聚合函数的判断。
在这里插入图片描述
(7)、分页查询
a. 语法:limit 开始的索引 每页查询的条数;

--每页显示3条记录
select * from student limit 0,3;

b. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
c. 分页操作是一个“方言”

7、DCL

(1)、管理用户
a. 添加用户
语法:create user ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’;
b. 删除用户:
语法:drop user ‘用户名’@‘主机名’;
c. 修改用户密码:
方法一:update user set password = password(‘新密码’) where user = ‘用户名’;
方法二:set password for ‘用户名’@‘主机名’ = password(‘新密码’);

mysql中忘记了root 用户的密码???
‘1. cmd --> net stop mysql (停止mysql服务)
需要管理员身份运行该cmd
'2. 使用无验证方式启动mysql服务:mysql --skip-grant-tables
'3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登陆成功
’4. use mysql;
'5. update user set password = password(‘新密码’) where user = ‘root’;
'6. 关闭两个窗口
‘7. 打开任务管理器,手动结束mysqld.exe 的进程
’8. 启动mysql服务 :net start mysql
‘9. 使用新密码登录

d. 查询用户
–‘1. 切换到MySQL数据库
use mysql;
–’2. 查询user表
select * from user;
通配符:%表示可以在任意主机使用用户登录数据库

(2)、权限管理
a. 查询权限
show grants for ‘用户名’@‘主机名’;
b. 授予权限
grant 权限列表 on 数据库名.表名 to ‘用户名’@‘主机名’;
授予所有权限:grant all on *.* to '用户名'@'主机名';
c. 撤销权限
revoke 权限列表 on 数据库名.表名 from ‘用户名’@’主机名‘;

8、mysql常用数据类型有哪些?

数据类型如何选择:
日期按照格式 数值和字符串按照大小
mysql支持多种类型,大致可以分为三类:
(1)数值
TINYINT、SMALLINT、MEDIUMINT、INT或INTEGER、BIGINT、FLOAT、DOUBLE、DECIMAL
在这里插入图片描述

(2)日期/时间
DATETIME、DATE、TIMESTAMP、TIME和YEAR
在这里插入图片描述
(3)字符串(字符)类型
CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
在这里插入图片描述

二、约束

概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
主键约束:primary key
非空约束:not null
唯一约束:unique
外键约束:foreign key

1、非空约束:not null

(1)、创建表时添加约束

create table stu(
	id int;
	name varchar(20) not null  --name为非空
)

(2)、创建完表后,添加非空约束

alter table stu modify name varchar(20) not null;

(3)、删除name的非空约束

alter table stu modify name varchar(20);
2、唯一约束:unique,某一列的值不能重复

(1)、注意:唯一约束可以有null值,但是只能有一条记录为null
(2)、在创建表时,条件约束唯一

create table stu(
	id int,
	phone_number varchar(20) unique  --手机号
);

(3)、删除唯一约束

alter table stu drop index phone_number;

(4)、在表创建完后,添加唯一约束

alter table stu modify phone_number varchar(20) unique;
3、主键约束

(1)、注意:
a. 含义:非空且唯一
b. 一张表只能有一个字段为主键
c. 主键就是表中记录的唯一标识

(2)、在创建表时,添加主键约束

create table stu(
 	id int primary key, --给id添加主键约束
 	name varchar(20)
);

(3)、删除主键

--错误: alter table stu modify id int;
alter table stu drop primary key;

(4)、创建完表后,添加主键

alter table stu modify id int primary key;

(5)、自动增长
a. 概念:如果某一列是数值类型的,使用auto_increment 可以来完成值的自动增长
b. 在创建表时,添加主键约束,并完成主键自增长

create table stu(
	id int primary key auto_increment,  --给id添加主键约束
	name varchar(20)
);

c. 删除自动增长

alter table stu modify id int;

d. 添加自动增长

alter table stu modify id int auto_increment;
4、外键约束:foreign key,让表与表产生关系,从而保证数据的正确性。

主表中没有的数据值,在副表中是不可以使用的。
主表中的记录被副表引用,是不可以被删除的。

(1)、在创建表时,可以添加外键
create table 表名(

外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);

--班级   主表
create table classes(
	id int primary key,
	name varchar(20)
);

--学生   副表
create table students(
	id int primary key,
	name varchar(20),
	class_id int,
	foreign key(class_id) references classes(id)
);

(2)、删除外键
alter table 表名 drop foreign key 外键名称;

(3)、创建表之后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名称) references 主表名称(主表列名称);
(4)、级联操作
a. 添加级联操作
语法:
alter table 表名 add constraint 外键名称 foreign key(外键字段名称) references 主表名称(主表列名称) on update cascade on delete cascade;
b. 分类:
级联更新:on update cascade
级联删除:on delete cascade

三、数据库的设计

1、多表之间的关系

(1)、 分类
a. 一对一:
如:人和身份证
分析:一个人只有一个身份证,一个身份证只能对应一个人
b. 一对多(多对一):
如:部门和员工
分析:一个部门有多个员工,一个员工只能对应一个部门
c. 多对多:
如:学生和课程
分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择

(2)、实现关系
a. 一对多(多对一):
如:部门和员工
实现方式:在多的一方建立外键,指向一的一方的主键。
在这里插入图片描述

b. 多对多
如:学生和课程
实现方式:多对多关系实现需要借助第三张中间表,中间表至少包含两个字段,这两个字段可以作为第三张表的外键,分别指向两张表的主键

c. 一对一:
如:人和身份证
实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键

2、数据库设计的范式

(1)、概念:设计数据库时,需要遵循一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈梯次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

(2)、分类
a. 第一范式(1NF):每一列都是不可分割的原子数据项
在这里插入图片描述
b. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
&几个概念:
'1. 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如:学号 --> 姓名 (学号,课程名称) --> 分数
'2. 完全函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称) --> 分数
‘3. 部分函数依赖:A–>B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称) --> 姓名
’4. 传递函数依赖:A–>B,B–>C。如果通过A属性(属性组)的值,可以唯一确定唯一B属性的值,在通过B属性(属性组)的值可以唯一确定C属性的值,则称C传递函数依赖于A。
例如:学号 --> 系名,系名 --> 系主任
‘5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:该表中码为:(学号,课程名称)
主属性:码属性组中的所有属性
非主属性:除过码属性组的属性
在这里插入图片描述

c. 第三范式(3NF):在2NF的基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除依赖传递)

在这里插入图片描述

3、数据库的备份和还原

(1)、命令行:
&语法:
’1. 备份: mysqldump -u用户名 -p密码 > 保存的路径
‘2. 还原:
登录数据库
创建数据库
使用数据库
执行文件。source 文件路径

(2)、图形化工具

4、多表查询

(1)、查询语法:
select 列名列表 from 表名列表 where …
(2)、笛卡尔积
有两个集合A,B。取这两个集合的所有组成情况
要完成多表查询,需要消除无用的数据
(3)、多表查询的分类
a. 内连接查询
’1. 隐式内连接:使用where条件消除无用数据
在这里插入图片描述
‘2. 显式内连接
&语法:select 字段列表 from 表名1 [inner] join 表名2 on 条件
&例子:

select * from emp inner join demp on emp.'demp_id' = demp.'id';
select * from emp join demp on emp.'demp_id' = demp.'id';

'3. 内连接查询
从哪些表查询数据
条件是什么
查询哪些字段

b. 外连接查询
’1. 左外连接:
语法: select 字段列表 from 表1 left [outer] join 表2 on 条件;
查询的是左表所有数据及其交集部分。
‘2. 右外连接:
语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
查询的是右表所有数据及其交集部分。

c. 子查询
'1. 概念:查询中嵌套查询,称嵌套查询为子查询。

--查询最高工资
 --第一步:查询最高的工资是多少
 select max(salary) from emp;
  --第二步:查询员工信息,并且工资等于9000的
  select * from emp where emp.'salary' = 9000;

--一条SQL语句完成这个操作  子查询
 select * from emp where emp.'salary' = ( select max(salary) from emp);

'2. 子查询的不同情况
&子查询的结果是单行单列的
子查询可以作为条件,使用运算符去判断。运算符:> >= < <= =

--查询员工工资小于平均工资的人
select * from emp where emp.salary < (select avg(salasry) from emp);

&子查询的结果是多行单列的
子查询可以作为条件,使用运算符in来判断

--查询’财务部‘和’市场部‘所有的员工信息
select id from dept where name = '财务部' or name = '市场部';
select * from emp where dept_id = 3 or dept_id = 2;
--子查询
select * from emp where dept_id in (select id from dept where name = '财务部' or name = '市场部');

&子查询的结果是多行多列的
子查询可以作为一张虚拟表参与查询

--查询员工入职日期是2011-11-11日之后的员工信息和部门信息
--子查询
select * from dept t1,(select * from emp where emp.'join_date' > '2011-11-11') t2 where t1.id=t2.dept_id;
--普通内连接
select * from emp t1,demp t2 where t1.'dept_id'=t2.'id' and t1.'join_date'>'2011-11-11';

四、事务

1、事务的基本介绍

(1)、概念:
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
(2)、操作:
a. 开启事务:start transaction;
b. 回滚:rollback;
c. 提交:commit;
(3)、MySQL数据库中事务默认自动提交
a. 事务提交的两种方式
’1. 自动提交
mysql 就是自动提交的
一条DML(增删改)语句会自动提交一次事务。
‘2. 手动提交
Oracle数据库默认是手动提交事务
需要开启事务,再提交

b. 修改事务的默认提交方式:
查看事务的默认提交方式:select @@autocommit; --1 代表自动提交 0代表手动提交
修改默认提交方式:set @@autocommit = 0;

2、事务的四大特征

原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
持久性:当事务提交或回滚后,数据库会持久化的保存数据。
隔离性:多个事务之间,相互独立。
一致性:事务操作前后,数据总量保持不变

3、事务的隔离级别

(1)、概念:多个事务之间隔离的,相互独立的。但如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
(2)、存在问题:
a. 脏读:一个事务,读取到另一个事务中没有提交的数据
b. 不可重复读(虚读):在同一事务中,两次读取到的数据不一样。
c. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
(3)、隔离级别
a. read uncommited:读未提交
产生的问题:脏读、不可重复读、幻读
b. read commited:读已提交(Oracle)
产生的问题:不可重复读、幻读
c. repeatable read:可重复读(MySQL默认)
产生的问题:幻读
d. serializable:串行化
可以解决所有的问题

e. 注意:隔离级别从小到大安全性越来越高,但是效率越来越低
数据库查询隔离级别:
select @@tx_isolation;
数据库设置隔离级别:
set global transaction isolation level 级别字符串;

五、JDBC

1、概念:Java DataBase Connectivity Java数据库连接,Java语言操作数据库

JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动 jar 包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

2、快速入门

步骤:

		//1. 导入驱动jar包 
		//复制jar到项目libs目录下
        //2. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //3. 获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","123456");
        //4. 定义sql语句
        String sql = "update student set grade = 60 where id =1";
        //5. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //6. 执行sql
        int count = stmt.executeUpdate(sql);
        //7. 处理结果
        System.out.println(count);
        //8. 释放资源
        stmt.close();
        conn.close();
3、详解各个对象

(1)、DriverManager:驱动管理对象
功能:
a. 注册驱动:告诉程序该使用哪一个数据库驱动 jar
static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager。
写代码使用:Class.forName(“com.mysql.jdbc.Driver”);
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
在这里插入图片描述
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
b. 获取数据库连接
'1. 方法:static Connection getConnection(String url,String user,String password)
'2. 参数
&url:指定连接路径
语法:jdbc:mysql://IP地址(域名):端口号/数据库名称
例子:jdbc:mysql://localhost:3306/db1
细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:
jdbc:mysql:///数据库名称
&user:用户名
&password:密码

(2)、Connection:数据库连接对象
功能:
a. 获取执行sql的对象
Statement createStatement()
PreparedStatement preparedStatement(String sql)
b. 管理事务
开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()

(3)、Statement:执行sql的对象
执行sql
a. boolean execute(String sql):可以执行任意的sql(了解)
b. int executeUpdate(String sql):执行DML(insert、update、delete)语句、DDL(create、alter、drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
c. ResultSet executeQuery(String sql):执行DQL(select)语句

(4)、ResultSet:结果集对象
a. boolean next():游标向下移动一行
b. getXxx(参数):获取数据
&Xxx:代表数据类型 如:getInt(),getString()
&参数:
'1. int :代表列的编号,从1开始 如:getString(1)
'2. String:代表列名称。如:getDouble(“balance”)
&注意:
使用步骤:
’1. 游标向下移动一行
‘2. 判断是否有数据
’3. 获取数据

//循环判断游标是否是最后一行末尾
while(rs.next()){
	//获取数据
	int id = rs.getInt(1);
	String name = rs.getString("name");
	double balance = re.getDouble(3);
	System.out.println(id+"---"+name+"---"+balance);
}

(5)、PreparedStatement:执行sql的对象
a. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
输入用户名随便,输入密码:a’ or ‘a’ = 'a
sql:select * from user where username = ‘dasd’ and password = ‘a’ or ‘a’ = ‘a’
b. 解决sql注入问题:使用PreparedStatement对象来解决
c. 预编译的SQL:参数使用?作为占位符
d. 步骤:
'1. 导入驱动jar包
'2. 注册驱动
'3. 获取数据库连接对象 Connection
'4. 定义sql语句
注意:sql参数使用?作为占位符。如:select * from user where username = ? and password = ?;
'5. 获取执行sql的对象 PreparedStatement Connection.prepareStatement(String sql)
'6. 给?赋值
方法:set Xxx(参数1,参数2)
参数1:?的位置编号从1开始
参数2:?的值
'7. 执行sql,接受返回结果,不需要传递sql语句
'8. 处理结果
'9. 释放资源

4、抽取JDBC工具类:JDBCUtils

(1)、目的:简化书写
(2)、分析:
a. 注册驱动抽取
b. 抽取一个方法获取连接对象
需求:不想传递参数(麻烦),还得保证工具类的通用性。
解决:配置文件

jdbc.properties
	url=
	user=
	password=

c.抽取一个方法释放资源

5、JDBC控制事务

(1)、事务:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
(2)、操作:
开启事务
提交事务
回滚事务
(3)、使用Connection对象来管理事务
a. 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
在执行sql之前开启事务
b. 提交事务:commit()
当所有sql都执行完提交事务
c. 回滚事务:rollback()
在catch中回滚事务

六、数据库连接池

1、概念:其实就是一个容器(集合),存放数据库连接的容器。

当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

2、好处

(1)、节约资源
(2)、用户访问高效

3、实现

(1)、标准接口:DateSource javax.sql包下的
方法:
a. 获取连接:getConnection()
b. 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法则不会再关闭连接,而是归还连接。
(2)、一般我们不去实现它,有数据库厂商来实现
a. C3P0:数据库连接池技术
b. Druid:数据库连接池实现技术,由阿里巴巴提供的

4、 C3P0:数据库连接池技术

步骤:
(1)、导入jar 包(两个)c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
不要忘记导入数据库驱动jar包
(2)、定义配置文件:
&名称:c3p0.properties 或者 c3p0-config.xml
&路径:直接将文件放在src目录下即可
(3)、创建核心对象 数据库连接池对象 ComboPooledDataSource
(4)、获取连接:getConnection

5、Druid:数据库连接池实现技术,由阿里巴巴提供的

(1)、步骤:
a. 导入jar 包 druid-1.0.9.jar
不要忘记导入数据库驱动jar包
b.定义配置文件:
&是properties形式的
&可以叫任意名称,可以放在任意目录下
c. 加载配置文件。Properties
d. 数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
e. 获取连接:getConnection

(2)、定义工具类
a. 定义一个类 JDBCUtils
b. 提供静态代码块加载配置文件,初始化连接池对象
c. 提供方法
‘1. 获取连接方法:通过数据库连接池获取连接
’2. 释放资源
‘3. 获取连接池的方法

6、Spring JDBC

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
(1)、导入jar包
(2)、创建JdbcTemplate对象。依赖数据源DataSource
JdbcTemplate template = new JdbcTemplate(ds);
(3)、调用JdbcTemplate的方法来完成CRUD的操作
a. update():执行DML语句。增、删、改语句
b. queryForMap():查询结果将结果集封装为map集合
这个方法查询的结果集长度只能是1
c. queryForList():查询结果,将结果集封装为list集合
将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
d. query():查询结果,将结果封装为JavaBean对象
&query的参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
new BeanPropertyRowMapper<类型>(类型.class)
e. queryForObject:查询结果,将结果封装为对象



软件框架

一、 C/S:Client/Server 客户端/服务器端

1、在用户本地有一个客户端程序,在远程有一个服务器端程序

如:QQ,迅雷…

2、优点:用户体验好
3、缺点:开发、安装、部署、维护麻烦

二、B/S:Brower/Server 浏览器服务器端

1、只需要一个浏览器,用户通过不同的网址(URL),可以访问不同的服务器端程序
2、有点:开发、安装、部署、维护简单
3、缺点:

(1)、如果应用过大,用户的体验可能会受到影响
(2)、对硬件要求过高

三、B/S架构详解

资源分类:

(1)、静态资源
a. 使用静态网页开发技术发布的资源
b. 特点:
&所有用户访问,得到的结果是一样的
如:文本、图片、音频、视频、HTML、CSS、JavaScript
&如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器。浏览器中内置了静态资源的解析引擎,可以展示静态资源
(2)、动态资源
a. 使用动态网页及时发布的资源
b. 特点
&所有用户访问,得到的结果可能不一样
如:jsp/servlet、php、asp…
&如果用户请求的是动态资源,那么服务器会执行动态资源,转换为静态资源,再发送给浏览器

(3)、我们要学习动态资源,必须首先学习静态资源
a. 静态资源:
HTML:用于搭建基础网页,展示页面的内容
CSS:用于美化页面,布局页面
JavaScript:控制页面的元素,让页面有一些动态的效果



HTML

一、概念:是最基础的网页开发语言

Hyper Text Markup Language 超文本标记语言

1、超文本:

超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。

2、标记语言

由标签构成的语言。<标签名称> 如:html、xml
标记语言不是编程语言

二、快速入门

1、语法

(1)、html文档后缀名 .html 或者 .htm
(2)、标签分为
a. 围堵标签:有开始标签和结束标签。如:<html> </html>
b. 自闭和标签:开始标签和结束标签在一起。<br/>(换行)
(3)、标签可以嵌套
需要正确嵌套,不能你中有我,我中有你
错误:<a><b></a></b>
正确:<a><b></b></a>
(4)、在开始标签中可以定义属性。属性是由键值对构成,值需要用引号(单双都可)引起来
(5)、html的标签不区分大小写,但建议使用小写

三、标签学习

1、文件标签:构成html最基本的标签

(1)、html:html文档的根标签
(2)、head:头标签。用于指定html文档的一些属性。引入外部的资源
(3)、title:标题标签
(4)、body:体标签
(5)、< !DOCTYPE html >:html5中定义该文档是html文档

2、文本标签:

(1)、 注释:<!-- 注释内容 -->
(2)、<h1> to <h6>:标题标签
h1~h6:字体大小逐渐递减
eg:<h1> </h1>
(3)、<p>:段落标签
eg:<p> </p>
(4)、<br>:换行标签
eg:<br> 或者 <br/>
(5)、<hr>:展示一条水平线
eg:<hr color="red" width="200" size="10" align="left"/> 或者 <hr>
属性:
a. color:颜色
b. width:宽度
c. size:高度
d. align:对齐方式
center:居中
left:左对齐
right:右对齐
(6)、<b>:字体加粗
eg:<b> </b>
(7)、<i>:字体斜体
eg:<i> </i>
(8)、<font>:字体标签
属性:
a. color:颜色
eg:<font> </font>
b. size:大小
c. face:字体
(9)、<center>:文本居中
(10)、属性定义
a. color:
&英文单词:red,green,blue
&rgb(值1,值2,值3):值得范围:0~255 如:rgb(0,0,255) 红绿蓝
&#值1值2值3:值的范围:00~FF之间。如:#FF00FF
b. width:
&数值:width=‘20’,数值的单位,默认是px(像素)
&数值%:占比相对于父元素的比例

3、图片标签:

img:展示图片
属性:src:指定图片的位置
eg:

<img src="image/jingxuan_2.jpg" align="right" alt="古镇" width="500" height="500"/ >
<!--
	相对路径
		以.开头的路径
		./:代表当前目录
		../:代表上一级目录
-->
<img src="./image/jingxuan_2.jpg"  >
<img src="../image/jingxuan_2.jpg"  >
4、列表标签:

有序列表:
ol li
无序列表:
ul li
在这里插入图片描述

5、链接标签:

(1)、a:定义一个超链接
(2)、属性:
a. href:指定访问资源的URL(统一资源定位符)
b. target:指定打开资源的方式
_self:默认值,在当前页面打开
_blank:在空白页面打开
在这里插入图片描述

6、div和span

div:每一个div占满一整行。块级标签
span:文本信息在一行显示,行内标签 内联标签

7、语义化标签:html5中为了提高程序的可读性,提供了一些标签。

(1)、<header> </header>
(2)、<footer> </footer>
7、表格标签:
(1)、table:定义表格
width:宽度
border:边框
cellpadding:定义内容和单元格的距离
cellsapcing:定义单元格之间的距离。如果指定为0,则单元格的线会合为一条。
bgcolor:背景色
align:对齐方式
(2)、tr:定义行
bgcolor:背景色
align:对齐方式
(3)、td:定义单元格
colspan:合并列
rowspan:合并行
(4)、th:定义表头单元格
caption:表格标题
thead:表示表格的头部分
tbody:表示表格的体部分
tfoot:表示表格的脚部分

第三个表格代码:

在这里插入图片描述

8、表单标签

(1)、概念:用于采集用户输入的数据。用于和服务器进行交互。
(2)、form:用于定义表单的。可以定义一个范围,范围代表采集用户数据的范围
属性:
a. action:指定提交数据的url
b. method:指定提交方式
分类:一共7种,两种比较常用
&get:
请求参数会在地址栏中显示。会封装到请求行中。
请求参数的大小是有限制的。
不太安全
&post:
请求参数不会在地址栏中显示。会封装到请求体中。
请求参数的大小没有限制。
较为安全
c. 表单项中的数据要想被提交,必须指定其name属性

(3)、表单项标签
a. input:可以通过type属性值,改变元素展示的样式
&type属性:
'1. text:文本输入框,默认值
placeholder:指定输入框提示信息,当输入框的内容发生变化,会自动清空提示信息
'2. password:密码输入框
'3. radio:单选框
要想让多个单选框实现单选的效果,则多个单选框的name属性值必须一样。
一般会给每一个单选框提供value属性,指定被其选中后提交的值
checked属性,可以指定默认值
'4. checkbox:复选框
一般会给每一个单选框提供value属性,指定被其选中后提交的值
checked属性,可以指定默认值
'5. file:文件选择框
'6. hidden:隐藏域,用于提交一些信息。
'7. 按钮:
submit:提交
button:普通按钮
image:图片提交按钮 src属性指定图片的路径

&label:指定输入项的文字描述信息
label的for属性一般会和input的id属性值对应。如果对应了,则点击label区域,会让input输入框获取焦点。

b. select:下拉列表
子元素:option,指定列表项

c. textarea:文本域
cols:指定列数,每一行有多少个字符
rows:默认多少行



CSS:页面美化和布局控制

一、概念:Cascading Style Sheets 层叠样式表

层叠:多个样式可以作用在同一个html的元素上,同时生效

二、好处

1、功能强大
2、将内容展示和样式控制分离

a. 降低耦合度。解耦
b. 让分工协作更容易
c. 提高开发效率

三、CSS的使用:CSS与html结合方式

1、内联样式

在标签内使用style属性指定CSS代码
如:<div style="color:red;"> hello css</div>

2、内部样式

在head标签内,定义style标签,style标签的标签体内容就是css代码
如:


```html
<style>
	div{
		color:blue;
	}
</style>
<div>hello css</div>
3、外部样式

(1)、定义css资源文件。
(2)、在head标签内,定义link标签,引入外部的资源文件
如:

<!--a.css文件:
div{
	color:green;
}-->
<link rel="stylesheet" href="css/a.css">
<div>hello css</div>

注意:
1,2,3种方式,css作用的范围越来越大
1方式不常用,后期常用2,3
3格式还可以写为:

<style>
	@import "css/a.css";
</style>
4、css语法

(1)、格式:
选择器 {
属性名1:属性值1;
属性名2:属性值2;

}
(2)、选择器:筛选具有相似特征的元素
(3)、注意:每一对属性都需要使用 ’ ; ’ 隔开,最后一对属性可以不加 ’ ; ’

5、选择器:筛选具有相似特征的元素

分类:
(1)、基础选择器
a. id选择器:选择具体id属性值的元素,建议在一个html页面中id值唯一
语法:#id属性值{}
b. 元素选择器:选择具有相同标签名称的元素
语法:标签名称{}
注意:id选择器优先级高于元素选择器
c. 类选择器:选择具有相同class属性值的元素。
语法:.class属性值{}
注意:类选择器优先级高于元素选择器
(2)、扩展选择器
a. 选择所有元素:
语法:*{}
b. 并集选择器
选择器1,选择器2{}
c. 子选择器:筛选选择器1元素下的选择器2元素
语法:选择器1 选择器2{}
d. 父选择器:筛选选择器2的父元素选择器1
语法:选择器1 > 选择器2{}
e. 属性选择器:选择元素名称,属性名=属性值的元素
语法:元素名称[属性名=“属性值”]{}
f. 伪类选择器:选择一些元素具有的状态
&语法:元素:状态{}
&状态:
link:初始化的状态
visited:被访问过的状态
active:正在访问状态
hover:鼠标悬浮状态

6、属性

(1)、字体、文本
font-size:字体大小
color:文本颜色
text-align:对齐方式
line-height:行高
(2)、背景
background
(3)、边框
border:设置边框,复合属性
(4)、尺寸
width:宽度
height:高度
(5)、盒子模型:控制布局
a. margin:外边框
b. padding:内边框
默认情况下内边框会影响整个盒子的大小
box-sizeing: border-box; 设置盒子的属性,让width和height就是最终盒子的大小
c. float:浮动
left
right



JavaScript

一、概念:一门客户端脚本语言

运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎。
脚本语言:不需要编译,直接就可以被浏览器解析执行了。

二、功能

可以用来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验。

三、JavaScript发展史

1、1992年,Nombase公司,开发出第一门客户端脚本语言,专门用于表单的校验。命名为:C–,后来更名为ScriptEase。
2、1995年,Netscape(网景)公司,开发了一门客户端脚本语言:LiveScript。后来,请来SUN公司的专家,修改LiveScript,命名为JavaScript。
3、1996年,微软抄袭JavaScript开发出JScript语言。
4、1997年,ECMA(欧洲计算机制造商协会),ECMAScript,就是所有客户端脚本语言的标准。

JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)

四、ECMAScript:客户端脚本语言标准

1、基本语法:

(1)、与html结合方式
a. 内部JS:定义<script>,标签体内容就是js代码
b. 外部JS:定义<script>,通过src属性引入外部的js文件
c. 注意:
<script>可以定义在html页面的任何地方。但是定义的位置会影响执行顺序。
<script>可以定义多个。

(2)、注释
a. 单行注释://注释内容
b. 多行注释:/* 注释内容*/

(3)、数据类型
a. 原始数据类型(基本数据类型)
number:数字。整数/小数/NaN(not a number 一个不是数字的数字类型)
string:字符串。“abc” “a” ‘acb’
boolean:true和false
null:一个对象为空的占位符
undefined:未定义。如果一个变量没有给初始化值,则会被默认赋值为undefined。
b. 引用数据类型:对象

(4)、变量
a. 变量:一小块存储数据的内存空间
b. Java语言是强类型语言,而JavaScript是弱类型语言。
强类型:在开辟变量存储空间时,定义了空间将来存储的数据的数据类型。只能存储固定类型的数据。
弱类型:在开辟变量存储空间时,不定义空间将来的存储数据类型,可以存放任意类型的数据。
c. 语法:
var 变量名 = 初始化值;
d. typeof运算符:获取变量的类型。
注:null运算后得到的是object

(5)、运算符
a. 一元运算符:只有一个运算数的运算符

++ -- +(正号)-(负号)
++(--):自增自减   
	++(--)在前,先自增(自减),再运算
	++(--)在后,先运算,再自增(自减)

&注意:在JS中,如果运算数不是运算符所要求的类型,那么JS引擎会自动将运算数进行类型转换
&其他类型转number:
string转number:按照字面值转换,如果字面值不是数字,则转为NaN(不是数字的数字)
boolean转number:true转为1,false转为0

b. 算术运算符

+ - * / % ...

c. 赋值运算符

= += -=

d. 比较运算符

> < >= <= == ===(全等于)

&比较方式:
'1. 类型相同,直接比较
字符串,按照字典顺序比较。按位追忆比较,直到得出大小为止。
'2. 类型不同,先进行类型转换,再比较
=== :全等于。在比较之前,先判断类型,如果类型不一样,直接返回false。

e. 逻辑运算符
&&:与(短路)
||:或(短路)
!:非

&其他类型转boolean
number:0或NaN为假,其他为真
string:除了空字符串(“”),其他都是true
null&undefined:都是false
对象:所有对象都是true

f. 三元运算符
语法:
表达式 ? 值1:值2;
判断表达式的值,如果是true则取值1,如果是false则取值2。
(6)、流程控制语言
a. if…else…
b. switch
在Java中,switch语句可以接受的数据类型:byte short int char ,枚举(1.5),string(1.7)
在JS中,switch语句可以接受任意的原始数据类型
c. while
d. do…while
e. for
(7)、JS特殊语法
a. 语句以;结尾,如果一行只有一条语句则;可以省略(不建议)
b. 变量的定义使用var关键字,也可以不使用
用:定义的变量是局部变量
不用:定义的变量是全局变量(不建议)

2、基本对象

(1)、Function:函数(方法)对象
a. 创建

1.var fun = new Function(形式参数列表,方法体);//没用
2.function 方法名称(形式参数列表){
	方法体
  }
3.var 方法名 = function(形式参数列表){
	方法体
  }

b. 方法:
c. 属性:
length:代表形参的个数
d. 特点
方法的定义时,参数类型不用写,返回值类型也不写。
方法是一个对象,如果定义名称相同的方法,会覆盖。
在JS中,方法的调用只与方法的名称有关,和参数列表无关。
在方法声明中有一个隐藏的内置对象(数组),argument,封装所有的实际参数。
e. 调用
方法名称(实际参数列表);

(2)、Array:数组对象
a. 创建
var arr = new Array(元素列表);
var arr = new Array(默认长度);
var arr = [元素列表];
b. 方法
join():将数组中的元素按照指定的分隔符拼接为字符串
push():向数组的末尾添加一个或更多元素,并返回新的长度
c. 属性
length:数组的长度
d. 特点
JS中,数组元素的类型可变。
JS中,数组长度可变。

(3)、Boolean
(4)、Date:日期对象
a. 创建
var date = new Date();
b. 方法
toLocaleString():返回当前data对象对应的时间本地字符串格式
getTime():获取毫秒值。返回当前日期对象描述的时间到1970年1月1日零点的毫秒值差

(5)、Math
a. 创建:
特点:Math对象不用创建,直接使用。Math.方法名();
b. 方法:
random():返回0~1之间的随机数。含0不含1
ceil(x):向上取整
floor(x):向下取整
round(x):四舍五入
c. 属性
PI:圆周率

(6)、Number

(7)、String

(8)、RegExp:正则表达式对象
a. 正则表达式:

&单个字符:[ ]
如:[a] [ab] [a-zA-Z0-9]
特殊符号代表特殊含义的单个字符:
\d:单个数字字符 [0-9]
\w:单个单词字符 [a-zA-Z0-9]

&量词符号:
?:表示出现0次或1次
*:表示出现0次或多次
+:表示出现1次或多次
{m,n}:表示 m <= 数量 <= n
{,n}:最多n次
{m,}:最少m次

&开始结束符号
^:开始
$:结束

b. 正则表达式对象:
'1. 创建
var reg = new RegExp(“正则表达式”);
var reg = /正则表达式/;

var reg = new RegExp("^\\w{6,12}$");
var reg = /^\w{6,12}$/;

'2. 方法
test(参数):验证指定的字符串是否符合正则定义的规范

(9)、Global
a. 特点:全局对象,这个Global中封装的方法不需要对象就可以直接调用。 方法名();
b. 方法
encodeURI():url编码
decodeURI():url解码

encodeURIComponent():url编码,编码的字符更多
decodeURIComponent():url解码

parseInt():将字符串转化为数字
逐一判断每一个字符是否是数字,直到不是数字为止,将前边数字部分转为number

isNaN():判断一个值是否是NaN
NaN六亲不认,连自己都不认。NaN参与的==比较全部为false

eval():将JavaScript字符串,并把它作为脚本代码来执行。

c. URL编码
学习 = %E5%AD%A6%E4%B9%A0

五、BOM

1、概念:Browser Object Model 浏览器对象模型

将浏览器的各个组成部分封装成对象。

2、组成

(1)、Window:窗口对象
a. 创建

b. 方法

’1. 与弹出框有关的方法
&. alert():显示一段消息和一个确认按钮的警告框。
&. confirm():显示带有一段消息以及确认按钮和取消按钮的对话框。
如果用户点击确认按钮,则方法返回true
如果用户点击取消按钮,则方法返回false
&. prompt():显示可提示用户输入的对话框。
返回值:用户输入的值

'2. 与打开关闭有关的方法
close():关闭浏览器窗口。 谁调用我,我关谁。
open():打开一个新的浏览器窗口。 返回新的Window对象。

'3. 与定时器有关的方法
&. setTimeout(参数1,参数2):在指定的毫秒数后调用函数或计算表达式。
参数1:js代码或方法对象。
参数2:毫秒值
返回值:唯一标识,用于取消定时器。
&. clearTimeout():取消由setTimeout()方法设置的timeout。

&. setInterval(参数1,参数2):按照指定的周期(以毫秒计)来调用函数或计算表达式。
&. clearInterval():取消由 setInterval() 设置的timeout。

c. 属性
‘1. 获取其他BOM对象
history
location
Navigator
Screen
'2. 获取其他DOM对象
document
d. 特点
Window对象不需要创建可以直接使用。 window.方法名();
window引用可以省略。 方法名();

(2)、Navigator:浏览器对象

(3)、Screen:显示器屏幕对象

(4)、History:历史记录对象
a. 创建
&. window.history
&. history
b. 方法
&. back():加载history列表中的前一个URL。
&. forward():加载history列表中的下一个URL。
&. go(参数):加载history列表中的某个具体页面。
参数:
正数:前进几个历史记录
负数:后退几个历史记录
c. 属性
length:返回当前窗口历史列表中的URL数量。
(5)、Location:地址栏对象
a. 创建(获取)
&. window.location
&. location
b. 方法:
relode():重新加载当前文档。刷新
c. 属性
href:设置或返回完整的URL。

DOM简单学习

1、功能:控制html文档的内容
2、代码:获取页面标签(元素)对象 Element

document.getElementById(“id值”):通过元素的id获取元素对象

3、操作Element对象

(1)、修改属性值
明确获取的对象是哪一个
查看API文档,找其中有哪些属性可以设置
(2)、修改标签体的内容
属性:innerHTML
事件简单学习
(1)、功能:某些组件被执行了某些操作后,触发某些代码的执行。
(2)、如何绑定事件
a. 直接在html标签上,指定事件的属性(操作),属性值就是js代码
事件:onclick 单击事件
b. 通过js获取元素对象,指定事件属性,设置一个函数

六、DOM

1、概念:Document Object Model 文档对象模型

将标记语言文档的各个组成部分,封装为对象。可以使用这些对象,将标记语言文档进行CRUD的动态操作
在这里插入图片描述

2、W3C DOM标准被分为3个不同的部分

(1)、核心DOM:针对任何结构化文档的标准模型
Document:文档对象
Element:元素对象
Attribute:属性对象
Text:文本对象
Comment:注释对象
Node:节点对象,其他5个的父对象
(2)、XML DOM:针对XML文档的标准模型
(3)、HTML DOM:针对HTML文档的标准模型

3、核心DOM模型

(1)、Document:文档对象
a. 创建(获取):在html dom模型中可以使用window对象来获取
&. window.document
&. document
b. 方法
&. 获取Element对象
getElementById():根据id属性值获取元素对象。id属性值一般唯一。
getElementsByTagName():根据元素名称获取元素对象们。返回值是一个数组。
getElementsByClassName():根据Class属性值获取元素对象们。返回值是一个数组。
getElementsByName():根据name属性值获取元素对象们。返回值是一个数组。
&. 创建其他DOM对象
createAttribute(name)
createComment()
createElement()
createTextNode()
c. 属性

(2)、Element:元素对象
a. 获取/创建:通过document来获取和创建
b. 方法:
removeAttribute():删除属性
setAttribute():设置属性
(3)、Node:节点对象,其他5个的父对象
a. 特点:所有dom对象都可以被认为是一个节点
b. 方法:CRUD dom树
appendChild():向节点的子节点列表的结尾添加新的子节点。
removeChild():删除(并返回)当前节点的指定子节点。
replaceChild():用新节点替换一个子节点。
c. 属性:
parentNode 返回节点的父节点。

4、HTML DOM

(1)、标签体的设置和获取:innerHTML
(2)、使用html元素对象的属性。
(3)、控制元素样式
a. 使用元素的style属性来设置

//修改元素样式
div1.style.border = "1px solid red";

b. 提前定义好类选择器的样式,通过元素的className属性来设置器class属性值

七、事件

1、概念:某些组件被执行了某些操作,触发某些代码的执行。

(1)、事件:某些操作,如:单击,双击,键盘按下了,鼠标移动了。
(2)、事件源:组件。如:按钮,文本输入框…
(3)、监听器:代码。
(4)、注册监听:将事件,事件源,监听器结合在一起。当事件源上发生了某个事件,则触发执行某个监听器代码。

2、常见的事件

(1)、点击事件
onclick:单击事件
ondblclick:双击事件
(2)、焦点事件
onblur:失去焦点
onfocus:获得焦点
(3)、加载事件
onload:一张页面或一幅图像完成加载。
(4)、鼠标事件
a. onmousedown:鼠标按钮被按下
定义方法时,定义一个形参,接受event对象。
event对象的button属性可以获取哪个鼠标按键被点击了(0:左键 1:中间 2:右键)。
b. onmousemove:鼠标被移动
c. onmouseout:鼠标从某元素移开
d. onmouseover:鼠标移到某元素之上
e. onmouseup:鼠标按键被松开
(5)、键盘事件
onkeydown:某个键盘按键被按下或者鼠标按键被按下。
onkeyup:某个键盘按键被松开。
onkeypress:某个键盘按键被按下并松开。
(6)、选择和改变
onchange:域的内容被改变。
onselect:文本被选中。
(7)、表单事件
a. onsumit:确认按钮被点击。
可以阻止表单的提交。方法返回false表单被阻止提交。
b. onreset:重置按钮被点击。


Bootstrap

一、概念:

一个前端开发的框架,Bootstrap,来自Twitter,是目前很受欢迎的前端框架。Bootstrap是基于HTML、CSS、JavaScript的,它简洁灵活,使得web开发更加快捷。

1、框架:

一个半成品软件,开发人员可以在框架基础上,在进行开发,简化编码。

2、好处:

(1)、定义了很多CSS样式和js插件。我们开发人员直接可以使用这些样式和插件得到丰富的页面效果。
(2)、响应式布局。同一套页面可以兼容不同分辨率的设备。

二、快速入门

1、下载Bootstrap
2、在项目中将这三个文件夹复制
3、创建html页面,引入必要的资源文件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>Bootstrap 101 Template</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="js/jquery-3.2.1.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>

</head>
<body>
<h1>你好,世界!</h1>


</body>
</html>

三、响应式布局

1、同一套页面可以兼容不同分辨率的设备。
2、实现:

依赖于栅格系统:将一行平均分成12个格子,可以指定元素占几个格子。

3、步骤

(1)、定义容器。相当于table。
容器分类:
container:两边留白
container-fluid:每一种设备都是100%宽度
(2)、定义行。相当于之前的tr 样式:row
(3)、定义元素。指定该元素在不同的设备上,所占的各自数目。样式:col-设备代号-格子数目
a. 设备代号
xs:超小屏幕 手机 (<768px):col-xs-12
sm:小屏幕 平板 (≥768px)
md:中等屏幕 桌面显示器 (≥992px)
lg:大屏幕 大桌面显示器 (≥1200px)
(4)、注意
a. 一行中如果各自数目超过12,则超出部分会自动换行。
b. 栅格类属性可以向上兼容。栅格类适用于与屏幕宽度大于或等于分界点大小的设备。
c. 如果真实设备宽度小于了设置栅格类属性的设备代码的最小值,会一个元素占满一整行。

四、CSS样式和js插件

1、全局css样式

(1)、按钮:class=“btn btn-default”
(2)、图片:
a. class=“img-responsive”:图片在任意尺寸都占100%
b. 图片形状

<img src="..." alt="..." class="img-rounded"> //方形
<img src="..." alt="..." class="img-circle"> //圆形
<img src="..." alt="..." class="img-thumbnail"> //相框

(3)、表格
table
table-bordered
table-hover
(4)、表单
给表单项添加:class=“from-control”

2、组件

导航条
分页条

3、插件

轮播图



xml

一、概念

Extensible Markup Language 可扩展标记语言

1、可扩展:

标签都是自定义的。<user> <student>

2、功能

(1)、存储数据
a. 配置文件
b. 在网络中传输

3、xml与html的区别

(1)、xml标签都是自定义的,html是预定义。
(2)、xml语法严格,html语法松散
(3)、xml是存储数据的,html是展示数据

4、W3C:万维网联盟

万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。到目前为止,W3C已发布了200多项影响深远的Web技术标准及实施指南,如广为业界采用的超文本标记语言HTML(标准通用标记语言下的一个应用)、可扩展标记语言XML(标准通用标记语言下的一个子集)以及帮助残障人士有效获得Web信息的无障碍指南(WCAG)等,有效促进了Web技术的互相兼容,对互联网技术的发展和应用起到了基础性和根本性的支撑作用。

二、语法

1、基本语法

(1)、xml文档的后缀名 .xml
(2)、xml第一行必须定义为文档声明
(3)、xml文档中有且仅有一个根标签
(4)、属性值必须使用引号(单双都可以)引起来
(5)、标签必须正确关闭
(6)、xml标签名称区分大小下

2、快速入门
<?xml version='1.0' ?>
<users>
	<user id='1'>
		<name>zhangsan</name>
		<age>23</age>
		<gender>male</gender>
	</user>
	<user id='2'>
		<name>lisi</name>
		<age>20</age>
		<gender>female</gender>
	</user>
</users>
3、组成部分

(1)、文档声明
a. 格式:<?xml 属性列表 ?>
b. 属性列表
version:版本号,必须的属性
encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
standalone:是否独立。 取值:yes:不依赖其他文件 no:依赖其他文件
(2)、指令(了解):结合CSS

<?xml-stylesheet tybe="text/css" href="a.css" ?>

(3)、标签:标签名称自定义的
规则:
名称可以包含字母、数字以及其他的字符
名称不能以字母xml(或XML、Xml 等等)开始
名称不能包含空格
(4)、属性
id属性值唯一
(5)、文本
CDATE区:在该区域中的数据会被原样展示
格式:<![CDATE[ 数据 ]]>

4、约束:规定xml文档的书写规则

在这里插入图片描述
(1)、作为框架的使用者(程序员):
a. 能够在xml中引入约束文档
b. 能够简单的读懂约束文档
(2)、分类
a. DTD:一种简单的约束技术
b. Schema:一种复杂的约束技术
(3)、DTD
引入dtd文档到xml文档中
a. 内部dtd:将约束规则定义在xml文档中
b. 外部dtd:将约束的规则定义在外部的dtd文件中
本地:<!DOCTYPE 跟标签名 SYSTEM "dtd文件的位置">
网络:<!DOCTYPE 跟标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">

(4)、Schema
引入:
a. 填写xml文档的根元素
b. 引入xsi前缀。xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
c. 引入xsd文件命名空间。xsi:schemaLocation=“http://www.itcast.cn/xml student.xsd”
d. 为每一个xsd约束声明一个前缀,作为标识 xmlns=“http://www.itcast.cn/xml”

<students  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.itcast.cn/xml"
	xsi:schemaLocation="http://www.itcast.cn/xml student.xsd">
5、解析:操作xml文档,将文档中的数据读取到内存中

(1)、操作xml文档
a. 解析(读取):将文档中的数据读取到内存中
b. 写入:将内存中的数据保存到xml文档中。持续化存储。
(2)、解析xml的方式
a. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树(服务器端)
优点:操作方便,可以对文档进行CRUD的所有操作。
缺点:占内存
b. SAX:逐行读取,基于事件驱动的。(移动端)
优点:不占内存。
缺点:只能读取,不能增删改。
(3)、xml常见的解析器
a. JAXP:sun公司提供的解析器,支持dom和sax两种思想
b. DOM4J:一款非常优秀的解析器
c. Jsoup: jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
d.PULL:Android操作系统内置的解析器,sax方式的。
(4)、Jsoup: jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
快速入门:
a. 导入jar包
b. 获取Document对象
c. 获取对应的标签Element对象
d. 获取数据

		//2.获取Document对象,根据xml文档获取
        //2.1获取student.xml的path
        String path = JsoupDemo.class.getClassLoader().getResource("student.xml").getPath();
        //2.2解析xml文档,加载文档进内存,获取dom树-->Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.获取元素对象 Element
        Elements elements = document.getElementsByTag("name");
        //3.1获取第一个name的Element对象
        Element element = elements.get(0);
        //3.2获取数据
        String name = element.text();
        System.out.println(name);

(5)、对象的使用
a. Jsoup:工具类,可以解析html或xml文档,返回Document。
&. parse:解析html文档或xml文档,返回Document。
parse(File in,String charseName):解析xml或html文件的。
parse(String html):解析xml或html字符串。
parse(URL url, int timeoutMills):通过网络路径获取指定的html或xml的文档对象。

b. Document:文档对象,代表内存中的dom树。
&. 获取Element对象
getElementById(String id):根据id属性值获取唯一的element对象。
getElementsByTag(String tagName):根据标签名称获取元素对象集合。
getElementsByAttribute(String key):根据属性名称获取元素对象集合。
getElementByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合。

c. Elements:元素Element对象的集合,可以当做ArrayList<Element>来使用。

d. Element:元素对象
'1. 获取子元素对象
getElementById(String id):根据id属性值获取唯一的element对象。
getElementsByTag(String tagName):根据标签名称获取元素对象集合。
getElementsByAttribute(String key):根据属性名称获取元素对象集合。
getElementByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合。
'2. 获取属性值
String attr(String key):根据属性名称获取属性值
'3. 获取文本内容
String text():获取所有子标签的纯文本内容
String html():获取标签体所有内容(包括子标签的标签和文本内容)
e. Node:节点对象
是Document和Element的父类

(6)、快捷查询方式
a. selector:选择器
使用的方法:Element select(String cssQuery)
语法:参考Selector类中定义的语法

在这里插入图片描述
在这里插入图片描述
b. XPath:即为XML路径语言它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。
使用Jsoup的XPath需要额外导入jar包。
查询w3cshool参考手册,使用XPath语法完成查询。

在这里插入图片描述
在这里插入图片描述

网络通信三要素:

1、IP:电子设备(计算机)在网络中的唯一标识。
2、端口:应用程序在计算机中的唯一标识。
3、传输协议:规定了数据传输的规则
基础协议:
a. tcp:安全协议。三次握手。速度稍慢。
b. udp:不安全协议。速度快。



web服务器软件

一、服务器

1、服务器:安装了服务器软件的计算机
2、服务器软件:接受用户的请求,处理请求,做出响应。
3、web服务器软件:接受用户的请求,处理请求,做出响应。
在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
web容器
4、常见的Java相关的web服务器软件:
webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
webSphere:IBM公司,大型的javaEE服务器,支持所有的JavaEE规范,收费的。
JBOSS:JBOSS公司的,大型的javaEE服务器,支持所有的JavaEE规范,收费的。
Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。
5、JavaEE:Java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范。

二、Tomcat web服务器软件

1、下载:

http://tomcat.apache.org/

2、安装:

解压压缩包即可。
注意:安装目录下不建议有中文和空格。
在这里插入图片描述

3、卸载:删除目录即可
4、启动:

(1)、bin/startup.bat,双击运行该文件即可
(2)、访问:浏览器输入:http://localhost:8080 回车访问自己
http://别人的ip:8080 访问别人
(3)、可能遇到的问题
a. 黑窗口一闪而过
原因:没有正确配置JAVA_HOME环境变量
解决方案:正确配置JAVA_HOME环境变量
b. 启动报错
&. 暴力:找到该占用的端口号,并且找到对应的进程,杀死该进程
cmd:netstat -ano
&. 温柔:修改自身的端口号
'1. conf/server.xml
'2. <Connector port="8080" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1"/>
'3. 一般会将tomcat的默认端口号改为80。80端口号是http协议的默认端口号。
好处:在访问时,就不用输入端口号。

5、关闭

(1)、正常关闭
bin/shutdown.bat
ctrl + c
(2)、强制关闭:
点击启动窗口的x

6、配置

(1)、部署项目的方式
a. 直接将项目放到webapps目录下即可。
/hello:项目的访问路径–>虚拟目录
简化部署:将项目打包成一个war包,再将war包放置到webapps目录下。 war包会自动解压缩。
b. 配置conf\server.xml文件
<Host>标签体中配置

<Context docBase ="D:hello" path="/hehe" />

docBase:项目存放的路径
path:虚拟目录
c. 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写

<Context docBase ="D:hello"/>

虚拟目录:xml文件的名称

(2)、静态项目和动态项目
java动态项目的目录结构:

项目的根目录
	WEB-INF目录
		web.xml:web项目核心配置文件
		classes目录:放置字节码文件的目录
		lib目录:放置依赖的jar包

(3)、将Tomcat集成到IDEA中,并且创建JavaEE的项目,部署项目。



Servlet

在这里插入图片描述

一、概念:运行在服务器端的小程序

Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
将来我们自定义一个类,实现Servlet接口,复写方法。

二、快速入门

1、创建JavaEE项目
2、定义一个类,实现Servlet接口

public class ServletDemo1 implements Servlet

3、实现接口中的抽象方法
4、配置Servlet
在web.xml中配置:

<!--配置Servlet-->
    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>web.servlet.ServletDemo1</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>

三、执行原理

在这里插入图片描述
1、当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径。
2、查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3、如果有,则在找到对应的<servlet-class>全类名。
4、tomcat会将字节码文件加载进内存,并且创建其对象。
5、调用其方法。

四、Servlet中生命周期方法

1、被创建:执行init方法,只执行一次。
(1)、Servlet什么时候被创建?
a. 默认情况写,第一次被访问时,Servlet被创建。
b. 可以配置指定Servlet的创建时机。
&. 在<servlet>标签下配置
第一次被访问时,创建<load-on-startup>的值为负数
在服务器启动时,创建<load-on-startup>的值为正数
(2)、Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。
多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值。
2、提供服务:执行service方法,执行多次。
每次访问Servlet时,service方法都会被调用一次。
3、被销毁:执行destory方法,只执行一次。
Servlet被销毁时执行。服务器关闭,Servlet被销毁。
只有服务器正常关闭时,才会执行destory方法。
destory方法在Servlet被销毁之前执行,一般用于释放资源。

五、Servlet3.0

好处:支持注解配置。可以不需要web.xml了。
步骤:
(1)、创建JavaEE项目,选择Servlet的版本3.0以上。
(2)、定义一个类,实现Servlet接口
(3)、复写方法
(4)、在类上使用@WebServlet注解,进行配置
@WebServlet(“资源路径”)

六、IDEA与tomcat的相关配置

1、IDEA会为每一个tomcat部署的项目单独建立一份配置文件
查看控制台的log:
Using CATALINA_BASE: “C:\Users\18257.IntelliJIdea2018.2\system\tomcat_JavaSE_Code”
2、工作空间项目和tomcat部署的web项目
tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目”对应着“工作空间项目”的web目录下的所有资源
WEB-INF目录下的资源不能被浏览器直接访问。
断点调试:使用"小虫子"启动 debug启动

七、Servlet的体系结构

Servlet - -接口(父)
GenericServlet - -抽象类(子)
HttpServlet - -抽象类(孙)
1、GenericServlet:将Servlet接口中其他方法做了默认空实现,只将service()方法作为抽象。
将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可。
2、HttpServlet:对http协议的一种封装,简化操作
在这里插入图片描述

定义类继承HttpServlet
复习doGet/doPost方法

八、Servlet相关配置

1、urlpattern:Servlet访问路径
(1)、一个Servlet可以访问多个访问路径:@WebServlet({“/d4”,“/dd4”,“/ddd4”})
(2)、路径定义规则:
a. /xxx
b. /xxx/xxx:多层目录,目录结构
c. *.do

HTTP

一、概念:

Hyper Text Transfer Protocol 超文本传输协议
1、传输协议:定义了客户端和服务器端通信时,发送数据的格式。
2、特点:
(1)、基于TCP/IP的高级协议
(2)、默认端口号:80
(3)、基于请求响应模型的:一次请求对应一次响应。
(4)、无状态的:每次请求之间相互独立,不能交互数据。
3、历史版本
1.0:每一次请求响应都会建立新的连接
1.1:复用连接

二、请求消息数据格式

请求消息:客户端发送给服务器端的数据
1、请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
(1)、请求方式
HTTP协议中有7种请求方式,常用的有2种
a. GET:
请求参数在请求行中,在url后。
请求的url长度有限制的。
不太安全。
b. POST:
请求参数在请求体中。
请求的url长度没有限制。
相对安全。
2、请求头:客户端浏览器告诉服务器一些信息。
请求头名称:请求头值
常见的请求头:
a. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
可以在服务器端获取该头的信息,解决浏览器的兼容新问题
b. Referer:http://localhost/login.html
告诉服务器,我(当前请求)从哪里来。
作用: ‘1. 防盗链 ’2. 统计工作
在这里插入图片描述

3、请求空行
空行,就是用于分割POST请求的请求头和请求体的。
4、请求体(正文)
封装POST请求消息的请求参数的
在这里插入图片描述

三、request对象和response对象的原理

在这里插入图片描述

1、request对象和response对象是由服务器创建的,我们来使用它们。
2、request对象是来获取请求信息,response对象是来设置响应信息。

四、resquest对象继承体系结构

ServletRequest    --接口
      | 继承
HttpServletquest	--接口
	  | 实现
org.apache.catalina.connector.RequestFacade	--类(tomcat)

五、request功能

1、获取请求信息数据
(1)、获取请求行数据
GET /day14/demo1?name=zhangsan HTTP/1.1
方法:
a. 获取请求行数据:GET
String getMethod()
b. 获取虚拟目录:/day14
String getContextPath()
c. 获取Servlet路径:/demo1
String getServletPath()
d. 获取get方式请求参数:name=zhangsan
String getQueryString()
e. 获取请求URI:/day14/demo1
String getRequestURI():/day14/demo1
StringBuffer getRequestURL():http://localhost/day14/demo1

URL:统一资源定位符:http://localhost/day14/demo1 eg:中华人民共和国
URI:统一资源标识符:/day14/demo1(范围大一些)eg:共和国
f. 获取协议及版本:HTTP/1.1
String getProtocol()
g. 获取客户机的IP地址
String getRemoteAddr()
(2)、获取请求头数据
String getHeader(String name):通过请求头的名称获取请求头的值。
Enumberation<String> getHeaderNames():获取所有的请求头名称
(3)、获取请求体数据
a. 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数。
b. 步骤:
'1. 获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据。
ServletInputStream getInputStream():获取字节输入流,可以操作所有数据类型。
'2. 再从流对象中拿数据

2、其他功能
(1)、获取请求参数通用方式
String getParameter(String name):根据参数名称获取参数值。 username=zs&password=123
String getParameterValues(String name):根据参数名称获取参数值的数组。 hobby=xx&hobby=game
Enumberation< String > getParameterNames():获取所有请求参数名称。
Map< String,String > getParameterMap():获取所有参数的map集合。

中文乱码问题:
get方式:tomcat 8 已经将get方式乱码问题解决了。
post方式:会乱码 解决:在获取参数前,设置reuqest的编码request.setCharacterEncoding(“utf-8”);
(2)、请求转发:一种在服务器内部的资源跳转方式
a. 步骤:
'1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
'2. 通过RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
b. 特点
'1. 浏览器地址栏路径不发生改变
'2. 只能转发到当前服务器内部资源中
'3. 转发是一次请求

(3)、共享数据
a. 域对象:一个有作用范围的对象,可以在范围内共享数据。
b. request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据。
c. 方法
void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对

(4)、获取ServletContext:
ServletContext getServletContext()

六、登录案例

1、用户登录案例需求:
(1)、编写login.html登录页面
username & password 两个输入框
(2)、使用Druid数据库连接池技术,操作mysql,day14数据库中user表
(3)、使用JdbcTemplate技术封装JDBC
(4)、登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
(5)、登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

2、案例分析
在这里插入图片描述
3、开发步骤
(1)、创建项目,导入html页面,配置文件,jar包。
(2)、创建数据库环境

CREATE DATABASE day14;

USE day14;

CREATE TABLE student(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(32) UNIQUE NOT NULL,
	PASSWORD VARCHAR(32) NOT NULL
);

3、创建包cn.itcast.domain,创建类User。
4、创建包cn.itcast.util,创建类JDBCUtils。
5、创建包cn.itcast.dao,创建类UserDao,提供login方法。
6、创建包cn.itcast.web.servlet,创建类LoginServlet、SuccessServlet、FailServlet类。
7、login.html中from表单的action路径的写法。
虚拟目录+Servlet的资源路径
8、BeanUtils工具类,简化数据封装。
用于封装JavaBean的
(1)、JavaBean:标准的Java类
a. 要求
类必须被public修饰
必须提供空参的构造器
成员变量必须使用private修饰
提供公共setter和getter方法
b. 功能:封装数据
(2)、概念
成员变量
属性:setter和getter方法截取后的产物。
(3)、方法
setProperty()
getProperty()
populate(Object obj,Map map):将map集合的键值对信息,封装到对应的JavaBean对象中。

七、响应消息数据格式

相应消息:服务器端发送给客户端的数据
1、响应行
(1)、组成:协议/版本 响应状态码 状态码描述
(2)、响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
a. 状态码都是3位数字
b. 分类
1xx:服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx多状态码。
2xx:成功。代表:200
3xx:重定向。代表:301(重定向),304(访问缓存)
4xx:客户端错误。代表:404(请求路径没有对应的资源),405(请求方式没有对应的doXxx方法)
5xx:服务器端错误。代表:500(服务器内部出现异常)

2、响应头
(1)、格式:头名称:值
(2)、常见的响应头
&. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
&. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
in-line:默认值,在当前页面内打开。
attachment; filename=xxx:以附件形式打开响应体。文件下载。
3、响应空行
4、响应体:传输的数据

在这里插入图片描述

八、Response对象

功能:设置响应消息
1、设置响应行
(1)、格式:HTTP/1.1 200 ok
(2)、设置状态码:setStatus(int sc)
2、设置响应头:setHeader(String name,String value)
3、设置响应体
步骤:
(1)、获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
(2)、使用输出流,将数据输出到客户端浏览器

4、重定向
(1)、重定向:资源跳转方式
(2)、代码实现

//方式1
//设置状态码为302
response.setStatus(302);
//设置响应头location
response.setHeader("location","/day15/responseDemo2");

//方式2 简单的重定向方法
response.setRedirect("/day15/responseDemo2");

redirect和forward区别
(3)、重定向的特点:redirect
a. 地址栏发生变化
b. 重定向可以访问其他站点(服务器)的资源
c. 重定向是两次请求。不能使用request对象来共享数据。
(4)、转发的特点:forward
a. 转发地址栏路径不变
b. 转发只能访问当前服务器下的资源
c. 转发是一次请求,可以使用request对象来共享数据。
(5)、路径写法
路径分类:
a. 相对路径:通过相对路径不可以确定唯一元素
'1. 如:./index.html
不以/开头,以.开头路径
'2. 规则:找到当前资源和目标资源之间的相对位置关系
./:当前目录
…/:后退一级目录

b. 绝对路径:通过绝对路径可以确定唯一元素
'1. 如:https://localhost/day15/responseDemo2
/day15/responseDemo2
以/开头的路径
'2. 规则:判断定义的路径是给谁用的,判断请求从哪里发出
&. 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
建议虚拟目录动态获取:request.getContextPath()
<a> <form> 重定向
&. 给服务器使用:不需要加虚拟目录
转发路径

5、服务器输出字符数据到浏览器
(1)、步骤
获取字符输出流
输出数据
(2)、注意
乱码问题:
1.PrintWriter pw = response.getWriter(); 获取的流的默认编码是ISO-8859-1
2.设置该流的默认编码
3.告诉浏览器响应体使用的编码
简单的形式,设置编码,是在获取流之前设置的
在这里插入图片描述

6、服务器输出字节数据到浏览器
(1)、步骤
获取字节输出流
输出数据
7、验证码
本质:图片
目的:防止恶意表单注册
在这里插入图片描述

九、ServletContext对象

1、概念:代表整个web应用,可以和程序的容器来通信
2、获取
(1)、通过request对象获取
request.getServletContext();
(2)、通过HttpServlet获取
this.getServletContext();
3、功能:
(1)、获取MIME类型
1.MIME类型:在互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型 text/html image/ipeg
2.获取:String getMimeType(String file)
(2)、域对象:共享数据
1.setAttribute(String name,Object value)
2.getAttribute(String name)
3.removeAttribute(String name)
ServletContext对象范围:所有用户所有请求的数据
(3)、获取文件的真实(服务器)路径
1.方法:String getRealPath(String path)
在这里插入图片描述

案例

在这里插入图片描述

在这里插入图片描述

会话技术

一、会话技术

1、会话:一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
2、功能:在一次会话的范围内多次请求间,共享数据。
3、方式
(1)、客户端绘画技术:Cookie
(2)、服务器端会话技术:Session

二、Cookie

1、概念:客户端会话技术,将数据保存到客户端
2、快速入门
(1)、使用步骤:
1.创建Cookie对象,绑定数据
new Cookie(String name,String value)
2.发送Cookie对象
response.addCookie(Cookie cookie)
3.获取Cookie,拿到数据
Cookie[ ] resquest.getCookies()
3、实现原理
基于响应头set-cookie和请求头cookie实现

在这里插入图片描述
4、Cookie的细节
(1)、一次可不可以发送多个cookie?
可以
可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
(2)、cookie在浏览器中保存多长时间?
1.默认情况下,当浏览器关闭后,Cookie数据被销毁。
2.持久化存储:
setMaxAge(int seconds)
a. 正数:将cookie数据写到硬盘的文件中。持久化存储。并指定cookie存储时间,时间到后,cookie文件自动失效。
b. 负数:默认值
c. 零:删除cookie信息
(3)、cookie能不能存中文?
在tomcat 8之前,cookie中不能直接存储中文数据。 需要将中文数据转码 ,一般采用URL编码(%E3)。
在tomcat 8之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码来解析。
(4)、cookie共享问题
1.假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
a. 默认情况下cookie不能共享
b. setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录。
如果要共享,则可以将path设置为"/"
2.不同的tomcat服务器间cookie共享问题?
setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享。
eg:setDomain(“.baidu.com”),那么tieba.baidu.com和news.baidu.com中cookie可以共享。

5、Cookie的特点和作用
(1)、cookie存储数据在客户端浏览器
(2)、浏览器对于单个的cookie的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)

(3)、作用
1.cookie一般用于存储少量的不太敏感的数据
2.在不登录的情况下,完成服务器对客户端的身份识别
6、案例
在这里插入图片描述

三、Session

1、概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
2、快速入门
(1)、获取HttpSession对象
HttpSession session = request.getSession();
(2)、使用HttpSession对象
Object getAttribute(String name)
void setAttribute(String name,Object value)
void removeAttribute(String name)

3、原理
Session的实现是依赖于Cookie的。
在这里插入图片描述
4、细节:
(1)、当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
默认情况下不是。
如果需要相同,则可以创建Cookie键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
在这里插入图片描述

(2)、客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失。
session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上。
session的活化:在服务器启动后,将session文件转化为内存中的session对象即可。
(3)、session什么时候被销毁?
1.服务器关闭
2.session对象调用 invalidate()。
3.session默认失效时间 30分钟
选择性配置修改

<session-config>
	<session-timeout>30</session-timeout>
</session-config>

5、session特点
(1)、session用于存储一次会话的多次请求的数据,存在服务器端
(2)、session可以存储任意类型,任意大小的数据。

6、session与cookie的区别:
(1)、session存储数据在服务器,Cookie在客户端
(2)、session没有数据大小限制,Cookie有
(3)、session数据安全,cookie相对于不安全

JSP:入门学习

一、概念:
Java Server Pages:Java服务器端页面
可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
用于简化书写!!!
二、原理
JSP本质上就是一个Servlet
在这里插入图片描述

三、JSP的脚本:JSP定义Java代码的方式
1、<% 代码 %>:定义的Java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
2、<%! 代码 %>:定义的Java代码,在jsp转换后的Java类的成员变量。
3、<%= 代码 %>:定义的Java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
四、JSP的内置对象
1、在JSP页面中不需要获取和创建,可以直接使用对象。
2、JSP一共有9个内置对象。
(1)、request
(2)、response
(3)、out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
response.getWriter()和out.write()的区别:
在tomcat服务器真正给客户端做出响应之前。会先找response缓冲区数据,再找out缓冲区数据response.getWriter()数据输出永远在out.write()之前。

312

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值