JavaWeb
2022-03-29 11:08:14 24 举报
AI智能生成
JavaWeb完整整理
作者其他创作
大纲/内容
MySQL
引言
现有的数据存储方式有哪些?
- Java中存储数据(变量、对象、数组、集合),数据都是保存在内存中,属于瞬时状态数据
文件(File)存储数据,保存在硬盘上,属于持久化状态存储
以上存储方式存在哪些缺点?
- 程序停止,数据就没了。
- 文件存储的数据:没有数据类型的区分
- 没有访问安全限制
- 没有备份、恢复机制。
- 文件存储的数据:没有数据类型的区分
- 没有访问安全限制
- 没有备份、恢复机制。
数据库
概念
数据库是 "按照数据结构来组织、存储、管理数据的仓库"。是一个可以长期存储在计算机内的、有组织的、有共享的、可以统一管理的数据集合
数据库的分类
- 网状结构数据库:以节点形式存储数据和访问数据
- 层次结构数据库:IBM[IMS]。定向有序的树状结构实现存储和访问。
- 关系结构数据库:Oracle、MySQL、DB2、SQL Server,以表格(Table)形式存储,多表之间建立关联关系,通过分类、合并、连接、选取等方式实现访问。
- 非关系型数据库:MongDB、Redis,使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据
- ElastecSearch
- 层次结构数据库:IBM[IMS]。定向有序的树状结构实现存储和访问。
- 关系结构数据库:Oracle、MySQL、DB2、SQL Server,以表格(Table)形式存储,多表之间建立关联关系,通过分类、合并、连接、选取等方式实现访问。
- 非关系型数据库:MongDB、Redis,使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据
- ElastecSearch
数据库管理系统
概念
数据库管理系统:指的是一种操作和管理数据库的大型软件,用于建立、使用、维护数据库,对数据库进行统一的管理和控制,保证数据库的安全性和完整性。
用户通过数据库管理系统访问数据库中的数据
用户通过数据库管理系统访问数据库中的数据
常见的数据库管理系统
- Oracle:可以运行在UNIX、Windows等主流操作系统,支持所有的工业标准,并获得了最高级别的ISO标准安全性认证。
- DB2:IBM公司的,满足中大公司的需要
- SQL Server:微软退出的。
- SQLLite:手机端的数据库
- Mysql:免费、适合中小型企业
- DB2:IBM公司的,满足中大公司的需要
- SQL Server:微软退出的。
- SQLLite:手机端的数据库
- Mysql:免费、适合中小型企业
MySQL
简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发的。属于Oracle旗下的产品。
MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,是最好的应用软件之一。
MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,是最好的应用软件之一。
访问与下载
官网:https://www.mysql.com
下载地址:https//dev.mysql.com/downloads/mysql/
下载地址:https//dev.mysql.com/downloads/mysql/
配置环境变量
Windows:
- 创建MYSQL_HOME:C:\Program Files\MySQL\MySQL Server 5.7
- 追加Path:%MYSQL_HOME%\bin;
- 创建MYSQL_HOME:C:\Program Files\MySQL\MySQL Server 5.7
- 追加Path:%MYSQL_HOME%\bin;
MySQL的目录结构
MySQL配置文件
SQL
概念
SQL:结构化查询语言,用于存取数据、更新、查询和管理关系数据库系统的程序设计语言。
经验:通常执行对数据库的"增、删、改 、查",简称C(Create)、R(Read)、U(Update)、D(Delete)
MySQL应用
对于数据库的操作,需要在连接MySQL的环境下进行指令输入,并在一行指令的末尾使用 ; 结束
基本命令
查看MySQL中所有数据库
#连接到MySQL
mysql> SHOW DATABASES; #显示当前MySQL中所有的数据库
mysql> SHOW DATABASES; #显示当前MySQL中所有的数据库
创建自定义数据库 CREATE DATABASE
mysql>CREATE DATABASE nz2002; #创建了名称为nz2002的数据库
mysql>CREATE DATABASE NZ2002 CHARACTER SET gbk;#创建数据库并设置其默认字符集为GBK
mysql>CREATE DATABASE NZ2002 CHARACTER SET GBK COLLATE gbk_chinese_ci;#支持简体中文和繁体中文
mysql>CREATE DATABASE IF NOT EXISTS NZ2002;#如果NZ2002不存在,则创建,反之,不创建
mysql>CREATE DATABASE NZ2002 CHARACTER SET gbk;#创建数据库并设置其默认字符集为GBK
mysql>CREATE DATABASE NZ2002 CHARACTER SET GBK COLLATE gbk_chinese_ci;#支持简体中文和繁体中文
mysql>CREATE DATABASE IF NOT EXISTS NZ2002;#如果NZ2002不存在,则创建,反之,不创建
删除数据库 DROP DATABASE
mysql>DROP DATABASE NZ2002;#删除数据库
查看数据库创建信息 SHOW CREATE DATABASE
mysql>SHOW CREATE DATABASE NZ2002;# 查看创建数据库时的基本信息
修改数据库 ALTER DATABASE
mysql>ALTER DATABASE NZ2002 CHARACTER SET UTF8;#修改数据库nz2002的字符集为utf-8
使用数据库 USE
mysql>USE NZ2002;#当前环境下,操作NZ2002数据库
查看当前使用的数据库 SELECT DATABASE();
mysql>SELECT DATABASE();#查看当前使用的数据库
修改数据库 ALTER DATABASE
使用数据库 USE
查看当前使用的数据库 SELECT DATABASE();
客户端工具
Navicat
是一套快速、可靠并且价格便宜的数据库管理工具,专为简化数据库管理及降低系统管理成本而设。
SQLyog
也拥有图形化界面。拥有广泛的预定义工具和查询、友好的视觉界面。类似Excel的查询结果编辑界面
DataGrip(Idea开发工具集成)
创建一个companyDB的数据库,然后在对象浏览器区,右键->执行SQL脚本->找到文件,打开->点击执行
数据查询【重点】
数据表的基本结构
关系结构数据库是以表格(Table)进行数据存储,表格由行和列组成
- 经验:执行查询语句返回的结果集是一张虚拟表
基本查询
语法:SELECT 列名 FROM 表名
查询所有列
#查询t_employees表中所有员工的所有信息
SELECT * FROM t_employees;
SELECT 所有的列名 FROM t_employees;
SELECT * FROM t_employees;
SELECT 所有的列名 FROM t_employees;
经验:生产环境下,优先使用列名查询。*的方式虽然看起来便捷,但实际上需要转换成全列名,效率低,可读性差
查询部分列
#查询表中的所有员工的编号、姓氏、邮箱
SELECT EMPLOYEE_ID,FIRST_NAME,Email FROM t_employees;
#查询表中所有员工的编号、部门编号
SELECT EMPLOYEE_ID,DEPARTMENT_ID FROM t_employees;
SELECT EMPLOYEE_ID,FIRST_NAME,Email FROM t_employees;
#查询表中所有员工的编号、部门编号
SELECT EMPLOYEE_ID,DEPARTMENT_ID FROM t_employees;
对列中的数据进行运算
#查询员工表中所有员工的编号、姓名、年薪
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY * 13 FROM t_employees;
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY * 13 FROM t_employees;
列的别名
列 AS '列名'
查询结果去重
distinct 列名
排序查询
SELECT 列名 FROM 表名 ORDER BY 排序列名 [排序规则]
ASC升
DESC降
条件查询
SELECT 列名 FROM 表名 WHERE 条件
等值判断(=)
不等值判断(>、<、>=、<=、!=、<>)
逻辑判断(and、or、not)
区间判断(between and)
NULL值判断(IS NULL、IS NOT NULL)
枚举查询(IN (值1,值2,值n....))
模糊查询(_、%)
分支结构查询
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
WHEN 条件3 THEN 结果3
WHEN 条件4 THEN 结果4
ELSE 结果
END
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
WHEN 条件3 THEN 结果3
WHEN 条件4 THEN 结果4
ELSE 结果
END
时间查询
SELECT 时间函数([参数列表]);
#1.当前系统时间
SELECT SYSDATE();
#2.获得当前日期
SELECT CURDATE();
#3.获得当前时间
SELECT CURTIME();
#4.获得指定日期在一年中为第几周
SELECT WEEK(CURDATE());
#5.获取指定日期中的年份
SELECT YEAR(CURDATE());
#6.获取指定日期中的月份
SELECT MONTH(CURDATE());
#7.获取指定日期中的日
SELECT DAY(CURDATE());
#8.获取指定日期中的时
SELECT HOUR(SYSDATE());
#9.获取指定日期中的分
SELECT MINUTE(SYSDATE());
#10.获取指定日期中的秒
SELECT SECOND(SYSDATE());
#11.获取Date1和Date2之间相隔的天数
SELECT DATEDIFF(SYSDATE(),'2019-3-26');
#12.在指定日期之上加N天后的日期
SELECT ADDDATE(SYSDATE(),6);
SELECT SYSDATE();
#2.获得当前日期
SELECT CURDATE();
#3.获得当前时间
SELECT CURTIME();
#4.获得指定日期在一年中为第几周
SELECT WEEK(CURDATE());
#5.获取指定日期中的年份
SELECT YEAR(CURDATE());
#6.获取指定日期中的月份
SELECT MONTH(CURDATE());
#7.获取指定日期中的日
SELECT DAY(CURDATE());
#8.获取指定日期中的时
SELECT HOUR(SYSDATE());
#9.获取指定日期中的分
SELECT MINUTE(SYSDATE());
#10.获取指定日期中的秒
SELECT SECOND(SYSDATE());
#11.获取Date1和Date2之间相隔的天数
SELECT DATEDIFF(SYSDATE(),'2019-3-26');
#12.在指定日期之上加N天后的日期
SELECT ADDDATE(SYSDATE(),6);
字符串查询
SELECT字符串函数([参数列表])
CONCAT
拼接
INSERT
将str中指定pos位置开始len长度的内容替换为newStr
LOWER
将指定字符串转换为小写
UPPER
将指定字符串转换为大写
SUBSTRING
将str字符串指定pos位置开始截取len个内容
聚合函数
SELECT 聚合函数(列名) FROM 表名;
COUNT
SUM
AVG
MAX
MIN
分组查询
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名)
分组过滤查询
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名) HAVING 过滤规则
限定查询
SELECT 列名 FROM 表名 LIMIT 起始行,查询行
子查询(作为一张表)
SELECT 列名 FROM (子查询结果集) WHERE 条件;
合并查询(了解)
- SELECT 列名 FROM 表名 1 UNION SELECT 列名 FROM 表名2
- SELECT 列名 FROM 表名 1 UNION ALL SELECT 列名 FROM 表名2
- SELECT 列名 FROM 表名 1 UNION ALL SELECT 列名 FROM 表名2
表连接查询
SELECT 列名 FROM 表1 连接方式 表2 ON 连接条件;
左外连接查询(LEFT JOIN ON)
右外连接查询(RIGHT JOIN ON)
DML操作(增、删、改)
新增(INSERT)
INSERT INTO 表名 (列1,列2,列3...) VALUES(值1,值2,值3.....)
修改(UPDATE)
UPDATE 表名 SET 列名1=新值1,列名2 = 新值2...... WHERE 条件
删除
DELETE FROM 表名 WHERE 条件
清空(TRUNCATE)
TRUNCATE TABLE 表名;
库表操作
库表操作
数据库创建(CREATE)
#创建默认字符集的数据库
CREATE DATABASE MYDB1;
CREATE DATABASE MYDB1;
#创建指定字符集的数据库
CREATE DATABASE MYDB1 CHARACTER SET UTF8;
CREATE DATABASE MYDB1 CHARACTER SET UTF8;
修改数据库
#修改mydb1的字符集给gbk
ALTER DATABASE MYDB1 CHARACTER SET GBK;
ALTER DATABASE MYDB1 CHARACTER SET GBK;
删除数据库
DROP DATABASE 库名
数据类型
MySQL大致可以分为三类:数值、日期/时间、字符串(字符)类型。对于我们建表,约束列的类型有很大的帮助
数据表的创建(CREATE)
CREATE TABLE 表名(
列名 数据类型 [约束],
列名 数据类型 [约束],
.......
列名 数据类型 [约束] //最后一列的创建,末尾不需要加逗号
)(); //根据需要指定表的字符编码集
列名 数据类型 [约束],
列名 数据类型 [约束],
.......
列名 数据类型 [约束] //最后一列的创建,末尾不需要加逗号
)(); //根据需要指定表的字符编码集
约束
实体完整性约束
表中一行数据代表一个实体(entity),实体完整性约束是标识每一行数据不重复、实体唯一。
主键约束
PRIMARY KEY 唯一,标识表中的一行数据,此列的值不可重复,且不能为NULL
唯一约束
UNIQUE 唯一,标识表中的一行数据,不可重复,可以为NULL
自动增长列
AUTO_INCREMENT 自动增长,给主键数值列添加自动增长。从1开始,每次加1。不能单独使用,和主键搭配
域完整性约束
非空约束
NOT NULL 非空,约束此列的每一个单元格不允许有NULL
默认值约束
DEFAULT 为列赋予默认值,当新增的数据不指定值时,可以书写DEFAULT,以定义好的默认值进行填充
引用完整性约束
语法:CONSTRAINT 引用名 FOREIGN KEY (列名) REFERENCES 被引用表名(列名)
详解:FOREIGN KEY 引用外部表的某个列的值,新增数据时,约束此列的值必须是被引用表中存在的值
详解:FOREIGN KEY 引用外部表的某个列的值,新增数据时,约束此列的值必须是被引用表中存在的值
数据表的修改(ALTER)
ALTER TABLE 表名 修改操作;
添加列add
修改列modify
删除列drop
改变列change
修改表名rename
删除表drop
事务
事务是一个原子操作,最小执行单元,可以由一个或多个sql语句组成,要成功全成功,要失败,全失败
Start TranScation或Set autoCommit=0,或aotuCommit(false)开始
commit成功
rollback失败
特性
Atomicity原子性
Consistency一致性
isolation隔离性
durability持久性
基本用于增删改操作
权限管理
创建用户,CREATE USER 用户名 IDENTIFIED BY 密码
授权
GRAND ALL TO 数据库.表名TO 用户名
撤销用户权限
REVOKE ALL ON 数据库.表名FROM用户名
删除用户
DROP USER 用户名
视图
视图,虚拟表,从一个表中或多个表中查询出来的结果表,作用和真实表一样,包含一系列的带有行和列的数据。视图中,可以使用SELECT语句查询数据,也可以使用INSERT、UPDATE、DELETE修改记录,视图可以使用户操作方便,并保障了数据库系统安全。
优点
- 简单化,数据所见即所得
- 安全性,只能查询或修改视图中锁能见到的数据
- 逻辑独立性,可以屏蔽真实表结构变化带来的影响。
- 安全性,只能查询或修改视图中锁能见到的数据
- 逻辑独立性,可以屏蔽真实表结构变化带来的影响。
缺点
- - 性能相对较差,简单的查询会稍微复杂
- 修改不方便,当视图的数据是复杂的聚合视图时,无法修改。
- 修改不方便,当视图的数据是复杂的聚合视图时,无法修改。
视图的创建
CREATE VIEW 视图名AS查询数据源表的语句
视图的修改
一
CREATE OR REPLACE VIEW 视图名AS查询源表的语句
二
AlTER VIEW 视图名AS查询源表的语句
视图的删除
DROP VIEW 视图名
视图的注意事项
- 视图不会独立存储数据,原表发生改变,视图的数据也发生改变。没有优化查询的性能
- 如果视图包含以下结构中的一种,则视图不可更新
- 聚合函数的结果
- GROUP BY分组后的结果
- HAVING筛选过滤后的结果
- UNION、UNION ALL联合后的结果
- 如果视图包含以下结构中的一种,则视图不可更新
- 聚合函数的结果
- GROUP BY分组后的结果
- HAVING筛选过滤后的结果
- UNION、UNION ALL联合后的结果
SQL语言分类
1. 数据查询语言DQL (Data Query Language):SELECT、WHERE、ORDER BY 、GROUP BY 、HAVING
2. 数据定义语言DDL (Data Definition Language): CREATE、ALTER、DROP
3. 数据操作语言DML(Data Manipulation Language):INSERT、UPDATE、DELETE
4. 事务处理语言TPL (Transaction Process Language):COMMIT、ROLLBACK
5. 数据控制语言DCL (Data Control Language):GRANT、REVOKE
2. 数据定义语言DDL (Data Definition Language): CREATE、ALTER、DROP
3. 数据操作语言DML(Data Manipulation Language):INSERT、UPDATE、DELETE
4. 事务处理语言TPL (Transaction Process Language):COMMIT、ROLLBACK
5. 数据控制语言DCL (Data Control Language):GRANT、REVOKE
JDBC
JDBC(Java DataBase Connectivity) Java连接数据库,可以使用Java语言连接数据库完成CRUD操作
MySQL数据库驱动
- mysql-connector-java-5.1.X 适用于5.X版本
- mysql-connector-java-8.0.X 适用于8.X版本
- mysql-connector-java-8.0.X 适用于8.X版本
步骤
使用Class.forName("com.mysql.jdbc.Driver"); 手动加载字节码文件到JVM中
通过DriverManager.getConnection(url,user,password);获得数据库连接对象
- URL:jdbc:mysql://localhost:3306/database
- user:root
- password:1234
- URL:jdbc:mysql://localhost:3306/database
- user:root
- password:1234
通过Connection对象获得Statement对象,用于对数据库进行通用访问的
编写SQL语句,并执行,接收执行后的结果
接收并处理操作结果
遵循的是先开后关的原则,释放过程中用到的所有资源对象
ResultSet
ResultSet rs = statement.executeQuery(sql语句)
ResultSet以表(Table)结构进行临时结果的存储,需要通过JDBC API将其中的数据进行依次获取
- 数据行指针:初始位置在第一行数据前,每调用一次boolean next()方法,ResultSet中指针向下移动一行,结果为true,表示当前行有数据
- resultSet.getXxx("列名"); 根据列名获得数据
- resultSet.getXxx(整数下标); 代表根据列的编号顺序获得!从1开始
- 数据行指针:初始位置在第一行数据前,每调用一次boolean next()方法,ResultSet中指针向下移动一行,结果为true,表示当前行有数据
- resultSet.getXxx("列名"); 根据列名获得数据
- resultSet.getXxx(整数下标); 代表根据列的编号顺序获得!从1开始
常见错误
- java.lang.ClassNotFoundException 找不到类(类名书写错误、没有导入jar包)
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException 与SQL语句相关的错误(表名列名书写错误、约束错误、插入的值是String类型,但是没有加单引号)建议:在客户端工具中测试sql语句后,再粘贴到代码中来
- com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'S1003' for key 'PRIMARY' 原因:主键值已存在!更改要插入的主键值
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Unknown column 'password' in
- 可能输入的值的类型不对,确定插入元素时,对应的值的类型是否争取
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException 与SQL语句相关的错误(表名列名书写错误、约束错误、插入的值是String类型,但是没有加单引号)建议:在客户端工具中测试sql语句后,再粘贴到代码中来
- com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'S1003' for key 'PRIMARY' 原因:主键值已存在!更改要插入的主键值
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Unknown column 'password' in
- 可能输入的值的类型不对,确定插入元素时,对应的值的类型是否争取
sql注入
当用户输入的数据中有SQL关键字或语法时,并且参与了SQL语句的编译,导致SQL语句编译后条件结果为true,一直得到正确的结果。称为SQL注入
PreparedStatement【重点】
作用:1.预编译SQL语句,效率高!
2.安全,避免SQL注入
3.可以动态的填充数据,执行多个同构的SQL语句
2.安全,避免SQL注入
3.可以动态的填充数据,执行多个同构的SQL语句
pstmt.setXxx(下标,值); 参数下标是从1开始,为指定占位符下标绑定值
封装工具类
getConnection
closeAll
通过流获取配置文件中的信息
ORM实体类
- 一行数据中,多个零散的数据进行整理
- 通过entity的规则对表中的数据进行对象的封装
- 表名=类名;列名=属性名;提供各个属性的get、set方法
- 提供无参构造方法、(视情况添加有参构造)
- 通过entity的规则对表中的数据进行对象的封装
- 表名=类名;列名=属性名;提供各个属性的get、set方法
- 提供无参构造方法、(视情况添加有参构造)
DAO
数据访问对象
- 将所有对同一张表的操作都封装在一个XXXDaoImpl对象中。
- 根据增删改查的不同功能,实现具体的方法(insert,update,delete,select,selectAll)
- 经验:对于任何一张表中的数据进行操作时,无非就是增、删、改、查。应将对于一张表的所有操作统一封装在一个数据访问对象中。重用
- 将所有对同一张表的操作都封装在一个XXXDaoImpl对象中。
- 根据增删改查的不同功能,实现具体的方法(insert,update,delete,select,selectAll)
- 经验:对于任何一张表中的数据进行操作时,无非就是增、删、改、查。应将对于一张表的所有操作统一封装在一个数据访问对象中。重用
日期类型
- java.util.Date
- Java语言常规应用层面的日期类型。可以通过字符串创建对应的时间对象
- 无法直接通过JDBC插入数据库
- Java语言常规应用层面的日期类型。可以通过字符串创建对应的时间对象
- 无法直接通过JDBC插入数据库
- java.sql.Date
- 不可以通过字符串创建对应的时间对象。只能通过毫秒值创建对象(1970年1月1日至今的毫秒值)
- 可以直接通过JDBC插入数据库
- 不可以通过字符串创建对应的时间对象。只能通过毫秒值创建对象(1970年1月1日至今的毫秒值)
- 可以直接通过JDBC插入数据库
通过SimpleDateFormat日期格式化
parse()方法将字符串转化为Java.util类型的日期类型
通过new Java.sql.Date(java.util.Date.getTime())获得sql类型的日期类型
format(new Date())方法将日期类型转化为字符串
连接池
JDBC每次连接数据库,都要获得一个连接对象。每次创建一个连接对象,都是一个较大的资源,如果在连接量较大的场景下,会极大的浪费资源。容易内存溢出。
Java中提供了一个接口DataSource,通过实现该接口,可以创建连接池
Druid(德鲁伊)连接池
Druid 是目前比较流行高性能的,分布式列存储
一、亚秒级查询
二、实时数据注入
三、可扩展的PB级存储
四、多环境部署
五、丰富的社区
一、亚秒级查询
二、实时数据注入
三、可扩展的PB级存储
四、多环境部署
五、丰富的社区
- 首先用DruidDataSourceFactory工厂类调用的 createDataSource(properties)方法是德鲁伊工厂创建的连接池是DateSource类型的(DruidDataSource)强转类型
- 调用druidDataSource的getConnection()方法得到的Connection也是DruidDataSource类型的
- 所以当用完Connection之后调用的close()方法也是druidDataSource的close()
- 调用druidDataSource的getConnection()方法得到的Connection也是DruidDataSource类型的
- 所以当用完Connection之后调用的close()方法也是druidDataSource的close()
Service业务层
概念:用户要完成的一个业务功能,是由一个或多个的DAO调用组成。
软件、程序提供的一个功能都叫业务
软件、程序提供的一个功能都叫业务
ThreadLocal
线程工具类:在整个线程中,一直到释放资源,用的是同一个Connection连接对象。
1、在整个线程(单条执行路径中)所持有的Map中,存储一个键(threadlocal)值(connection)对
2、线程(Thread)对象中持有一个ThreadLocalMap类型的对象(ThreadLocals),threadLocals中保存了以ThreadLocal对象为Key,set进去的值为Value
3、每个线程均可绑定多个ThreadLocal,一个线程中可存储多个ThreadLocal
2、线程(Thread)对象中持有一个ThreadLocalMap类型的对象(ThreadLocals),threadLocals中保存了以ThreadLocal对象为Key,set进去的值为Value
3、每个线程均可绑定多个ThreadLocal,一个线程中可存储多个ThreadLocal
三层架构
- 表示层:
- 命名:xxxVIew
- 职责:收集用户的数据和需求、展示数据
- 业务逻辑层
- 命名:XXXServiceImpl
- 职责:数据的加工处理、调用Dao组合完成业务实现、控制事务
- 数据访问层
- 命名:xxxDaoImpl
- 职责:向业务层提供数据,将业务层加工处理后的数据同步到数据库
- 命名:xxxVIew
- 职责:收集用户的数据和需求、展示数据
- 业务逻辑层
- 命名:XXXServiceImpl
- 职责:数据的加工处理、调用Dao组合完成业务实现、控制事务
- 数据访问层
- 命名:xxxDaoImpl
- 职责:向业务层提供数据,将业务层加工处理后的数据同步到数据库
封装DML方法
将sql语句和参数传进去,循环Set赋值,得到结果返回
封装DQL方法
定义一个接口,用于操作得到的结果集处理,返回一个对象,通过泛型控制对象类型
Apache的DbUtils使用
Commons DbUtils 是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能勾简化JDBC应用程序的开发!同时,不会影响程序的性能
DbUtils是Java编程中数据库操作实用小工具,小巧、简单、实用
- 对于数据表的查询操作,可以吧结果转换为List、Array、Set等集合。便于操作
- 对于数据表的DML操作,也变得很简单(只需要写SQL语句);
- 对于数据表的查询操作,可以吧结果转换为List、Array、Set等集合。便于操作
- 对于数据表的DML操作,也变得很简单(只需要写SQL语句);
- ResultSetHandler接口:转换类型接口
- BeanHandler类:实现类,把一条记录转换成对象
- BeanListHandler类:实现类,把多条记录转换成List集合。
- ScalarHandler类:实现类,适合获取一行一列的数据。
- QueryRunner:执行sql语句的类
- 增、删、改:update();
- 查询:query();
- BeanHandler类:实现类,把一条记录转换成对象
- BeanListHandler类:实现类,把多条记录转换成List集合。
- ScalarHandler类:实现类,适合获取一行一列的数据。
- QueryRunner:执行sql语句的类
- 增、删、改:update();
- 查询:query();
DbUtil的使用步骤
导入jar包
- mysql连接驱动jar包
- druid-1.1.5.jar
- database.properties配置文件
- commons-dbutils-1.6.jar
- mysql连接驱动jar包
- druid-1.1.5.jar
- database.properties配置文件
- commons-dbutils-1.6.jar
HTML
概念
HTML概述
HTML全称:Hyper Text Markup Language(超文本标记语言)
HTML是一门用户创建网页文档的标记语言,网页本身是一种文本文件,在文本文件中添加标记符。
浏览器来解析HTML标记的内容(文字的处理,画面排版安排,图片如何显示、音频、视频等等)
HTML是用来创建网页的标记语言
HTML是一门用户创建网页文档的标记语言,网页本身是一种文本文件,在文本文件中添加标记符。
浏览器来解析HTML标记的内容(文字的处理,画面排版安排,图片如何显示、音频、视频等等)
HTML是用来创建网页的标记语言
HTML特点
1、简易性:超文本标记语言的版本升级采用的超集方式。更加方便灵活
2、可扩展性:超文本标记语言采取的子类元素的方式,为系统扩展带来保证
3、平台无关性:
4、通用性:HTML是网络的通用语言,一种简单、通用的标记语言。
2、可扩展性:超文本标记语言采取的子类元素的方式,为系统扩展带来保证
3、平台无关性:
4、通用性:HTML是网络的通用语言,一种简单、通用的标记语言。
HTML的发展
超文本标记语言(第一版)------1993年6月作为互联网工程小组(IETF)工作草案发布(并非标准)
HTML2.0 --1995年11月
HTML3.2 --1997年1月14日,W3C标准
HTML4.0 --1997年12月18日 W3C标准
HTML4.01 --1999年12月24日 W3C的推荐标准
HTML5 ---2014年10月29日,W3C推荐标准
HTML2.0 --1995年11月
HTML3.2 --1997年1月14日,W3C标准
HTML4.0 --1997年12月18日 W3C标准
HTML4.01 --1999年12月24日 W3C的推荐标准
HTML5 ---2014年10月29日,W3C推荐标准
HTML基本结构
1、HTML页面包含头部head和主体body
2、HTML标签通常是成对出现的,有开始标签,有结束标签,称为对标签。没有结束标签的为 空标签
3、HTML标签都长都有属性,格式:属性名 = "属性值" 属性名 = "属性值"。多个属性用空格间隔
4、HTML标签不区分大小写,建议小写
5、HTML文件后缀名为html或htm
2、HTML标签通常是成对出现的,有开始标签,有结束标签,称为对标签。没有结束标签的为 空标签
3、HTML标签都长都有属性,格式:属性名 = "属性值" 属性名 = "属性值"。多个属性用空格间隔
4、HTML标签不区分大小写,建议小写
5、HTML文件后缀名为html或htm
HTML基本标签
结构标签
属性:
color:文本的颜色
bgColor:背景色
background:背景图片
颜色的表示方式:
第一种:颜色名称 red blue green yellow orange
第二种方式:RGB模式 #000000 #ffffff #325687
color:文本的颜色
bgColor:背景色
background:背景图片
颜色的表示方式:
第一种:颜色名称 red blue green yellow orange
第二种方式:RGB模式 #000000 #ffffff #325687
排版标签
1、注释标签:<!-- 注释-->
2、换行标签:<br/>
3、段落标签:<p>文本文字</p>
特点:段落与段落之间有行高(行间距)自带换行
属性:文本对齐方式 align (left、center 、right)
4、水平线标签:<hr/>
属性:
width:水平线的长度(两种:像素表示。第二种:百分比显示)
size:水平线的粗细(避免过粗、太丑、一般给个位数 比如 6px)
color:水平线的颜色
align:水平线的对齐方式(left、center、right)
2、换行标签:<br/>
3、段落标签:<p>文本文字</p>
特点:段落与段落之间有行高(行间距)自带换行
属性:文本对齐方式 align (left、center 、right)
4、水平线标签:<hr/>
属性:
width:水平线的长度(两种:像素表示。第二种:百分比显示)
size:水平线的粗细(避免过粗、太丑、一般给个位数 比如 6px)
color:水平线的颜色
align:水平线的对齐方式(left、center、right)
标题标签
<h1>-<h6>
数字越小,标题文字越大!默认加粗、默认字号、默认占据一行
数字越小,标题文字越大!默认加粗、默认字号、默认占据一行
容器标签
<div></div> : 块级标签,独占一行,自带换行
<span></span> : 行级标签,所有内容都在同一行
作用:<div>主要是结合css做页面分块 布局
<span>:进行友好提示信息的显示
<span></span> : 行级标签,所有内容都在同一行
作用:<div>主要是结合css做页面分块 布局
<span>:进行友好提示信息的显示
列表标签
无序列表
ul(unorder list)
有序列表
ol(order list)
定义列表
dl(defination list)定义列表
dt(defination title)定义标题
dd(defination description) 定义描述
dt(defination title)定义标题
dd(defination description) 定义描述
图片标签
<img /> 独立标签
属性:
src 图片地址
width 图片的宽度
height 图片的高度
border 边框
alt 图片的文字说明 当图片未能正确加载时,才显示
title 鼠标悬停时,显示的文字
属性:
src 图片地址
width 图片的宽度
height 图片的高度
border 边框
alt 图片的文字说明 当图片未能正确加载时,才显示
title 鼠标悬停时,显示的文字
链接标签
<a>文本或图片</a>、
属性:
href="跳转的地址"跳转外网需要添加协议
target:_self(当前文档)
_blank(新页面,会一直打开新的)
_search 之前打开的页面存在,则不打开新的页面,直接复用
name 充当锚点(顶部、底部)
需要为标签提供name属性,进行赋值
需要点击跳转的标签href属性给 #name
属性:
href="跳转的地址"跳转外网需要添加协议
target:_self(当前文档)
_blank(新页面,会一直打开新的)
_search 之前打开的页面存在,则不打开新的页面,直接复用
name 充当锚点(顶部、底部)
需要为标签提供name属性,进行赋值
需要点击跳转的标签href属性给 #name
表格标签
普通表格
table tr td
表格的表头
th
表格的列合并
colspan
表格的行合并
rowspan
子主题
文本格式化标签
<!--粗体文本-->
<b>今天天气好</b><br />
<!--大号字-->
<big>今天天气好</big><br />
<!--着重文字-->
<em>今天天气好</em><br />
<!--斜体字 物理上把字体倾斜-->
<i>今天天气好</i><br /
<!--小号字-->
<small>今天天气好</small><br />
<!--定义加重语气-->
<strong>今天天气好</strong><br />
<!--下标字-->
CO<sub>2</sub><br />
<!--上标字-->
孙悟空三打张阔<sup>①</sup><br />
<!--插入字-->
<ins>今天天气好</ins><br />
!--删除字-->
<del>今天天气好</del>
<b>今天天气好</b><br />
<!--大号字-->
<big>今天天气好</big><br />
<!--着重文字-->
<em>今天天气好</em><br />
<!--斜体字 物理上把字体倾斜-->
<i>今天天气好</i><br /
<!--小号字-->
<small>今天天气好</small><br />
<!--定义加重语气-->
<strong>今天天气好</strong><br />
<!--下标字-->
CO<sub>2</sub><br />
<!--上标字-->
孙悟空三打张阔<sup>①</sup><br />
<!--插入字-->
<ins>今天天气好</ins><br />
!--删除字-->
<del>今天天气好</del>
表单标签
- name是为了让表单中的内容提交到服务器
- value是默认值和设定名字
- placeholder=""是提示
- checked="checked" 和 selected="selected"是默认选择
- value是默认值和设定名字
- placeholder=""是提示
- checked="checked" 和 selected="selected"是默认选择
CSS
css介绍
什么是css
指层叠样式表
cascading(层叠)style(样式)sheet(表格)
作用
- 通过css可以定义html元素如何显示
- html很粗糙,css去对他进行装修
优点
通过css可以大大提高工作效率,可以让我将html代码于样式代码分离
css是一个地方 html功能代码是一个地方,两者不在一个地方,易于维护和重用
结合
css与HTML结合之内联结合
在标签中使用style属性,格式如下:
- style="属性名1: 属性值1;属性名2: 属性值2"
- 颜色取值:颜色英文单词/颜色16进制
- 颜色取值:颜色英文单词/颜色16进制
缺点:不能复用
优点:简单;对少数特定的元素进行单独设置
优点:简单;对少数特定的元素进行单独设置
css与HTML结合之内部结合
- 需要在head标签中,使用style标签
- 使用选择器选中元素
- 编写css代码
- 使用选择器选中元素
- 编写css代码
缺点:复用性不高,css和html代码分离不彻底
优点:简单
优点:简单
css与HTML结合之外部结合
web中的路径
绝对路径
- 带协议的绝对路径(以http开头)
- 不带协议的绝对路径
- 不带协议的绝对路径
相对路径
<!--demo08.html的访问路径:
相对于demo09.html(html包下)资源去访问css01.css资源 ../:上一级目录;
css选择器
id选择器
不管是内部结合还是外部结合都可以使用(#)
类选择器
使用”.”来描述,引用的的是元素上的class属性值
标签选择器
对页面上的标签进行统一的设置,引用的就是标签的名称.
选择器分组
多个选择器使用同一段css,那么就可以使用分组。选择器之间使用逗号分开.
衍生选择器
通过依据元素在其位置的上下文关系来定义,可以使标记更加简洁。也称为上下文选择器.
- 父选择器:可以是id选择器、class选择器、元素选择器
- 子选择器:可以是id选择器、class选择器、元素选择器
- 中间用空格分开
- 父选择器:可以是id选择器、class选择器、元素选择器
- 子选择器:可以是id选择器、class选择器、元素选择器
- 中间用空格分开
选择器的优先级
- 优先级:内联样式 > id选择器 > 类选择器 > 标签选择器
- 规律:作用范围越小,优先级越大!!!
- 规律:作用范围越小,优先级越大!!!
css伪类
a:link {color: #FF0000} 未访问的链接
a:visited {color: #00FF00} 已访问的链接
a:hover {color: #FF00FF} 鼠标移动到链接上
a:active {color: #0000FF} 选定的链接
a:visited {color: #00FF00} 已访问的链接
a:hover {color: #FF00FF} 鼠标移动到链接上
a:active {color: #0000FF} 选定的链接
a:hover 必须被置于 a:link 和 a:visited 之后
a:active 必须被置于 a:hover 之后
a:active 必须被置于 a:hover 之后
css字体属性
font-style
规定字体样式。参阅:font-style 中可能的值。
font-variant
规定字体异体。参阅:font-variant 中可能的值。
font-weight
规定字体粗细。参阅:font-weight 中可能的值。
font-size/line-height
规定字体尺寸和行高。参阅:font-size 和 line-height 中可能的值。
font-family
规定字体系列。参阅:font-family 中可能的值。
caption
定义被标题控件(比如按钮、下拉列表等)使用的字体。
icon
定义被图标标记使用的字体。
menu
定义被下拉列表使用的字体。
message-box
定义被对话框使用的字体。
small-caption
caption 字体的小型版本。
status-bar
定义被窗口状态栏使用的字体。
规定字体样式。参阅:font-style 中可能的值。
font-variant
规定字体异体。参阅:font-variant 中可能的值。
font-weight
规定字体粗细。参阅:font-weight 中可能的值。
font-size/line-height
规定字体尺寸和行高。参阅:font-size 和 line-height 中可能的值。
font-family
规定字体系列。参阅:font-family 中可能的值。
caption
定义被标题控件(比如按钮、下拉列表等)使用的字体。
icon
定义被图标标记使用的字体。
menu
定义被下拉列表使用的字体。
message-box
定义被对话框使用的字体。
small-caption
caption 字体的小型版本。
status-bar
定义被窗口状态栏使用的字体。
css文本属性
color
设置文本颜色
direction
设置文本方向。
line-height
设置行高。
letter-spacing
设置字符间距。
text-align
对齐元素中的文本。
text-decoration
向文本添加修饰。
text-indent
缩进元素中文本的首行。
text-shadow
设置文本阴影。CSS2 包含该属性,但是 CSS2.1 没有保留该属性。
text-transform
控制元素中的字母。
unicode-bidi
设置文本方向。
white-space
设置元素中空白的处理方式。
word-spacing
设置字间距。
设置文本颜色
direction
设置文本方向。
line-height
设置行高。
letter-spacing
设置字符间距。
text-align
对齐元素中的文本。
text-decoration
向文本添加修饰。
text-indent
缩进元素中文本的首行。
text-shadow
设置文本阴影。CSS2 包含该属性,但是 CSS2.1 没有保留该属性。
text-transform
控制元素中的字母。
unicode-bidi
设置文本方向。
white-space
设置元素中空白的处理方式。
word-spacing
设置字间距。
css背景属性
background
简写属性,作用是将背景属性设置在一个声明中。
background-attachment
背景图像是否固定或者随着页面的其余部分滚动。
background-color
设置元素的背景颜色。
background-image
把图像设置为背景。
background-position
设置背景图像的起始位置。
background-repeat
设置背景图像是否及如何重复。
简写属性,作用是将背景属性设置在一个声明中。
background-attachment
背景图像是否固定或者随着页面的其余部分滚动。
background-color
设置元素的背景颜色。
background-image
把图像设置为背景。
background-position
设置背景图像的起始位置。
background-repeat
设置背景图像是否及如何重复。
css尺寸属性
height
设置元素的高度。
line-height
设置行高。
max-height
设置元素的最大高度。
max-width
设置元素的最大宽度。
min-height
设置元素的最小高度。
min-width
设置元素的最小宽度。
width
设置元素的宽度。
设置元素的高度。
line-height
设置行高。
max-height
设置元素的最大高度。
max-width
设置元素的最大宽度。
min-height
设置元素的最小高度。
min-width
设置元素的最小宽度。
width
设置元素的宽度。
列表属性
list-style-image:设置标志项的图片
list-style-position:设置标志项的位置(inside/outside)
list-style-type:设置标志项的样式
list-style-position:设置标志项的位置(inside/outside)
list-style-type:设置标志项的样式
css边框属性
border
简写属性,用于把针对四个边的属性设置在一个声明。
border-style
用于设置元素所有边框的样式,或者单独地为各边设置边框样式。
border-width
简写属性,用于为元素的所有边框设置宽度,或者单独地为各边边框设置宽度。
border-color
简写属性,设置元素的所有边框中可见部分的颜色,或为 4 个边分别设置颜色。
border-bottom
简写属性,用于把下边框的所有属性设置到一个声明中。
border-bottom-color
设置元素的下边框的颜色。
border-bottom-style
设置元素的下边框的样式。
border-bottom-width
设置元素的下边框的宽度。
border-left
简写属性,用于把左边框的所有属性设置到一个声明中。
border-left-color
设置元素的左边框的颜色。
border-left-style
设置元素的左边框的样式。
border-left-width
设置元素的左边框的宽度。
border-right
简写属性,用于把右边框的所有属性设置到一个声明中。
border-right-color
设置元素的右边框的颜色。
border-right-style
设置元素的右边框的样式。
border-right-width
设置元素的右边框的宽度。
border-top
简写属性,用于把上边框的所有属性设置到一个声明中。
border-top-color
设置元素的上边框的颜色。
border-top-style
设置元素的上边框的样式。
border-top-width
设置元素的上边框的宽度。
简写属性,用于把针对四个边的属性设置在一个声明。
border-style
用于设置元素所有边框的样式,或者单独地为各边设置边框样式。
border-width
简写属性,用于为元素的所有边框设置宽度,或者单独地为各边边框设置宽度。
border-color
简写属性,设置元素的所有边框中可见部分的颜色,或为 4 个边分别设置颜色。
border-bottom
简写属性,用于把下边框的所有属性设置到一个声明中。
border-bottom-color
设置元素的下边框的颜色。
border-bottom-style
设置元素的下边框的样式。
border-bottom-width
设置元素的下边框的宽度。
border-left
简写属性,用于把左边框的所有属性设置到一个声明中。
border-left-color
设置元素的左边框的颜色。
border-left-style
设置元素的左边框的样式。
border-left-width
设置元素的左边框的宽度。
border-right
简写属性,用于把右边框的所有属性设置到一个声明中。
border-right-color
设置元素的右边框的颜色。
border-right-style
设置元素的右边框的样式。
border-right-width
设置元素的右边框的宽度。
border-top
简写属性,用于把上边框的所有属性设置到一个声明中。
border-top-color
设置元素的上边框的颜色。
border-top-style
设置元素的上边框的样式。
border-top-width
设置元素的上边框的宽度。
内边距
padding
简写属性。作用是在一个声明中设置元素的所内边距属性。
padding-bottom
设置元素的下内边距。
padding-left
设置元素的左内边距。
padding-right
设置元素的右内边距。
padding-top
设置元素的上内边距。
简写属性。作用是在一个声明中设置元素的所内边距属性。
padding-bottom
设置元素的下内边距。
padding-left
设置元素的左内边距。
padding-right
设置元素的右内边距。
padding-top
设置元素的上内边距。
外边距
margin
简写属性。在一个声明中设置所有外边距属性。
margin-bottom
设置元素的下外边距。
margin-left
设置元素的左外边距。
margin-right
设置元素的右外边距。
margin-top
设置元素的上外边距。
简写属性。在一个声明中设置所有外边距属性。
margin-bottom
设置元素的下外边距。
margin-left
设置元素的左外边距。
margin-right
设置元素的右外边距。
margin-top
设置元素的上外边距。
css框模型(盒子)
- element : 元素。
- padding : 内边距,边框距元素的距离。
- border : 边框。
- margin : 外边距,边框距其他元素边框的距离。
- padding : 内边距,边框距元素的距离。
- border : 边框。
- margin : 外边距,边框距其他元素边框的距离。
CSS定位概念及固定定位 (fixed)
CSS 定位 (Positioning) 属性允许你对元素进行定位 。
- 固定一个位置
- 固定一个位置
CSS定位概念及相对定位 (relative)
- 设置为相对定位的元素框会偏移某个距离。元素仍然保持其未定位前的形状,它原本所占的空间仍保留。
- 移动的位置是相对于原来的位置进行偏移!!!
- 移动的位置是相对于原来的位置进行偏移!!!
CSS定位概念及绝对定位(absolute)
元素原先在正常文档流中所占的空间会关闭
并相对于其包含块定位(如果元素发生移动,原本所占的空间会关闭,后面如果有的化将给其他元素使用)
可以理解为不给自己留后路
并相对于其包含块定位(如果元素发生移动,原本所占的空间会关闭,后面如果有的化将给其他元素使用)
可以理解为不给自己留后路
块级元素和行内元素
块级元素
- 块级元素前后会带有换行符,占用一整行.
- 常见的块级元素:div
- 常见的块级元素:div
行内元素
- 行内元素前后没有换行符,只包裹内容.
- 常见的行内元素:span
- margin-top、margin-bottom、padding-top、padding-bottom设置无效
- 常见的行内元素:span
- margin-top、margin-bottom、padding-top、padding-bottom设置无效
伸缩布局
CSS3在布局方面做了非常大的改进,使得我们对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开发中可以发挥极大的作用。
垂直居中:justify-content:center
水平居中:align-items:center
水平居中:align-items:center
- iex container:伸缩布局
- 主轴(main axis):flex容器的主轴主要用来分配flex子元素,默认是水平方向
- 侧轴(cross axis):与主轴垂直的轴称为侧轴,默认是垂直方向
- flex item:伸缩元素
- 主轴和侧轴并不是固定不变的,可以通过flex-direction进行切换,默认为水平方向(row)。 column(垂直)
- 主轴(main axis):flex容器的主轴主要用来分配flex子元素,默认是水平方向
- 侧轴(cross axis):与主轴垂直的轴称为侧轴,默认是垂直方向
- flex item:伸缩元素
- 主轴和侧轴并不是固定不变的,可以通过flex-direction进行切换,默认为水平方向(row)。 column(垂直)
Tomcat
BS和CS
BS(broweser server)浏览器服务器
不需要安装客户端,只要能连上网,就能随时随地使用
开发人员只需要对服务器端程序进行开发、维护,降低开发维护难度和开发维护成本
浏览器主要负责用户界面的动态展示,只处理一些简单的逻辑功能
所有具体业务逻辑的处理都由服务器端程序完成,所以程序负载几乎都转移给服务器端。
但是随着服务器负载的增加,可以平滑地增加服务器的个数并建立集群服务器系统,然后在各个服务器之间做负载均衡。
优缺点
优点:实时地更新数据(新功能的增加只需要在服务端完成, 浏览器刷新就好了
缺点:将负载给了服务器
CS(client server)客户端服务器
将应用程序分为客户端和服务器端两层,客户端程序用于展示功能,为用户提供操作界面,同时也可以进行业务逻辑的处理;而服务器端程序负责操作数据库完成数据处理等 核心业务
由此可见通过C/S开发模型开发的应用程序,客户端程序可以承担一部分业务逻辑处理,特别是数据的预处理工作,减轻了服务器端程序的压力
优缺点
优点:客户端也分担了一部分负载,
缺点:如果有新的功能要增加必须要重新下载客户端
Web服务器
对于服务器有两种概念 第一种就是一台电脑 第二种指的是在电脑上安装了一个服务器软件,这时我们也管这台电脑叫做服务器。我们学习的是第二种。
常见的javaweb服务器:
weblogic:它是oracle公司的,已经被oracle收购,它是全面支持javaee规范,收费的大型的web 服务器,它是企业中主流的服务器,在网络上学习资料比较多。
websphere :它是ibm公司的一个大型的收费的全面支持javaee规范的javaee容器。
tomcat :它是开源的免费的servlet规范的服务器。 它是apache一个web服务器。
jboss:hibernate公司产品,不是开源免费的,是javaee规范的容器。
ngix:Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理服务器
Web的相关概念:
Web指的就是网页,我们所说的web指的是internet主机(服务器)上的供外界访问的资源
web资源可以分为两种:静态web资源、动态web资源
静态web资源
指web页面上供人们浏览的数据,它们始终不变。例如html
优点:
静态网站开发简易,只需要掌握HTML、CSS和JS就可以开发
静态访问速度快,因为静态网页不需要和任何程序进行交互,更不需要对数据进行处理
缺点:
静态网站内容无法实时更新,因为网站由一个个的静态HTML网页构成,新增内容只能 通过开发人员修改代码
网站内容过多时,每个页面都需要单独制作,需要不断编写和维护HTML页面,增加了 网站开发人员的工作量,提高了运营费用。
动态web资源 (常用)
指web页面中内容是由程序产生的,供人们浏览,并且在不同的时间点,数据不一样,并且 还可以实现人与人之间的交互。用到Servlet和JS等技术.
优点
优点:维护方便、可以根据用户需求实现各种功能 查询信息方便,能存储大量数据,需要时能立即查询 网站内容可以实时动态更新 与用户交互性强,提高用户粘性
缺点:技术要求高
总结:静态的web资源,只是供人们浏览,而动态的web资源,可以实现交互。
Tomcat的安装与配置
tomcat的配置
JAVA_HOME配置
在tomcat的安装目录bin文件夹下的catalina.bat中使用了JAVA_HOME,所以,安装tomcat必须要求系统配置中有JAVA_HOME,如果没有配置,执行startup.bat文件时会出现闪退效果
端口配置
tomcat默认使用的8080端口,可以进行端口号的修改,修改tomcat的端口号,在tomcat/conf/server.xml文件。
可以添加80端口,80是http协议默认的端口。
路径:tomcat安装目录 -> conf文件夹 -> server.xml中
Web项目
静态项目
包含都是静态资源:html、js、css、图片、音频等等
动态项目
Web动态项目: 不是必须包含动态资源
包含都是静态资源:html、js、css、图片、音频等等
那么和静态项目的区别在哪里?可以有动态资源及WEB-INF文件夹
通过http://localhost:8080/ 访问的资源是来自于tomcat服务器的动态web项目(内置),
而在tomcat的一个安装目录中,是由一个webapps的文件夹专门用来部署web项目
1. 一个静态web项目,肯定都是静态资源
2. 一个动态web项目,可以有静态资源,可以有动态资源, 必须有WEB-INF文件夹及web.xml
2. 一个动态web项目,可以有静态资源,可以有动态资源, 必须有WEB-INF文件夹及web.xml
tomcat部署项目(三种)
直接将项目放到webapps下
虚拟目录初级版
将tomcat目录以外的资源部署到容器中
在tomcat的目录 -> conf文件夹 -> server.xml中 , 加一个<Contex>
在tomcat的目录 -> conf文件夹 -> server.xml中 , 加一个<Contex>
虚拟目录优化版
基于虚拟目录初级版!!
1_tomcat安装目录 -> conf文件夹 -> catalina -> localhost
2_新建一个任意名称的xml文件
3_需要到xml文件中编写如下代码:
1_tomcat安装目录 -> conf文件夹 -> catalina -> localhost
2_新建一个任意名称的xml文件
3_需要到xml文件中编写如下代码:
<?xml version="1.0" encoding="utf-8" ?>
<Context docBase="C:\Users\qiuzhiwei\Desktop\dynamicproject"/>
<Context docBase="C:\Users\qiuzhiwei\Desktop\dynamicproject"/>
如何访问部署成功之后的项目中的资源
1.访问到tomcat容器:
http://localhost:8080/
2.访问到项目:
http://localhost:8080/dynamicproject/
3.访问到资源:
http://localhost:8080/dynamicproject/a.jpg
4.注意事项:
如果访问路径只写到http://localhost:8080/dynamicproject/,默认访问index开头的html文件或jsp文件...
http://localhost:8080/
2.访问到项目:
http://localhost:8080/dynamicproject/
3.访问到资源:
http://localhost:8080/dynamicproject/a.jpg
4.注意事项:
如果访问路径只写到http://localhost:8080/dynamicproject/,默认访问index开头的html文件或jsp文件...
web动态项目的相关设置
为什么默认会访问index.html / index.jsp
tomcat安装目录 -> conf文件夹 -> web.xml
如何修改默认访问
直接修改tomcat中的web.xml,
会导致所有的项目欢迎的页面都会改变
修改项目自带的web.xml
项目中的wb.xml和tomcat中的web.xml,有什么关系?
类似于java中的继承关系(父子关系),
如果tomcat中的web.xml的配置无法满足当前的项目的需求,那么就可以更改项目中的web.xml,覆盖tomcat中的web.xml配置
如果tomcat中的web.xml的配置无法满足当前的项目的需求,那么就可以更改项目中的web.xml,覆盖tomcat中的web.xml配置
IDEA部署web应用程序
idea部署Web项目的方式
idea部署web项目的方式,本质就是虚拟目录优化版,但是有一些区别!
- 根据本地安装的tomcat,会给当前项目生成一个tomcat镜像,部署到tomcat镜像相当于部署到本地tomcat中
- tomcat镜像部署项目的方式是虚拟目录优化版, 镜像的安装目录 -> conf -> catalina -> localhost ,就找到了day50.xml配置文件
- tomcat镜像部署项目的方式是虚拟目录优化版, 镜像的安装目录 -> conf -> catalina -> localhost ,就找到了day50.xml配置文件
idea中的web项目的哪些内容部署到tomcat中
- src中的文件:
- 可以部署上去!部署到了项目中的\WEB-INF\classes文件夹中
- web中的文件:
- 可以部署上去!部署到了项目目录中!
- day50项目下的文件:
- 不可以部署上去
- 可以部署上去!部署到了项目中的\WEB-INF\classes文件夹中
- web中的文件:
- 可以部署上去!部署到了项目目录中!
- day50项目下的文件:
- 不可以部署上去
Http协议
概念
协议就是规定双方如何通信。
超文本传输协议 HyperText transfer protocol 是互联网上应用最为广泛的一种网络协议,
所有的www都必须遵守这个标准
所有的www都必须遵守这个标准
- 在做javaweb开发时,浏览器与服务器要通信,它们之间遵守就是http协议
- http协议是建立在TCP协议基础上。http协议也是基于请求与响应的模型,http协议默认的
端口是80
- http协议是建立在TCP协议基础上。http协议也是基于请求与响应的模型,http协议默认的
端口是80
演示使用抓包来查看http协议信息
创建一个web工程,在工程中创建一个hello.html页面。
将工程部署到tomcat中,打开浏览器查看hello.html页面
启用抓包功能
通过抓包可以看到如下信息
- General:请求行,响应行
- Request?Headers:请求头
- Response?Headers:响应头
- 响应正文:将显示内容携带到浏览器
- 请求正文:用来接收请求的参数.
- Request?Headers:请求头
- Response?Headers:响应头
- 响应正文:将显示内容携带到浏览器
- 请求正文:用来接收请求的参数.
请求执行流程
- 发起请求
- 域名解析
- 本地域名解析器(C:\Windows\System32\drivers\etc\host),
- 如果本地解析器无法解析,那么就交给互联网上的DNS解析器
- 得到IP(三次握手,http协议底层是tcp协议)
- 根据ip和端口,可以得到一个Socket对象,执行请求
- 携带请求行、请求头、请求正文
- 服务器响应浏览器
- 携带响应行、响应头、响应正文
- 域名解析
- 本地域名解析器(C:\Windows\System32\drivers\etc\host),
- 如果本地解析器无法解析,那么就交给互联网上的DNS解析器
- 得到IP(三次握手,http协议底层是tcp协议)
- 根据ip和端口,可以得到一个Socket对象,执行请求
- 携带请求行、请求头、请求正文
- 服务器响应浏览器
- 携带响应行、响应头、响应正文
http请求
请求行
- Request URL : 请求路径,告诉服务器要请求的资源路径
- Request Method : 请求方式 , GET/POST
- protocol : http协议版本
- Request Method : 请求方式 , GET/POST
- protocol : http协议版本
请求头
- Content-Type:浏览器告诉服务器,请求正文的数据类型
- User-Agent:浏览器告诉服务器,我是个什么样的浏览器
- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
- User-Agent:浏览器告诉服务器,我是个什么样的浏览器
- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
请求正文 (Form Data)
请求正文,只有当请求方式为post,且有请求参数时才会有请求正文!!!
GET请求和POST请求:
get请求只能携带小数据、get请求下的请求参数会直接拼接到Request URL(请求网址)后面,QueryStringParameters里也有
post请求可以携带大数据、post请求下的请求参数会存放到请求正文
http响应
响应行
Status Code : 响应状态码
- 200:服务器响应成功
- 302: 告诉浏览器,进行重定向
- 304: 页面上的内容没有发生改变,不需要重新请求服务器
- 404: 没有对应的服务器资源
- 500:服务器内部错误!
- 200:服务器响应成功
- 302: 告诉浏览器,进行重定向
- 304: 页面上的内容没有发生改变,不需要重新请求服务器
- 404: 没有对应的服务器资源
- 500:服务器内部错误!
C_响应头
- Location:告诉浏览器重定向的资源路径,需要结合响应状态码302使用
- Content-Type:服务器告诉浏览器,响应正文的数据类型
- Content-Type:text/html;charset=utf-8:服务器告诉浏览器,响应正文是文本和html标签;告诉浏览器,应该以utf-8的形式进行解码!浏览器就会以html标签及utf-8的形式对响应正文进行渲染显示!!!
- refresh:
- 定时跳转
- Content-Disposition:
- 文件下载
- Content-Type:服务器告诉浏览器,响应正文的数据类型
- Content-Type:text/html;charset=utf-8:服务器告诉浏览器,响应正文是文本和html标签;告诉浏览器,应该以utf-8的形式进行解码!浏览器就会以html标签及utf-8的形式对响应正文进行渲染显示!!!
- refresh:
- 定时跳转
- Content-Disposition:
- 文件下载
响应正文
- 浏览器显示的内容
- 浏览器显示的内容
Servlet的概述及入门
Servlet入门案例
1. 自定义Servlet继承HttpServlet
2. 重写doGet方法和doPost方法
3. 在web.xml配置servlet
- 声明自定义Servlet
- 给自定义Servlet配置访问名称
概念:servlet就是一个java程序,可以和浏览器进行交互,servlet的使用需要有服务器编译环境的支持!!
服务器编译环境确认和设置
Extenal Libaries中必须要有服务器的jar包
Extenal Libaries中必须要有服务器的jar包
Servlet入门案例
1. 自定义Servlet继承HttpServlet
2. 重写doGet方法和doPost方法
3. 在web.xml配置servlet
- 声明自定义Servlet
- 给自定义Servlet配置访问名称
D_Servlet的执行流程
- 浏览器发起请求: http://localhost:8080/day50/demo01
- 就会在服务器中找访问名称为demo01的Servlet -> Demo01Servlet
- 请求的处理就交给了Demo01Servlet的实例,根据请求方式get/post,决定是给doGet还是doPost方法处理!!!
- 浏览器发起请求: http://localhost:8080/day50/demo01
- 就会在服务器中找访问名称为demo01的Servlet -> Demo01Servlet
- 请求的处理就交给了Demo01Servlet的实例,根据请求方式get/post,决定是给doGet还是doPost方法处理!!!
Servlet概念
HttpServlet继承于GenericServlet、GenericServlet实现于Servlet,也就是说Servlet是顶层接口!!!
如果要实现Servlet功能,有几种方式?
- 方式一:实现Servlet接口
- 在servlet接口中,没有doGet和doPost方法,处理请求是service方法(抽象的)
- 方式二:继承GenericServlet类
- 在GenericServlet类中,没有doGet和doPost方法,处理请求是service方法(抽象的)
- 方式三:继承HttpServlet类
- 在servlet接口中,没有doGet和doPost方法,处理请求是service方法(抽象的)
- 方式二:继承GenericServlet类
- 在GenericServlet类中,没有doGet和doPost方法,处理请求是service方法(抽象的)
- 方式三:继承HttpServlet类
猜想,HttpServlet类中重写service方法。
- 根据源码,发现重写service方法中,
有将ServletRequest强转为HttpServletRequest,
将ServletResponse强转为HttpServletResponse
以上强转是因为,ServletRequest和ServletResponse并没有针对Http协议做优化!!!无法专门针对http协议调用方法!!
HttpServletRequest和HttpServletResponse有针对http协议做优化
- 根据源码,发现重写service方法中,
有将ServletRequest强转为HttpServletRequest,
将ServletResponse强转为HttpServletResponse
以上强转是因为,ServletRequest和ServletResponse并没有针对Http协议做优化!!!无法专门针对http协议调用方法!!
HttpServletRequest和HttpServletResponse有针对http协议做优化
Servlet
Servlet的概述及入门
servlet就是一个java程序,可以和浏览器进行交互,servlet的使用需要有服务器编译环境的支持!!
服务器编译环境确认和设置
Extenal Libaries中必须要有服务器的jar包
Extenal Libaries中必须要有服务器的jar包
Servlet入门案例
自定义Servlet继承HttpServlet
重写doGet方法和doPost方法
在web.xml配置servlet
声明自定义Servlet
给自定义Servlet配置访问名称
Servlet的执行流程
浏览器发起请求: http://localhost:8080/day50/demo01
就会在服务器中找访问名称为demo01的Servlet -> Demo01Servlet
请求的处理就交给了Demo01Servlet的实例,根据请求方式get/post,决定是给doGet还是doPost方法处理!!!
Servlet概念
HttpServlet继承于GenericServlet、GenericServlet实现于Servlet,也就是说Servlet是顶层接口!!!
如果要实现Servlet功能,有几种方式?
方式一:实现Servlet接口
在servlet接口中,没有doGet和doPost方法,处理请求是service方法(抽象的)
继承GenericServlet类
在GenericServlet类中,没有doGet和doPost方法,处理请求是service方法(抽象的)
继承HttpServlet类
Servlet三种方式实现
继承HttpServlet
在HttpServlet中,重写GenricServlet类中的service方法,会由GenericServlet给service方法提供请求对象(ServletRequest)、响应对象(ServletResponse),不针对Http协议!!所以需要强转成HttpServletRequest、HttpServletResponse。
紧接着,调用另外一个service方法,传入HttpServletRequest、HttpServletResponse
获取到请求方式,如果是get请求,就调用doGet方法,如果是post请求,就调用doPost方法!!
继承GenericServlet类
实现Servlet接口
Servlet的生命周期
init(ServletConfig var1):
监听Servlet的初始化
service(ServletRequest var1, ServletResponse var2):
处理请求
destroy():
监听Servlet的销毁
Servlet的生命周期特点
servlet什么时候初始化?
Servlet默认不是随着服务器的启动而初始化,当第一次访问Servlet时才初始化,后面访问就执行处理请求
会发现Servlet是一个单例!!
优点:节省内存
servlet什么时候销毁?
服务器关闭的时候会销毁Servlet
load on startup配置
根据Servlet生命周期,可知,servlet默认不会随着服务器的启动而初始化!
如果,就想让指定的Servlet跟随服务器启动而初始化,我们如何做?需要用到load on startup
load on startup可以让servlet随着服务器的启动而初始化
load on startup
有10个优先级:1~10;数字越小,优先级越高!
比如:Demo01Servlet,load-on-startup:1 ;Demo02Servlet , load-on-startup :2;
当服务器启动时,Demo01Servlet先初始化,然后,Demo02Servlet再初始化
Servlet配置
自定义Servlet,第一步,声明该Servlet;第二步,给该Servlet配置访问路径
一个Servlet是否可以有多个访问名称?
可以有多个访问名称,只需要给对应的Servlet多个映射<servlet-mapping>标签即可!
书写规则
完全匹配:
要求网址上的访问名称完全和<url-parttern>一致
必须以"/"开头,否则会报错:IllegalArgumentException : Invalid <url-pattern>
目录匹配:
要求网址上的访问名称中的目录和<url-parttern>一致
必须以"/"开头,以"*"结尾
比如:/a/b/* , 目录必须是/a/b,后面随便写
后缀名匹配:
要求网址上的访问名称中的后缀和<url-parttern>一致
不能以"/"开头,以"*"开头,后缀名根据业务写
比如:*.xyz。后缀名必须是xyz,其他随意写!!!
缺省Servlet
概念:url-parttern的值为"/"就是缺省Servlet
作用:
tomcat容器自带缺省Servlet
处理匹配不到的资源,返回404页面
处理静态资源,io流读写
自定义缺省Servlet
在当前工程中自定义Servlet,将url-parttern设置为"/",就覆盖了tomcat容器中的缺省Servlet
应用:SpringMVC框架中,用于放行静态资源!
服务器中路径问题
路径分类
带协议的绝对路径:http://localhost:8080/day51/img/girl.jpg
不带协议的绝对路径:/day51/img/girl.jpg
相对路径:
当前目录:./ ,可以省略
上一级目录:../
总结:开发中,用的比较多:不带协议的绝对路径、相对路径
ServletConfig对象
ServletConfig是由tomcat容器创建,通过init方法传入给Servlet
作用
获取Servlet的名称<servlet-name>标签内容
获取Servlet的初始化参数
初始化参数会随着Servlet的初始化而初始化
getInitParameter(String parameterName):根据参数名称获取指定的参数值
getInitParameterNames():获取所有的参数名称
通过initParameterNames.hasMoreElements()检测是否有参数
通过initParameterNames.nextElement()获得参数
获取域对象:ServletContext
ServletContext对象
相当于是整个应用程序对象
作用
ServletContext是一个域对象,可以用来存储数据
在应用程序中的任何位置都能够访问
getAttribute(String parameterName) : 获取ServletContext域中指定名称的参数值
setAttribute(String paramterName,Object parameterValue):存储参数到ServletContext域中
removeAttribute(String parameterNam):将ServletContext域中指定名称的参数移除!
获取全局初始化参数
全局初始化参数会随着服务器的启动而初始化
获取服务器真实磁盘路径
getRealPath:依据当前项目去生成真实磁盘路径,
比如:servletContext.getRealPath("upload")
"当前项目的服务器磁盘路径/upload"
比如:servletContext.getRealPath("upload/img"):
"当前项目的服务器磁盘路径/upload/img"
"当前项目的服务器磁盘路径/upload/img"
站点访问次数案例
使用ServletContext域对象
Servlet3.0
概念
Servlet2.5,不支持注解开发。
Servlet3.0,支持注解开发。
常用注解
@Test:单元测试
@Override:方法重写
WebServlet:
声明配置Servlet,取代了web.xml配置
常用属性
- name:String
- 设置Servlet名称
- urlPatterns:String[]
- 设置Servlet的访问路径(可以设置多个)
- loadOnStartup:int
- 设置Servlet的load-on-startup属性(越小优先级越高)
- initParams: WebInitParam[]
- initParams = {@WebInitParam(name = "username" ,value = "root"),
@WebInitParam( name = "password" ,value = "root123")}
- 设置Servlet的初始化参数
- name:String
- 设置Servlet名称
- urlPatterns:String[]
- 设置Servlet的访问路径(可以设置多个)
- loadOnStartup:int
- 设置Servlet的load-on-startup属性(越小优先级越高)
- initParams: WebInitParam[]
- initParams = {@WebInitParam(name = "username" ,value = "root"),
@WebInitParam( name = "password" ,value = "root123")}
- 设置Servlet的初始化参数
以上配置代码,相当于web.xml配置如下
反射
类加载
概述:在class文件加载到jvm中时,会创建一个Class对象,份额为三个步骤
加载
将class文件加载到内存区域,对应生成一个Class文件
连接
验证: 验证类的结构是否正确
准备 :初始化静态成员
解析 :将字节转换成jvm能够执行的引用(对象、变量、方法)
初始化 就是对变量的初始化
加载时机
创建类对象的实例
访问类的静态变量,或者为静态变量赋值
调用类的静态方法
使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
Class.forName("com.mysql.jdbc.Driver");创建了Driver类的运行时对象
初始化某个类的子类 (在初始化子类的过程中会super()父类中的有参构造或无参构造)
直接使用java.exe命令来运行某个主类
类加载器
将class文件加载进内存,并生成对应的Class对象
类加载器的分类
Bootstrap ClassLoader 根类加载器
- 也被称为引导类加载器,负责Java核心类的加载
- 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中
- 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中
Extension ClassLoader 扩展类加载器
加载java中的扩展类,主要加载F:\Program Files\Java\jdk1.8.0_202\jre\lib\ext所有jar包中的类
Sysetm ClassLoader 系统类加载器
- 加载开发人员编写的自定义类、以及一些第三方的jar包中类
- 负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar 包和类路径
- 负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar 包和类路径
类反射机制
通过类的Class对象,动态去调用类中的属性和方法
获取Class对象的方式:
全限定名:包名+类名
Class.forName("全限定名")
编译期(在编译为.class的阶段)
类名.class
运行时
对象名.getClass()
反射结合工厂模式
使用继承
- 解决Apple类、Banana类的代码复用性
- Banana、Apple继承Fruit类
- Banana、Apple继承Fruit类
使用工厂模式
解决Banana、Apple和其他模块耦合较高
使用反射机制
解决工厂的getFruit方法中if...else代码过多
反射操作构造器
使用反射机制操作public、protected、默认、private的构造器
使用构造器创建无参对象
使用构造器创建有参对象
访问非public修饰的构造器
注意:要用getDeclaredConstructor获得全部构造方法
反射操作成员变量
概念:使用反射机制操作public、protected、默认、private的成员变量
public修饰的成员变量(属性):
必须是public ,protected、default、private 不行
通过Field获取赋的值: field.get(对象)
非public修饰的成员变量(属性):
通过getDeclaredField()获取全部属性
反射操作成员方法
使用反射机制操作public、protected、默认、private的成员方法
操作public修饰的成员方法
获取的方法要在参数中输入方法名 和参数类型,invoke()中要输入对象和参数
操作非public修饰的成员方法
反射越过泛型检查
概念
- java中的泛型的作用范围在编译期,也就是说在运行时,是没有泛型的!
- 反射技术,可以在程序运行时,动态地调用List类中add方法,往集合中添加任意类型的元素。
- 反射技术,可以在程序运行时,动态地调用List类中add方法,往集合中添加任意类型的元素。
反射通用方法案例
给指定对象的指定属性赋值
步骤
- //获取方法名,通过属性名 :set+属性名第一个字母变大写+后面的属性名
- //获得类对象
- //获得属性
- //获得属性的类型
- //获得方法
- //执行方法
- //获得类对象
- //获得属性
- //获得属性的类型
- //获得方法
- //执行方法
反射结合配置文件
编写demo.properties,配置对象的唯一标识及对象的全类名,根据这段配置创建一个对象
静态代理设计模式
增强被代理类的功能
步骤
- 自定义类实现和被代理类相同的接口(保持方法一致)
- 在代理类中声明(创建)被代理类的对象(用来调用被代理类对象的方法)
- 在代理类的方法中使用被代理类调用方法(相当于多了一个中间过程)
- 在代理类中声明(创建)被代理类的对象(用来调用被代理类对象的方法)
- 在代理类的方法中使用被代理类调用方法(相当于多了一个中间过程)
特点
- 缺点:必须要重写被代理类接口的所有的方法(包括不需要增强的方法,增高了耦合性)
- 作用:增强被代理类的功能
- 特点:可以控制被代理类对象
- 作用:增强被代理类的功能
- 特点:可以控制被代理类对象
装饰设计模式
步骤
实现被代理类的接口
通过构造方法传入被代理类
执行被代理类中的方法
特点
不能控制被装饰类对象
缺点
需要重写接口中的所有方法,破坏了单一职责原则
动态代理
概念:基于接口的方法增强
Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(),
new MyInvocationHandler(userDao));
userDao.getClass().getInterfaces(),
new MyInvocationHandler(userDao));
- ClassLoader loader: 被代理类对应的类加载器
- Class<?>[] interfaces:被代理类所实现的所有接口
- InvocationHandler h:一个用以增强代理类的处理器
- Class<?>[] interfaces:被代理类所实现的所有接口
- InvocationHandler h:一个用以增强代理类的处理器
连接池
在不使用连接池的情况下, 如果有100个用户要操作数据库,对应要创建100个连接对象,操作数据库完毕,还需要销毁100个连接对象,创建连接和销毁连接是非常浪费系统性能!
如果使用连接池,连接的创建,只在连接池初始化时才进行,当用户要操作数据库时,只需要从连接池中取出已经创建好的连接对象即可,操作数据库完毕,不需要销毁连接,只需将连接对象归还到连接池
连接池提高了操作数据库的性能!
注释
注释介绍
概念:注释就是一个修饰符
特点
jdk5.0之后引入的特性,以”@注释名“形式存在
作用
跟踪代码依赖性
执行编译时格式检查
代替已有的配置文件
内置注释
@Override
标记指定方法是一个重写方法,否则报错
@Deprecated
标记一个类,字段,方法是过时的
@SuppressWarings
注释所压制的警告的类型
注释分类
标记注释
没有属性
比如@Override Deprecated
单值注释
只有一个属性
比如SuppressWarings
完整注释
注释中有多个属性
自定义注释
@interface 注释名
数据类型 属性名() default 默认值
如果属性单独为value时,可以省略前面的”value=“
元注释概述
@Target
规定自定义注解的作用区域:
TYPE:类、接口、注解、枚举
FIELD 成员变量
METHOD 成员方法
PARMETER 形参
CONSTRUCTOR构造器
LOCAL VARIABLE 局部变量
ANNOTATION 注释类型
PACKAGE 包
@Retention
规定自定义注解的存活策略
SOURCE : 仅存活在源码
CLASS : 存活在编译期
RUNTIME : 存活在运行时
自定义注释(@MyTest)
测试类中,方法上如果使用了@MyTest注解,该方法就会执行!
步骤
定义一个注释@MyTest
在Demo类中加上注释@MyTes
让注释类@MyTest生效
获取Demo类的Class对象
获取Class类中的所有方法
循环判断方法是否有@MyTest注解
自定义注解JDBCInfo
使用注解@JDBCInfo替代jdbc.properties配置文件
步骤
注释@JDBCInfo
在JDBCUtils工具类上使用@JDBCInfo
获取要注释类的Class对象 Class<JDBCUtils> clazz = JDBCUtils.class;
判断对象是否有该注释
获取时间字符串
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
parse(str)将字符串转化为Date类型的对象
format(Date date)将时间对象转化为字符串
反射、注解、设计模式初级版(装饰代理模式)
定义一个注解Syslog
className
methodName
定义接口UserDao,方法定义注解@Syslog
装饰者模式
实现接口
new接口子类
重写方法
建添加日志方法
获取子类Class对象
获取父类接口对象
获取方法
判断是否注释
是,拼接字符
否,不操作
反射、注解、设计模式加强版(动态代理)
自定义注解@SystemLog
className
methodName
定义一个UserDao接口,且在该接口使用注解@SystemLog
动态代理
获取UserDao接口中的方法对象
ServletPuls
Request和Response对象介绍
当浏览器发起请求后,服务器会建立一个请求对象一个响应对象,通过service()方法转入给Servlet
作用
request对象处理请求信息(请求行、请求头、请求正文)
response对象处理响应信息(响应行、响应头、响应正文)
ServletRequest和HttpServletRequest的关系、ServletResponse和HttpServletResponse的关系?
ServletRequest是HttpServletRequest的父接口,
ServletResponse是HttpServletResponse的父接口,
HttpServletRequest针对Http协议、HttpServletResponse针对Http协议
response操作响应行、响应头
操作响应行(响应状态码)
setStatus:操作正常响应状态码
sendError:操作错误响应状态码
操作响应头
setHeader:直接覆盖响应头原有的值
setHeader("content-Length","100")给响应头赋值
setHeader("content-Type","text/http;charset=utf-8")
addHeader:在响应头原有值后面追加
response操作重定向(响应状态码302)
重定向的流程
浏览器先去访问一个资源 demo03Servlet
demo03Servlet让浏览器去访问demo04Servlet
状态码302
响应头location,访问资源的访问路径
方法一
response.setStatus(302);//访问状态码
response.setHeader("Location","demo04");//访问头
response.setHeader("Location","demo04");//访问头
方法二
response.sendRedirect("demo04");
response操作定时跳转
概念
一个资源定时一段时间之后,跳转到另外一个资源
操作响应头refresh
resp.setHeader("refresh","5;url=demo07");
response操作响应正文
相应正文:浏览器显示的主题内容
常用方法:response.getWriter.write
响应中文乱码
服务器的编码和浏览器的解码格式不同
第一种
response.setCharacterEncoding=utf-8
response.setHeader("text/html;charset=utf-8")
第二种
response.setContentType("text/html;charset=utf-8")
request操作请求行
常用方法
getRequestURI
获得请求路径
getMethod
获得请求方法
getRemoteAddr
获得请求ip
getLocalPort
获得请求端口号
getQueryString
获得网址后面的参数
request操作请求头
getHeader("请求头")
User-Agent请求头:判定请求时由哪种浏览器发起
request操作请求参数(重点)
请求正文
post
请求参数
get、post'都有
常用方法
getParameter(str)
获取指定参数的值
getParameterName()
获取所有参数的名字
getParameterValue(str)
获取指定参数的所有值
getParameterMap()
获取一个map集合key时name,value是值
请求参数中文乱码
post请求参数中文乱码
方法一
request.setCharacterEncoding=utf8
方法二
逆向,先编码在解码
- 先将乱码字符串以iso8859-1格式编码为字节
- 再将字节以utf-8解码成字符串
- 再将字节以utf-8解码成字符串
注意:将tomcat容器的URIEncoding="utf-8",对Query String中的请求参数有效,对请求正文中无效,对post请求下的中文乱码无效!
get请求参数中文乱码
方法一
逆向,先编码在解码
- 先将乱码字符串以iso8859-1格式编码为字节
- 再将字节以utf-8解码成字符串
- 再将字节以utf-8解码成字符串
方法二
修改tomcat容器的URIEncoding="utf-8"
注意:request.setCharacterEncoding("utf-8")对get请求无效,告诉服务器应该以utf-8来解码请求正文,跟Query String 没有关系!
tomcat8.5解决
post
request.setCharacterEncoding=utf8
get
tomcat被修改为容器的URIEncoding="utf-8"
request操作请求转发
服务器中从一个资源跳到另一个资源
流程
- 浏览器发起请求,请求到Demo01Servlet
- Demo01Servlet请求转发到Demo02Servlet
- 从服务器内部Demo01Servlet直接跳转到了Demo02Servlet
- Demo01Servlet请求转发到Demo02Servlet
- 从服务器内部Demo01Servlet直接跳转到了Demo02Servlet
请求转发和重定向的区别
请求次数
重定向有两次
转发有一次
跳转区别
重定向既可以在站内资源进行跳转,也可以在站外资源进行跳转
转发只能在站内资源进行跳转
路径区别
相对路径无区别
绝对路径
重定向绝对路径是从项目名开始
转发绝对路径是从项目中开始
request作为域对象
可以存储数据的对象
ServletContext域作用范围
不同设备、当前项目中的任意一个资源都可以访问ServletContext域中的数据
request域对象的作用范围:
request对象的生命周期
- 发起请求时,request初始化
- 响应时,request销毁
- 响应时,request销毁
request域对象的作用范围在一次请求中(一次生命周期)
reques在重定向和转发中使用
- 重定向中不能使用request域对象(第一次请求的信息在响应时就没有了)
- 转发中可以使用request域对象(只有一次请求)
- 转发中可以使用request域对象(只有一次请求)
会话技术
概念:打开浏览器,访问服务器中资源,关闭浏览器;这个过程就是会话。
会话分类
Cookie
概念:网景公司发明,浏览器的会话技术
Cookie流程:
浏览器请求服务器,请求Demo01Servlet,创建一个Cookie对象,名称为cookie1
可以通过响应头Set-Cookie,携带cookie给浏览器进行保存
浏览器再次请求服务器,请求Demo02Servlet,获取cookie1对象
Cookie的基本使用
设置Cookie
方式一
response.addHeader("set-cookie","msg=hellocoolie");
方式二推荐
Cookie cookie = new Cookie("msg","hellocookie");
response.addCookie(cookie);
response.addCookie(cookie);
获取Cookie
开发步骤
- 通过request对象获取所有的Cookie对象,存储到一个数组中
- 遍历该数组,匹配Cookie名称
- 如果匹配上,就知道了指定的Cookie对象
- 如果匹配不上,就没有指定的Cookie对象
- 遍历该数组,匹配Cookie名称
- 如果匹配上,就知道了指定的Cookie对象
- 如果匹配不上,就没有指定的Cookie对象
Cookie的相关设置
持久化设置
cookie的生命周期
默认是随着浏览器的关闭而销毁
setMaxAge
设置cookie的存活时长,cookie就可以不随着会话的关闭而销毁!
路径设置
默认情况下,Cookie对象会随着任何一个请求携带到服务器
setPath
设置Cookie的访问路径
cookie对象只有访问路径包含"/day56/demo04",才会跟随请求携带到服务器
封装获取Cookie
通过传入request.getCookies得到的数组和想要查询的cookieName得到一个Cookie
Cookie案例(记录上一次访问时间)
需求
- 第一次访问,打印当前时间
- 不是第一次访问,打印上一次访问时间
- 不是第一次访问,打印上一次访问时间
步骤
- 获取对应的Cookie对象
- 判断是否是第一次访问
- 如果是第一次访问
- 打印当前时间
- 将当前时间存储到Cookie中
- 如果不是第一次访问
- 打印上一次访问时间
- 将当前时间存储到Cookie中
- 判断是否是第一次访问
- 如果是第一次访问
- 打印当前时间
- 将当前时间存储到Cookie中
- 如果不是第一次访问
- 打印上一次访问时间
- 将当前时间存储到Cookie中
Cookie案例(商品浏览记录)
需求
浏览商品,将商品浏览历史记录起来,并显示
步骤一
- 获取history的Cookie对象
- 判断商品浏览记录是否为空
- 如果为空
- 将商品记录存到Cookie中
- 如果不会空
- 有商品记录,不做处理
- 没有商品记录,将记录拼接再已有记录中
- 判断商品浏览记录是否为空
- 如果为空
- 将商品记录存到Cookie中
- 如果不会空
- 有商品记录,不做处理
- 没有商品记录,将记录拼接再已有记录中
步骤二
显示商品浏览记录
- 获取history对应的Cookie对象
- 获取对应的商品浏览记录
- 判断是否有浏览记录
- 如果没有,就显示“没有浏览记录”
- 如果有,就显示
- 处理浏览记录字符串
- 获取history对应的Cookie对象
- 获取对应的商品浏览记录
- 判断是否有浏览记录
- 如果没有,就显示“没有浏览记录”
- 如果有,就显示
- 处理浏览记录字符串
Session
分类
- Cookie之所以叫做浏览器会话,原因是Cookie的数据存储到浏览器!
- Session之所以叫做服务器会话,原因是Session的数据存储到服务器!
- Session之所以叫做服务器会话,原因是Session的数据存储到服务器!
执行流程
- 第一次请求Demo01Servlet时,根据request.getSession方法, 新建一个session对象;
- 当第一次响应时,会将该session对象的id作为cookie头响应给浏览器保存
set-cookie:JSESSIONID=4741C65CC84788A204E87EB870196EB0
- 第二次请求Demo01Servlet时,根据request.getSession方法,请求中会有cookie头
Cookie:JSESSIONID=4741C65CC84788A204E87EB870196EB0
- 会根据该JSESSIONID去服务器中找有没有对应的session对象,如果有就直接用,没有就新建!!!
- 当第一次响应时,会将该session对象的id作为cookie头响应给浏览器保存
set-cookie:JSESSIONID=4741C65CC84788A204E87EB870196EB0
- 第二次请求Demo01Servlet时,根据request.getSession方法,请求中会有cookie头
Cookie:JSESSIONID=4741C65CC84788A204E87EB870196EB0
- 会根据该JSESSIONID去服务器中找有没有对应的session对象,如果有就直接用,没有就新建!!!
Session相关配置
生命周期
- session默认是有30分钟的存活时间,参考tomcat中的web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- session和cookie是相关联的,cookie中存储了jsessionid,request.getSession方法会根据jsessionid去选择,到底是新建session对象,还是引用原来的session对象;如果,将浏览器关闭了,就意味着cookie中存储的jsessionid就会销毁,对应request.getSession就会新建一个session对象,但是原来的session对象还存在!
- session.invalidate方法,立马将对应的session对象销毁!后续就会新建session!
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- session和cookie是相关联的,cookie中存储了jsessionid,request.getSession方法会根据jsessionid去选择,到底是新建session对象,还是引用原来的session对象;如果,将浏览器关闭了,就意味着cookie中存储的jsessionid就会销毁,对应request.getSession就会新建一个session对象,但是原来的session对象还存在!
- session.invalidate方法,立马将对应的session对象销毁!后续就会新建session!
注意事项
- 关闭浏览器,session会怎么样?
- 销毁session,下一次的geSession怎么样?
- 销毁session,下一次的geSession怎么样?
总结
session只有两种情况会销毁
- 调用了invalidate方法
- 过了30分钟
- 过了30分钟
session的基本使用
- setAttribute
- 往session域对象中存储数据
- getAttribute
- 从session域对象中获取数据
- removeAttribute
- 把session域对象中的数据移除
- 往session域对象中存储数据
- getAttribute
- 从session域对象中获取数据
- removeAttribute
- 把session域对象中的数据移除
注意事项
1. 要将第三方jar包放在WEB-INF文件夹lib文件夹中
2. 登录失败使用请求转发、登录成功使用重定向!
3. 数据库配置文件必须c3p0(c3p0jar包)
2. 登录失败使用请求转发、登录成功使用重定向!
3. 数据库配置文件必须c3p0(c3p0jar包)
c3p0连接池配置
- c3p0.driverClass=com.mysql.jdbc.Driver
- c3p0.jdbcUrl=jdbc:mysql://localhost:3306/day57
- c3p0.user=root
- c3p0.password=root
- c3p0.jdbcUrl=jdbc:mysql://localhost:3306/day57
- c3p0.user=root
- c3p0.password=root
session案例(随机验证码)
显示验证码
- 创建图片对象
- 画背景
- 画边框
- 画干扰线
- 产生四位随机数,存储到session
- 画四位随机数
- 将图片响应到浏览器
- 创建图片对象
- 画背景
- 画边框
- 画干扰线
- 产生四位随机数,存储到session
- 画四位随机数
- 将图片响应到浏览器
作用:解决ServletContext域对象,Request域对象存储数据所存在的问题
Filter过滤器
过滤器概念
概念:过滤器就是一个用于在请求之前处理资源的组件
生命周期
- 随着服务器启动而初始化
- 随着请求的发出而过滤
- 随着服务器关闭而销毁
- 随着请求的发出而过滤
- 随着服务器关闭而销毁
执行流程
- 浏览器发起请求
- 服务器会根据这个请求,创建request对象及response对象
- 过滤器会持有request对象及response对象
- 只有当过滤器放行之后,request对象及response对象才会传给Serlvet
- 服务器会根据这个请求,创建request对象及response对象
- 过滤器会持有request对象及response对象
- 只有当过滤器放行之后,request对象及response对象才会传给Serlvet
过滤器链
根据配置顺序,遵从"先过滤,后放行"的原则!
过滤器的基本使用
开发步骤
- 自定义类实现Filter接口
- 重写init、doFilter、destroy方法
- 在web.xml中配置过滤器
- 声明过滤器
- 过滤器配置过滤路径
- 重写init、doFilter、destroy方法
- 在web.xml中配置过滤器
- 声明过滤器
- 过滤器配置过滤路径
过滤器的相关配置
Filter配置初始化参数
获取初始化参数
Filter的过滤路径
针对<servlet-name> ,以为Filter仅针对Demo01Servlet进行过滤]()
2.针对<url-pattern>
完全匹配:必须以"/"开头
- 过滤器只过滤访问路径完全匹配"/aa"的资源
- 过滤器只过滤访问路径完全匹配"/aa"的资源
目录匹配:必须以"/"开头,以"*"结尾
- 过滤器只过滤访问路径目录匹配到“/aa/bb“的资源
- 过滤器只过滤访问路径目录匹配到“/aa/bb“的资源
后缀名匹配:必须以"*"开头,以后缀名结尾
- 过滤器只过滤后缀名为jsp的资源
- 过滤器只过滤后缀名为jsp的资源
过滤器的注解开发
@WebFilter注解
- WebInitParam[] initParams() default {};
- 配置初始化参数
- String filterName() default "";
- 配置过滤器名称
- String[] servletNames() default {};
- 配置过滤的Servlet
- String[] urlPatterns() default {};
- 配置过滤路径
- 配置初始化参数
- String filterName() default "";
- 配置过滤器名称
- String[] servletNames() default {};
- 配置过滤的Servlet
- String[] urlPatterns() default {};
- 配置过滤路径
执行顺序(注解设置执行顺序)
- 按照过滤器的类名的字典顺序决定谁先过滤,谁先放行!
- 比如AFilter、BFilter,那么AFilter就会先过滤,BFilter会先放行!
- 比如AFilter、BFilter,那么AFilter就会先过滤,BFilter会先放行!
过滤器案例(中文乱码)
过滤器案例(自动登录 )
实现步骤
- 登录账户后,根据是否勾选了自动登录选项框,
- 判断是否访问和登录相关资源 (Session存储对象)
- 如果是,直接放行
- 如果不是,判断是否已经在登录状态 (Cookie存储登录信息)
- 如果是,直接放行
- 如果不是,需要从cookie中取出存储的用户信息,进行登录操作
- 如果登录成功,直接放行
- 如果登录失败,就跳转到登录页面
- 登录账户后,根据是否勾选了自动登录选项框,
- 判断是否访问和登录相关资源 (Session存储对象)
- 如果是,直接放行
- 如果不是,判断是否已经在登录状态 (Cookie存储登录信息)
- 如果是,直接放行
- 如果不是,需要从cookie中取出存储的用户信息,进行登录操作
- 如果登录成功,直接放行
- 如果登录失败,就跳转到登录页面
过滤器案例(敏感词过滤)
需求:将浏览器传过来的文本进行过滤,如果有敏感词用“**”代替
- 操作:
- 在服务器中过滤有局限性,每个服务器都要修改
- 如果在过滤器中过滤(不会影响服务器中得到的参数)
- 操作:
- 在服务器中过滤有局限性,每个服务器都要修改
- 如果在过滤器中过滤(不会影响服务器中得到的参数)
操作:在过滤器中动态代理修改getParameter方法
- 步骤
- 将敏感词存到初始化参数(init-parame)
- 强转为HttpServletRequest类型
- 动态代理(增强方法)
- 获取方法名
- 判断方法名是否“getParameter”
- 加强方法:
- 看是否有敏感词
- 有的话替换参数,返回
- 没有,执行原有方法
- 得到HttpServletRequest对象返回
- 步骤
- 将敏感词存到初始化参数(init-parame)
- 强转为HttpServletRequest类型
- 动态代理(增强方法)
- 获取方法名
- 判断方法名是否“getParameter”
- 加强方法:
- 看是否有敏感词
- 有的话替换参数,返回
- 没有,执行原有方法
- 得到HttpServletRequest对象返回
监听器
监听器的介绍
概念
事件源:时间发生的源头
监听器:监听事件发生
绑定:将监听器绑定到事件源
事件:能够触发监听器的事
事件源:时间发生的源头
监听器:监听事件发生
绑定:将监听器绑定到事件源
事件:能够触发监听器的事
Servlet监听器
时间源:request域对象、session域对象、ServletContext
监听器:Servlet三种监听器
绑定:配置web.xml
事件:域对象发生改变
时间源:request域对象、session域对象、ServletContext
监听器:Servlet三种监听器
绑定:配置web.xml
事件:域对象发生改变
监听器的分类
一类监听器
监听域对象的创建、销毁
二类监听器
监听域对象中的属性变更(属性设置、属性替换、属性移除)
三类监听器
监听域对象的java对象的绑定
监听器的基本使用
一类监听器
ServletRequestListener:监听ServletRequest域对象的创建、销毁
(请求-响应)
HttpSessionListener :监听HttpSession域对象的创建、销毁
- 创建----自定义销毁(invalidate)
- 创建----服务器关闭
- 创建----30分钟
- 创建----服务器关闭
- 创建----30分钟
ServletContextListener : 监听ServletContext域对象的创建、销毁
服务器启动-服务器关闭
二类监听器
ServletRequestAttributeListener
监听ServletRequest域对象中属性变更
HttpSessionAttributeListener
监听HttpSession域对象中属性变更
ServletContextAttributeListener
监听ServletContext域对象中属性变更
三类监听器
HttpSessionBindingListener
监听session域中的java对象的状态(绑定和解绑)
- 绑定:将java对象存储到session域对象
- 解绑:将java对象从session域对象移除
- 解绑:将java对象从session域对象移除
监听器组成
- 事件源:java对象
- 监听器:HttpSessionBindingListener
- 绑定:java对象实现HttpSessionBindingListener接口
- 事件:java对象在session中状态发生改变
- 监听器:HttpSessionBindingListener
- 绑定:java对象实现HttpSessionBindingListener接口
- 事件:java对象在session中状态发生改变
注意事项
HttpSessionBindingListener监听不需要在web.xml配置(已经在java对象中配置了)
监听器案例(显示在线人数)
jsp
介绍
为什么要引入jsp?
- html文件无法获取java程序中的数据,同时,如果使用Servlet来显示java数据又显得不太合理!
- 综上,需要一门技术,既可以显示页面,同时也可以获取java程序中的数据什么
- 综上,需要一门技术,既可以显示页面,同时也可以获取java程序中的数据什么
什么是jsp?
- jsp:java server page
- 简单理解为,它就是一个可以获取java数据的html文件。
- 简单理解为,它就是一个可以获取java数据的html文件。
jsp相关概念
jsp为什么是一个Servlet
- jsp文件会转义成对应的java文件
- 比如:demo01.jsp转义成demo01_jsp.java,类demo01_jsp会继承于HttpJspPage,HttpJspPage又是Servlet子类,demo01.jsp就是Servlet
- 比如:demo01.jsp转义成demo01_jsp.java,类demo01_jsp会继承于HttpJspPage,HttpJspPage又是Servlet子类,demo01.jsp就是Servlet
jsp的执行流程
- 浏览器发起请求demo01.jsp
- demo01.jsp就会转义生成对应demo01_jsp.java
- 在demo01_jsp类中,通过JspWriter类将demo01.jsp中的html标签作为响应正文响应给浏览器进行渲染显示!
- demo01.jsp就会转义生成对应demo01_jsp.java
- 在demo01_jsp类中,通过JspWriter类将demo01.jsp中的html标签作为响应正文响应给浏览器进行渲染显示!
jap脚本
作用
可以在页面上写java代码
分类
- 声明脚本:<%! java代码 %>
- 片段脚本:<% java代码 %>
- 输出脚本::<%= 变量值 %>
- 片段脚本:<% java代码 %>
- 输出脚本::<%= 变量值 %>
具体作用
- 声明脚本:<%! java代码 %>
- 在jsp对应java类中,生成一个成员变量
- 片段脚本:<% java代码 %>
- 在jsp对应的java类的_jspService方法中,生成一个局部变量
- 输出脚本::<%= 变量值 %>
- 向浏览器输出内容,相当于response.getWriter().write()
- 在jsp对应java类中,生成一个成员变量
- 片段脚本:<% java代码 %>
- 在jsp对应的java类的_jspService方法中,生成一个局部变量
- 输出脚本::<%= 变量值 %>
- 向浏览器输出内容,相当于response.getWriter().write()
jsp注释
概念
- jsp文件中,既可以有html代码,也可以有java代码
- 这就意味着,jsp文件中,既可以使用html注释,也可以使用java注释,同时还可以使用jsp注释
- 这就意味着,jsp文件中,既可以使用html注释,也可以使用java注释,同时还可以使用jsp注释
html注释
- 用来注释html代码
- 会将注释内容生成到jsp对应的java文件中
- 会将注释内容生成到jsp对应的java文件中
java注释
- 用来注释java代码
- 会将注释内容生成到jsp对应的java文件中
- 会将注释内容生成到jsp对应的java文件中
jsp注释
- 用来注释html代码
- 不会讲注释内容生成到jsp对应的java文件中
- 不能注释到jsp脚本中
- 不会讲注释内容生成到jsp对应的java文件中
- 不能注释到jsp脚本中
jsp指令
作用
用于指示jsp执行某些操作 、用于指示jsp表现特定行为或效果
格式
<%@ 指令名称 属性名1=“属性值” 属性名2=“属性值2” %>
分类
- page指令
- taglib指令
- include指令
- taglib指令
- include指令
page指令
- contentType="text/html;chatset=UTF-8"
- 告诉浏览器应该以utf-8解码响应正文,告诉服务器应该以utf-8对响应正文进行编码
- language="java"
- 设置jsp页面能够使用的语言(不改变)
- import ="java.ytil.List"
- 在当前jsp页面导入List类
- isELIgnored="false"
- 当前页面不要忽略el表达式,默认就是不忽略(true不会当成el表达式进行解析)
- errorpage="error.jsp"
- 当前页面发生异常时要跳转到该页面
- isErrorPage="true"
- 标记当前jsp页面是否是一个错误页面,如果为true那么就可以使用jsp内置对象exception,否则不能使用(不设置会在.java中不显示exception内置对象)
- extends="org.apache.jasper.runtime.HttpJspBase"
默认继承HttpJspBase,不要动!
- 告诉浏览器应该以utf-8解码响应正文,告诉服务器应该以utf-8对响应正文进行编码
- language="java"
- 设置jsp页面能够使用的语言(不改变)
- import ="java.ytil.List"
- 在当前jsp页面导入List类
- isELIgnored="false"
- 当前页面不要忽略el表达式,默认就是不忽略(true不会当成el表达式进行解析)
- errorpage="error.jsp"
- 当前页面发生异常时要跳转到该页面
- isErrorPage="true"
- 标记当前jsp页面是否是一个错误页面,如果为true那么就可以使用jsp内置对象exception,否则不能使用(不设置会在.java中不显示exception内置对象)
- extends="org.apache.jasper.runtime.HttpJspBase"
默认继承HttpJspBase,不要动!
taglib指令
作用:在当前jsp页面导入jstl标签库
<%@taglib prefix="前缀" uri="路径"%>
include指令(了解)
作用:用于将外部引入到jsp文件中
<%@ include file="top.jsp"%>
jsp内置对象
什么是内置对象
- 可以在jsp页面上直接使用的对象
- 九大内置对象
- 九大内置对象
- page
- 当前页面对象,java.lang.Object
- pageContext
- 当前页面上下文对象,javax.servlet.jsp.PageContext
- request
- 请求对象,javax.servlet.http.HttpServletRequest
- response
- 响应对象,javax.servlet.http.HttpServletResponse
- session
- 会话对象,javax.servlet.http.HttpSession
- config
- ServletConfig对象,javax.servlet.ServletConfig
- exception
- 异常对象,java.lang.Throwable
- application
- ServletContext对象,javax.servlet.ServletContext
- out
- JspWriter对象,javax.servlet.jsp.JspWriter
- 当前页面对象,java.lang.Object
- pageContext
- 当前页面上下文对象,javax.servlet.jsp.PageContext
- request
- 请求对象,javax.servlet.http.HttpServletRequest
- response
- 响应对象,javax.servlet.http.HttpServletResponse
- session
- 会话对象,javax.servlet.http.HttpSession
- config
- ServletConfig对象,javax.servlet.ServletConfig
- exception
- 异常对象,java.lang.Throwable
- application
- ServletContext对象,javax.servlet.ServletContext
- out
- JspWriter对象,javax.servlet.jsp.JspWriter
为什么jsp可以直接使用内置对象
在jsp对应的java文件中,已经提前声明好了这些内置对象,所以可以直接使用。
四大域对象
域对象:就是可以用来存储数据对象
servlet域对象
request
session
servletContext
jsp域对象
pageContext
request
sesion
sevletContext
pageContext域对象
作用
- 获取其他的内置对象
- 操作域
- 操作域
操作page域
- 操作request、session、application
- 操作request、session、application
操作request域
pageContext.setAttribute("msg1","hello page1",PageContext.REQUEST_SCOPE);往request域中存储
操作session域
pageContext.setAttribute("msg2","hello page2",PageContext.SESSION_SCOPE);
操作servletContext域
pageContext.setAttribute("msg3","hello page3",PageContext.APPLICATION_SCOPE);
jsp优化登录案例
之前
- login.html
- 登录页面
- LoginServlet
- 处理登录请求
- 业务处理
- 调用dao,操作数据
- ShowIndexServlet(java代码)
- 显示用户名
- 存在的问题
- login.html
- 无法和java后台进行交互,无法显示错误信息
- ShowIndexServlet
- html无法和java后台进行交互,java代码应该专注于后台代码
- 登录页面
- LoginServlet
- 处理登录请求
- 业务处理
- 调用dao,操作数据
- ShowIndexServlet(java代码)
- 显示用户名
- 存在的问题
- login.html
- 无法和java后台进行交互,无法显示错误信息
- ShowIndexServlet
- html无法和java后台进行交互,java代码应该专注于后台代码
现在
- login.jsp
- 登录页面
- 显示错误信息
- LoginServlet
- 处理登录请求
- 业务处理
- 调用dao,操作数据
- index.jsp
- 显示用户名
- 登录页面
- 显示错误信息
- LoginServlet
- 处理登录请求
- 业务处理
- 调用dao,操作数据
- index.jsp
- 显示用户名
EL表达式
介绍
什么是el表达式
- el(expression language),是由jsp内置提供
- el表达式用来替换jsp脚本得
- el表达式用来替换jsp脚本得
作用
- 向页面输出数据
- 获取web对象
- 获取web对象
格式
${}
注意
如果page指令中isELIgnored="true",jsp页面就不会解析执行el表达式,会原样显示!!!
el获取域数据基本使用
获取page域数据
${pageScope.数据名}
获取request域数据
${requestScope.数据名}
获取session域数据
${sessionScope.数据名}
获取application域数据
${application.数据名}
el获取复杂域数据
注意
- 获取集合、数组是通过传入的参数名加想要获取的值
- 获取java对象用参数名.想要获取的值(不用加get)
- 获取java对象用参数名.想要获取的值(不用加get)
获取数组
获取List集合
获取map集合
获取java对象
el表达式执行运算
算数
+:加 -:减 *:乘
/:除 div
%:取余 mod
/:除 div
%:取余 mod
关系
> : gt <--(greater)-->
>= : ge
< : lt <--(little)-->
<= : le
== : eq
!= : ne
>= : ge
< : lt <--(little)-->
<= : le
== : eq
!= : ne
逻辑
&& : and 全真就为真
|| : or 有真即为真
! : not 真便是假,假便是真
|| : or 有真即为真
! : not 真便是假,假便是真
三目运算
${num1 gt num2 ? "num1大于num2" : "num1不大于num2"}
(前面是一个运算表达式 ? 前面结果为真时:前面结果为假时 )
el表达式中的web对象
常用
- pageScope
- 是page域对象
- requestScope
- 是request域对象
- sessionScope
- 是session域对象
- applicationScope
- 是application域对象
- cookie
- Map<String,Cookie>,键是cookie名称,值是cookie对象
- ${cookie}获得的时全部的cookie
- ${cooike.JSESSIONID}获得的是名字为JSESSIONID的cookie
- ${cooike.JSESSIONID.value}获得的是名字为JSESSIONID的cookie的值
- pageContext
- 相当于pageContext对象,获取jsp九大内置对象
- 是page域对象
- requestScope
- 是request域对象
- sessionScope
- 是session域对象
- applicationScope
- 是application域对象
- cookie
- Map<String,Cookie>,键是cookie名称,值是cookie对象
- ${cookie}获得的时全部的cookie
- ${cooike.JSESSIONID}获得的是名字为JSESSIONID的cookie
- ${cooike.JSESSIONID.value}获得的是名字为JSESSIONID的cookie的值
- pageContext
- 相当于pageContext对象,获取jsp九大内置对象
不常用
- initParam
- 获取初始化参数
- ${initParam.get("user")}获取全局初始化参数
- param
- 相当于request.getParameter()
- ${param.username}获取名称为username的参数,类似request.getParameter("username");
${param.password}
- paramValues
- 相当于request.getParameterValues()
- ${paramValues.username[1]}获取参数全部的值,类似request.getParameterValues("username");
- header
- 获取单个请求头值
- headerValues
- 获取一组请求头的值
- 获取初始化参数
- ${initParam.get("user")}获取全局初始化参数
- param
- 相当于request.getParameter()
- ${param.username}获取名称为username的参数,类似request.getParameter("username");
${param.password}
- paramValues
- 相当于request.getParameterValues()
- ${paramValues.username[1]}获取参数全部的值,类似request.getParameterValues("username");
- header
- 获取单个请求头值
- headerValues
- 获取一组请求头的值
jstl标签库介绍
概述
- jstl (java standard tag libarary)
- 和el表达式结合使用,可以让功能更加强大!
- 和el表达式结合使用,可以让功能更加强大!
环境
jstl.jar
standard.jar
standard.jar
在jsp页面导入jstl标签库
- 使用taglib指令
- 使用taglib指令
jstl核心标签
set标签
向域对象(page域,request、session域、applicaton域)中存储数据
- var:参数名称
- scope:域
- value:参数值
- var:参数名称
- scope:域
- value:参数值
remove标签
移除域对象中的数据
- var:参数名称
- scope:域
- var:参数名称
- scope:域
catch标签
捕获jsp页面中的异常,相当于try{}catch(){}
- var:声明异常对象名称,用来接收异常对象(var="e")
- var:声明异常对象名称,用来接收异常对象(var="e")
if标签
条件判断
- text="编写条件"
- text="编写条件"
forEach标签
遍历集合或是数组
- begin:开始
- end:结束
- step:步数(控制打印的个数,类似 i++)
- var:元素的名称
- items:集合/数组(存入域中的名字)
- varStatus:元素状态对象
- first:是否是第一个元素
- last:是否是最后一个对象
- current:当前元素
- index:当前角标
- begin:开始
- end:结束
- step:步数(控制打印的个数,类似 i++)
- var:元素的名称
- items:集合/数组(存入域中的名字)
- varStatus:元素状态对象
- first:是否是第一个元素
- last:是否是最后一个对象
- current:当前元素
- index:当前角标
forToken标签
分割字符串
- items:要分割的字符串
- delims:根据什么分割
- var:分割产生的元素
- items:要分割的字符串
- delims:根据什么分割
- var:分割产生的元素
javaWeb设计模式
jsp模式
model1
- jsp
- 处理请求
- 业务处理
- 操作数据库
- 显示数据
- javaBean
- 封装数据
- 优缺点
- 开发简单,维护难;代码几乎都在jsp中。
- 处理请求
- 业务处理
- 操作数据库
- 显示数据
- javaBean
- 封装数据
- 优缺点
- 开发简单,维护难;代码几乎都在jsp中。
model2
- servlet
- 处理请求
- 业务处理
- 操作数据库
- jsp
- 显示数据
- javaBean
- 封装数据
- 优缺点
- 开发较难,维护简单。
- 处理请求
- 业务处理
- 操作数据库
- jsp
- 显示数据
- javaBean
- 封装数据
- 优缺点
- 开发较难,维护简单。
BeanUtils框架
概念:可以将请求参数封装到java对象中
注意:页面上的name属性值要和java对象中的属性名一致!
mvc设计模式
概念
- 是一种软件设计典范,用一种业务逻辑,数据、界面分离得方式来组织代码,将业务逻辑聚集到一个部件中,方便程序得重复使用,提高我们得开发效率
- jsp得model2模式是mvc设计模式得一种
- jsp得model2模式是mvc设计模式得一种
组成
子主题
- m
- model:封装数据(javaBean)
- v
- view:显示页面(jsp)
- c
- controller:(三层结构)
- 请求处理(controller)
- 业务处理(service)
- 操作数据库(dao)
- model:封装数据(javaBean)
- v
- view:显示页面(jsp)
- c
- controller:(三层结构)
- 请求处理(controller)
- 业务处理(service)
- 操作数据库(dao)
分页查询
为什么要有分页查询
如果没有分页查询的话,存在两个问题
- 浏览器的加载数据过多,容易导致浏览器崩溃
- 查询数据库的数据量过大,查询时间会非常长
- 浏览器的加载数据过多,容易导致浏览器崩溃
- 查询数据库的数据量过大,查询时间会非常长
分类
逻辑分页
一次性将所有数据查询出来,保存到List集合中,后续,如果有分页请求,在对List集合进行拆分
- 优点:减少了操作数据库的次数
- 缺点:单次查询数据库的时间过长
- 缺点:单次查询数据库的时间过长
物理分页
不是一次性将所有数据全部查询出来,查询第一页:发送一条查询10条的SQL语句,查询下一页数据,又发送一条查询后10条的SQL语句
- 优点:单词查询数据库的时间非常短
- 缺点:操作数据库的次数增加
- 缺点:操作数据库的次数增加
分页查询的sql语句
select * from 表名 limit ?,?
分页查询流程
问题一:当浏览器发起分页请求时,浏览器需要传递什么参数给服务器?
当前页数(currentPage)
问题二:当服务器响应浏览器时,服务器需要传递什么参数给浏览器?
浏览器需要的参数:
- 当前页数(currentPage)
- 总页数(totalPage)
- 总记录数(totalSize)
- 每页记录数(pageSize)
- 当前页数据(list)
- 当前页数(currentPage)
- 总页数(totalPage)
- 总记录数(totalSize)
- 每页记录数(pageSize)
- 当前页数据(list)
问题三:当服务器向浏览器响应上面的五个参数时,是将五个参数作为整体传递还是独立传递?
- 服务器向浏览器传递参数,通过域
- 独立传递需要在域中存储五个参数
- currentPage、totalPage、totalSize、pageSize、list
- 整体传递只需要存储一个参数:(使用)
- PageBean
- 独立传递需要在域中存储五个参数
- currentPage、totalPage、totalSize、pageSize、list
- 整体传递只需要存储一个参数:(使用)
- PageBean
问题四:分页对象PageBean中的五个参数是在那一层代码中确定的?
- 当前页数(currentPage)
- controller层
- 总页数(totalPage)
- service层
- 总记录数(totalSize)
- 获取是在dao层,调用是在service层
- 每页记录数(pageSize)
- service层
- 当前页数据(list)
- 获取是在dao层
- controller层
- 总页数(totalPage)
- service层
- 总记录数(totalSize)
- 获取是在dao层,调用是在service层
- 每页记录数(pageSize)
- service层
- 当前页数据(list)
- 获取是在dao层
总结:以上五个参数封装成分页对象(PageBean),是在service层进行的!!!
Service层的操作
UserService
- 设置当前页数(currentPage)
- 设置总记录数(totalSize)
- 设置每页记录数(pageSize)
- 设置总页数(totalPage)
- 总页数 = (总记录数 % 每页记录数 == 0) ? 总记录数/ 每页记录数 : 总记录数/ 每页记录数 + 1;
- 设置当前页数据(list)
- begin = (currentPage - 1) * pageSize
- 设置当前页数(currentPage)
- 设置总记录数(totalSize)
- 设置每页记录数(pageSize)
- 设置总页数(totalPage)
- 总页数 = (总记录数 % 每页记录数 == 0) ? 总记录数/ 每页记录数 : 总记录数/ 每页记录数 + 1;
- 设置当前页数据(list)
- begin = (currentPage - 1) * pageSize
文件上传
概念:本质就是将一台电脑中的文件根据网络协议通过io流传递到另一台电脑(服务器)上。
网络编程
- ip
- 电脑在网络中的唯一标识
- port
- 软件在电脑中的唯一标识
- 协议
- 不同设备进行沟通的规则
- 电脑在网络中的唯一标识
- port
- 软件在电脑中的唯一标识
- 协议
- 不同设备进行沟通的规则
文件上传代码
文件上传三要素
请求方式必须是post
enctype="multipart/form-data"
文件上传项
文件上传后台代码
就是将本地电脑中的文件上传到服务器中的磁盘中
开发步骤
创建磁盘文件项工厂对象(DiskFileItemFactory)
创建核心解析对象 (ServletFileUpload)
解析上传请求
- 如果是描述文本,直接打印
- 如果是上传文件,就进行io读写
- 如果是上传文件,就进行io读写
文件上传常用API(用到的类)
ServletFileUpload
parseRequest
解析请求,获取文件项
setHeaderEncoding
解决文件名中文乱码
FileItem类
- isFormField
- 判断是否是普通上传项。返回值为true,那么是普通上传项,否则是文件上传项
- getFieldName
- 获取字段名称
- getString(String encoding)
- 获取描述文本,指定编码格式
- getName
- 获取上传文件名称
- getInputStream
- 获取上传文件对应的输入流
- 判断是否是普通上传项。返回值为true,那么是普通上传项,否则是文件上传项
- getFieldName
- 获取字段名称
- getString(String encoding)
- 获取描述文本,指定编码格式
- getName
- 获取上传文件名称
- getInputStream
- 获取上传文件对应的输入流
- getServletContext().getRealPath("upload");获取路径
- request.getRealPath("upload");获取路径
- request.getRealPath("upload");获取路径
要解决的问题
- 上传文件名中文乱码
- 描述文本中文乱码
- 文件名重复
- 描述文本中文乱码
- 文件名重复
文件下载功能
概念: 将服务器中的文件通过网络通信协议传输到本地电脑中
步骤:
设置媒体类型
- 告诉浏览器下载文件的类型
- 操作响应头"Content-Type"
- //获取文件的类型
String mimeType = request.getServletContext().getMimeType(fileName);
//确定下载的类型
response.setContentType(mimeType);
- 设置下载窗口
- 操作响应头“Content-Disposition”
- response.setHeader("Content-Disposition","attachement;fileName="+newFileName);
//newFileName为设置完编码格式的新名字
- IO流读写
- 告诉浏览器下载文件的类型
- 操作响应头"Content-Type"
- //获取文件的类型
String mimeType = request.getServletContext().getMimeType(fileName);
//确定下载的类型
response.setContentType(mimeType);
- 设置下载窗口
- 操作响应头“Content-Disposition”
- response.setHeader("Content-Disposition","attachement;fileName="+newFileName);
//newFileName为设置完编码格式的新名字
- IO流读写
设置下载窗口代码实现
- 不同的浏览器对文件名称的编码方式不同,以google浏览器为代表的是以utf-8对文件名称进行编码
- 其他的一些浏览器以base64对文件名称进行编码
- 判断使用的浏览器的类型User-Agent
- 其他的一些浏览器以base64对文件名称进行编码
- 判断使用的浏览器的类型User-Agent
自定义文件上传(socket)
概念:将本地电脑中的文件通过网络通信协议传输到服务器中!
文件上传原理:
- 发送端
- 使用本地输入流读取本地电脑中文件(自己new)
- 使用网络通信的输出流将本地输入流中的内容传输到服务器电脑(通过socket获得)
- 接收端
- 使用网路通信的输入流读取上传的问题的数据(通过socket获得)
- 使用本地输出流将上传文件的数据写出到服务器的文件中(自己new)
- 使用本地输入流读取本地电脑中文件(自己new)
- 使用网络通信的输出流将本地输入流中的内容传输到服务器电脑(通过socket获得)
- 接收端
- 使用网路通信的输入流读取上传的问题的数据(通过socket获得)
- 使用本地输出流将上传文件的数据写出到服务器的文件中(自己new)
问题一:
- 接收端接受一次文件,接受程序就会结束!
- 如果后续还有用户需要上传文件就会失败!
- 引入循环
- 接收端接受一次文件,接受程序就会结束!
- 如果后续还有用户需要上传文件就会失败!
- 引入循环
问题二:
- 当用户上传了一个大文件,耗时10分钟,那么在这10分钟内,其他用户是无法上传文件的!
- 引入多线程
- 当用户上传了一个大文件,耗时10分钟,那么在这10分钟内,其他用户是无法上传文件的!
- 引入多线程
单实例多线程,自定义tomcat
单实例多线程
概念
- tomcat服务器根据server.xml中的Connector配置初始化线程池
- 当第一次请求发起时,会调度线程池分配线程处理请求,实例一个Serlvet对象
- 当第二次请求发起时,会再次调度线程池分配新的线程处理请求,会沿用之前Servlet对象
- 当第一次请求发起时,会调度线程池分配线程处理请求,实例一个Serlvet对象
- 当第二次请求发起时,会再次调度线程池分配新的线程处理请求,会沿用之前Servlet对象
线程安全问题
- 成员变量,值会发生改变,存在线程安全问题
- 成员变量,值不会发生改变,不存在线程安全问题
- 局部变量,不同的线程持有不同的局部变量,所以,不存在线程安全问题
- 成员变量,值不会发生改变,不存在线程安全问题
- 局部变量,不同的线程持有不同的局部变量,所以,不存在线程安全问题
自定义tomcat
执行原理
- 操作请求行、请求头、请求正文
- 操作响应行、响应头、响应正文
- 操作响应行、响应头、响应正文
自定义服务器
- 模仿tomcat服务器
- 操作请求行(获取路径)
- 操作响应行、响应头、响应正文(返回)
- 操作请求行(获取路径)
- 操作响应行、响应头、响应正文(返回)
优化
存在问题
- 服务器只能接收一次请求(循环)
- 服务器是单线程(多线程)
- 服务器是单线程(多线程)
解决
- 加入无限循环
- 加入多线程
- 加入多线程
正则表达式
子主题
概念
是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串,其实就是一种规则,有自己特殊的应用
作用
主要是用来做表单的内容的规则校验
基本使用:
需求:
- 键盘录入一个qq号码,要求该号码长度在5-15之间,不能以0开头,必须全部都是数字
- 键盘录入一个qq号码,要求该号码长度在5-15之间,不能以0开头,必须全部都是数字
正则表达式(字符类)
概念
规定字符串的内容!
常见规则:
- [abc]
- 任意一个字符,要么是a,要么是b,要么是c
- [^abc]
- 任意一个字符串,不可以是a、b、c
- [a-zA-Z]
- 任意一个字符,范围在:a-z之间或A-Z之间
- [0-9]
- 任意一个字符,范围在0-9之间
- 任意一个字符,要么是a,要么是b,要么是c
- [^abc]
- 任意一个字符串,不可以是a、b、c
- [a-zA-Z]
- 任意一个字符,范围在:a-z之间或A-Z之间
- [0-9]
- 任意一个字符,范围在0-9之间
注意事项:只要没有标明长度,那么默认长度就是1!!!
正则表达式(预定义字符类)
概念:一些有特定含义的表达式
作用:减少编写正则表达式的麻烦
. //任何字符。
\d //数字:[0-9]
\D //非数字:[^0-9]
\w //单词字符:[a-zA-Z_0-9]
\W //非单词字符:[^\w]
\s //空白字符:[ \t\n\x0B\f\r]
\S //非空白字符:[^\s]
\d //数字:[0-9]
\D //非数字:[^0-9]
\w //单词字符:[a-zA-Z_0-9]
\W //非单词字符:[^\w]
\s //空白字符:[ \t\n\x0B\f\r]
\S //非空白字符:[^\s]
注意事项
- 正则表达式中,如果没有写[],那么就会给每一个字符加[]
- 比如:
- 比如:
正则表达式(数量词)
概念:规定某一个字符的长度
常见数量词:
- X:要么是一个字符类、要么是一个预定义字符类
- X:要么是一个字符类、要么是一个预定义字符类
正则表达式(分割功能)
需求:
- "a,b,c,d"、 "a,,b,,c,,d"、 "a,b,,c,,,d"、 "a,,b,,,c,d,,,,,e" 将以上四个字符串按照逗号进行分割。
- "a,b,c,d"、 "a,,b,,c,,d"、 "a,b,,c,,,d"、 "a,,b,,,c,d,,,,,e" 将以上四个字符串按照逗号进行分割。
"a,b,c,d"
String str1 = "a,b,c,d";
String reg1 = "[,]{1}";
String[] strs1 = str1.split(reg1);
for (String str : strs1) {
System.out.println(str);
}
String str1 = "a,b,c,d";
String reg1 = "[,]{1}";
String[] strs1 = str1.split(reg1);
for (String str : strs1) {
System.out.println(str);
}
Pattern类和Matcher类
Pattern类
相当于就是正则表达式,现在是正则对象
Matcher类
- 匹配对象,完成匹配功能等
- find方法:在字符串中找到和正则匹配得上的子字符串,如果找到了返回true,否则返回false
- group方法:获取字符串中找到和正则匹配得上的子字符串
- find方法:在字符串中找到和正则匹配得上的子字符串,如果找到了返回true,否则返回false
- group方法:获取字符串中找到和正则匹配得上的子字符串
javaScript
ECMAScript
概念
JavaScript是一门脚本语言,不需要编译,直接就可以被浏览器解析执行.
发展史:
- 1992年,第一门脚本语言:ScriptEase,专门用于表单校验
- 1995年,Netscape(网景)公司开发了一门脚本语言:LiveScript,后面更名为JavaScript
- 1996年,微软抄袭JavaScript,开发出JScript
- .1997年,ECMA组织,指定了脚本语言规范:ECMAScript
- 1995年,Netscape(网景)公司开发了一门脚本语言:LiveScript,后面更名为JavaScript
- 1996年,微软抄袭JavaScript,开发出JScript
- .1997年,ECMA组织,指定了脚本语言规范:ECMAScript
ECMAScript
- 可以来解释JavaScript的一个标准,
- 最新版本到es6
- 但是大部分浏览器还只停留在es5代码上
- 开发环境---线上环境 版本不一致
- 最新版本到es6
- 但是大部分浏览器还只停留在es5代码上
- 开发环境---线上环境 版本不一致
JavaScript组成:
由ECMAScript、BOM、DOM组成
ECMAScript页面结合
概念:JavaScript是一门脚本,要起作用,必须结合页面使用
分类
内部结合:
- 直接在页面文件中编写script标签,将js代码编写到script标签内容中
外部结合:
- 在页面文件中使用script标签的src属性引入外部的js文件
- 直接在页面文件中编写script标签,将js代码编写到script标签内容中
外部结合:
- 在页面文件中使用script标签的src属性引入外部的js文件
ECMAScript注释
概念:用来注释js脚本代码,给开发人员看的,浏览器不会解析执行
分类:
单行 //
多行 /* */
ECMAScript数据类型
分类:
原始数据类型:
- Number
- 整数、小数、NaN(not a number)
- string
- 字符串("abc"、'abc')
- boolean
- true、false
- null
- 空对象
- undefined
- 定义一个变量,但是没有赋初值
- 整数、小数、NaN(not a number)
- string
- 字符串("abc"、'abc')
- boolean
- true、false
- null
- 空对象
- undefined
- 定义一个变量,但是没有赋初值
引用数据类型:
js对象
ECMAScript变量
概念:提高复用性,提高可维护性!
java是强类型语言,JavaScript是弱类型语言
- 强类型语言:
- 在定义变量时,要确定数据类型,在赋值时,只能赋值指定类型的数据
- 弱类型语言:
- 在定义变量时,不确定数据类型,在赋值时,赋值多种类型的数据
- 在定义变量时,要确定数据类型,在赋值时,只能赋值指定类型的数据
- 弱类型语言:
- 在定义变量时,不确定数据类型,在赋值时,赋值多种类型的数据
格式:
- var 变量名 = 值;
- var 变量名 = 值;
ECMAScript应用
typeof方法
查看数据的类型
typeof(值)
ECMAScript运算
一元运算符:
算术运算符:
赋值运算符:
比较运算符:
逻辑运算符:
三元运算符:
流程控制语句:
ECMAScript基本对象
Function、Array、Boolean、Date、Number、String、RegExp、Global(全局函数对象)
Function对象(了解)
概念:创建方法
var 方法名 = new Function("形式参数列表","方法体");
- 不需要返回值类型(var)
- 形参不需要参数类型(var)
- 如果方法定义了形参,调用时,可以不传递实际参数!
- 形参不需要参数类型(var)
- 如果方法定义了形参,调用时,可以不传递实际参数!
Array对象
概念:Array 对象用于在单个的变量中存储多个值。
var arr1 = new Array("a","b","c");
var arr2 = new Array(length);
var arr3 = ["a","b","c"];
var arr2 = new Array(length);
var arr3 = ["a","b","c"];
常用属性:
- length(获取长度)
- length(获取长度)
常用方法:
- join
- 用于把数组中的所有元素放入一个字符串。(默认中间是",",可以自行定义)
- pop
- 用于删除并返回数组的最后一个元素。
- push
- 可向数组的末尾添加一个或多个元素,并返回新的长度。
- join
- 用于把数组中的所有元素放入一个字符串。(默认中间是",",可以自行定义)
- pop
- 用于删除并返回数组的最后一个元素。
- push
- 可向数组的末尾添加一个或多个元素,并返回新的长度。
Date对象
概念:
- Date 对象用于处理日期和时间。
- Date 对象用于处理日期和时间。
常用方法:
- toLocaleString
- 获取本地的当前时间
- getFullYear
- 获取年份
- genMonth
- 获取月份,范围:0~11
- getDate
- 获取天
- getHours
- 获取小时
- getMinutes
- 获取分钟
- getSeconds
- 获取秒钟
- getTime
- 获取对应的毫秒值
- toLocaleString
- 获取本地的当前时间
- getFullYear
- 获取年份
- genMonth
- 获取月份,范围:0~11
- getDate
- 获取天
- getHours
- 获取小时
- getMinutes
- 获取分钟
- getSeconds
- 获取秒钟
- getTime
- 获取对应的毫秒值
Regexp对象
概念
- RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
- RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
var reg = /^正则表达式$/
全局对象Global
概念
- 全局属性和函数可用于所有内建的 JavaScript 对象。
- 解释:javaScript中的对象都可以使用
- 全局属性和函数可用于所有内建的 JavaScript 对象。
- 解释:javaScript中的对象都可以使用
常用方法:
- parseInt(值)
- 将数字字符串转换成数字
- isNaN(值)
- 判断变量是否是一个NaN
- eval("("+jsonStr+")")
- var jsonStr = '{"username":"root","password":"root"}';
- 将json字符串转换成js对象,方便调用属性
- parseInt(值)
- 将数字字符串转换成数字
- isNaN(值)
- 判断变量是否是一个NaN
- eval("("+jsonStr+")")
- var jsonStr = '{"username":"root","password":"root"}';
- 将json字符串转换成js对象,方便调用属性
ECMAScript之方法
方法一:
function 方法名(形参列表) {
方法体;
}
方法体;
}
方法二:
var 方法名 = function(形参列表){
方法体;
}
方法体;
}
方法三:
var 方法体 = new Function("形参列表","方法体");
注意事项:
- 在方法中,有一个内置对象arguments,包含所有的实际参数
- 在方法中,有一个内置对象arguments,包含所有的实际参数
ECMAScript事件
概念
- 事件源:发生事件的源头
- 监听器:发生事件后触发的组件
- 事件绑定:将事件源和监听器关联
- 事件:能够触发监听器的事
- 监听器:发生事件后触发的组件
- 事件绑定:将事件源和监听器关联
- 事件:能够触发监听器的事
常用事件(onclick)
onclick 鼠标点击某个元素
常用事件(onload)
概述
- 某个页面或图像被完成加载
- 某个页面或图像被完成加载
常用事件(onfocus)
获得焦点
常用事件(onblur)
失去焦点
常用事件(onkeydown)
键盘按下
通过event.keyCode获得是哪一个键
常用事件(onkeyup)
键盘松开
常用事件(onmousedown)
鼠标按下
常用事件(onmousemove)
鼠标移动
常用事件(onmouseup)
鼠标松开
常用事件(onchange)
域发生改变
常用事件(onsubmit)
提交表单
加return ture通过,false拦截
Json介绍
简介
概念
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
- 它基于ECMAScript的 一个子集。
- JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习 惯。这些特性使JSON成为理想的数据交换语言。
- 易于人阅读和编写,同时也易于机器解析 和生成(网络传输速率)。
- 它基于ECMAScript的 一个子集。
- JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习 惯。这些特性使JSON成为理想的数据交换语言。
- 易于人阅读和编写,同时也易于机器解析 和生成(网络传输速率)。
语法
- 单一对象
- {"属性名1":"属性值1" , "属性名2":"属性值2"}
- 多个对象
- [{"属性名1":"属性值1" , "属性名2":"属性值2"} , {"属性名1":"属性值1" , "属性名2":"属性值2"}]
- 解释
- a.数据在键值对里面
- b.数据之间由逗号分隔
- c.大括号保存对象
- d.中括号保存数组
- e.Json值
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
- {"属性名1":"属性值1" , "属性名2":"属性值2"}
- 多个对象
- [{"属性名1":"属性值1" , "属性名2":"属性值2"} , {"属性名1":"属性值1" , "属性名2":"属性值2"}]
- 解释
- a.数据在键值对里面
- b.数据之间由逗号分隔
- c.大括号保存对象
- d.中括号保存数组
- e.Json值
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
jackson使用(使用jar包)
作用
- 将对象转换为json字符串
- 将json字符串转换为对象
- 将json字符串转换为对象
- 创建对象
- ObjectMapper objectMapper = new ObjectMapper();
- 将对象转化为json字符串的方法。
- String jsonStr1 = objectMapper.writeValueAsString(p1);(可以是对象、list集合、map集合)
- 将json字符串转化为java对象的方法
- Province province = objectMapper.readValue(jsonStr, Province.class);参数为json字符串和要转换的Class类型
- ObjectMapper objectMapper = new ObjectMapper();
- 将对象转化为json字符串的方法。
- String jsonStr1 = objectMapper.writeValueAsString(p1);(可以是对象、list集合、map集合)
- 将json字符串转化为java对象的方法
- Province province = objectMapper.readValue(jsonStr, Province.class);参数为json字符串和要转换的Class类型
Ajax
概述
ajax:Asynchronous javascript and xml,异步JavaScript和Xml
作用
局部刷新页面
发起异步请求
同异步请求的区别
- 同步请求:当一个页面中的内容发生改变时,需要全部刷新。当一个请求发起时,其他的请求不能发起
- 异步请求,当一个页面中的内容发生改变时,可以局部刷新。当一个请求发起时,其他的请求也能发起
- 异步请求,当一个页面中的内容发生改变时,可以局部刷新。当一个请求发起时,其他的请求也能发起
.XMLHttpRequest对象概述
常用属性
onreadstatechange
用于监听异步请求对象状态(readyState)改变
status
服务器响应状态码
readyState
异步请求对象的状态
- 0:异步请求对象还没有初始化完成
- 1:开始发起请求
- 2:发起请求完成
- 3:开始读取服务器的响应
- 4:读取服务器响应完成
- 1:开始发起请求
- 2:发起请求完成
- 3:开始读取服务器的响应
- 4:读取服务器响应完成
responseText
响应正文
常用方法
open
flag:为true就是异步请求;否则为同步请求
send
发送参数
setRequestHeader
- 设置请求头
- 设置请求头
Ajax入门案例(get请求)
开发流程:
- 创建异步请求对象
- 监听异步请求对象状态改变
- 判断服务器响应状态码为200
- 判断异步请求对象状态为4
- 打开连接
- 设置请求方式
- 设置请求路径
- 设置异步请求
- 发送参数
- 创建异步请求对象
- 监听异步请求对象状态改变
- 判断服务器响应状态码为200
- 判断异步请求对象状态为4
- 打开连接
- 设置请求方式
- 设置请求路径
- 设置异步请求
- 发送参数
Ajax入门案例(post请求)
开发流程:
- 创建异步请求对象
- 监听异步请求对象状态改变
- 判断服务器响应状态码为200
- 判断异步请求对象状态为4
- 打开连接
- 设置请求方式
- 设置请求路径
- 设置异步请求
- 设置请求头Content-Type
- xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
- 发送参数
- 创建异步请求对象
- 监听异步请求对象状态改变
- 判断服务器响应状态码为200
- 判断异步请求对象状态为4
- 打开连接
- 设置请求方式
- 设置请求路径
- 设置异步请求
- 设置请求头Content-Type
- xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
- 发送参数
BOM对象
browser object model 浏览器对象模型
分类:
window
子主题
location
history
navigator
screen
window
作用
跳转页面
获取其他bom对象
显示警告框
显示确认框
显示输入框
关闭页面
属性
location
设置跳转页面路径
常用方法:
- alert:
- 显示警告框
- confirm:
- 显示确认框
- prompt:
- 显示输入框
- close:
- 关闭页面
- 注意:close方法:Scripts may close only the windows that were opened by it,能够关闭的页面是由该页面打开的其他页面。
- setinterval:设置重复动作
- clearinterval:清除重复动作
- setTimeout:设置延迟动作
- clearTimeout:清除延迟动作
- 显示警告框
- confirm:
- 显示确认框
- prompt:
- 显示输入框
- close:
- 关闭页面
- 注意:close方法:Scripts may close only the windows that were opened by it,能够关闭的页面是由该页面打开的其他页面。
- setinterval:设置重复动作
- clearinterval:清除重复动作
- setTimeout:设置延迟动作
- clearTimeout:清除延迟动作
setInterval、setTimeout
setInterval(code,millisec):设置重复动作
- code:重复调用的代码(方法)
- millisec:重复间隔时间,单位为毫秒
- 返回值是重复对象
- millisec:重复间隔时间,单位为毫秒
- 返回值是重复对象
clearInterval(id_of_setinterval):清除重复动作
id_of_setinterval:重复对象的id
setTimeout(code,millisec):设置延迟动作
- code:延迟调用的代码
- millisec:延迟时间
- 返回值是延迟对象
- millisec:延迟时间
- 返回值是延迟对象
clearTimeout(id_of_settimeout):请求延迟动作
id_of_settimeout:延迟对象的id
Location对象
Location对象包含有关当前URL的信息
属性
href
设置返回完整的URL
方法
reload
重新加载所在页面
History对象
History对象包含用户
常用方法
back
加载history列表中的前一个URL
forward
加载history列表中的下一个URL
go
- 加载 history 列表中的某个具体页面。
- go(-1):相当于back方法
- go(1):相当于forward方法
- go(-1):相当于back方法
- go(1):相当于forward方法
Xml DOM对象
概念:dom : document object model:文档对象模型
Xml DOM:
既可以操作xml文件,也可以操作html文件
Html DOM:
只能操作html文件
根据bookstore.xml会生成上图所示的dom树型结构图
Xml DOM(Document对象)
概述:
- Document 对象是一棵文档树的根,可为我们提供对文档数据的最初(或最顶层)的访问入口。(整个文档对象)]()
- Document 对象是一棵文档树的根,可为我们提供对文档数据的最初(或最顶层)的访问入口。(整个文档对象)]()
作用
- 创建元素节点、文本节点、属性节点、注释节点
- 获取元素节点
- 获取元素节点
方法
- createElement:创建元素节点对象
- createTextNode:创建文本节点对象
- getElementById:根据id获取元素节点对象
- getElementsByTagName:根据标签名获取一组元素节点对象
- createTextNode:创建文本节点对象
- getElementById:根据id获取元素节点对象
- getElementsByTagName:根据标签名获取一组元素节点对象
Xml DOM(Element对象)
Element 对象表示 XML 文档中的元素。元素可包含属性、其他元素或文本。如果元素含有文本,则在文本节点中表示该文本。
作用
- 操作该元素中的属性节点
- 操作该元素中的子元素节点
- 操作该元素中的文本节点
- 操作该元素中的子元素节点
- 操作该元素中的文本节点
常用方法
- getAttribute:返回指定属性的值
- setAttribute:设置属性值
- remove:移除指定属性的值
- setAttribute:设置属性值
- remove:移除指定属性的值
Xml DOM(Node对象)
概念
- Node对象是整个DOM的主要数据类型
- Node对象可以是元素节点、属性节点、文本节点
- Node对象可以是元素节点、属性节点、文本节点
属性
- childNodes:返回节点到子节点的节点列表。
- firstChild:返回节点的首个子节点。
- lastChild:返回节点的最后一个子节点。
- parentNode:返回节点的父节点。
- firstChild:返回节点的首个子节点。
- lastChild:返回节点的最后一个子节点。
- parentNode:返回节点的父节点。
- nodeName: 属性可返回节点的名称,根据其类型。
- nodeValue 属性可设置或返回某节点的值,根据其类型。
- nodeType:返回节点的类型。
- nodeValue 属性可设置或返回某节点的值,根据其类型。
- nodeType:返回节点的类型。
nodeType
- 1:元素
- 2:属性
- 3:文本
- 4:注释
- 5:文档
- 2:属性
- 3:文本
- 4:注释
- 5:文档
常用方法:
- appendChild:在节点的子节点列表后添加子节点
- removeChild:删除(并返回)当前节点的指定子节点。
- removeChild:删除(并返回)当前节点的指定子节点。
Html DOM
概念
- HTML DOM 定义了访问和操作HTML文档的标准方法。
- HTML DOM 把 HTML 文档呈现为带有元素、属性和文本的树结构(节点树)。
- HTML DOM 把 HTML 文档呈现为带有元素、属性和文本的树结构(节点树)。
document对象:
- getElementById
- getElementByTagName
- getElementsByClassName()
- getElementByTagName
- getElementsByClassName()
innerHTML、innerText(操作文本节点):
- innerHtml:用于往标签中插入内容(包含html标签)、解析html标签,可以使用html标签
- innerText:用于往标签中插入内容(包含html标签)、不能解析html标签,不可以使用html标签
- innerText:用于往标签中插入内容(包含html标签)、不能解析html标签,不可以使用html标签
innerHTML、innerText,与createTextNode的区别:
- innerText和innerHtml只能添加一次,而且会替换原有的内容。
- createTextNode可以在后面无线追加,不会替换原有的内容。
- createTextNode可以在后面无线追加,不会替换原有的内容。
Html Dom操作html标签
- 1.获取元素标签:document.getElementsByName("username")[0]; 或:document.getElementById("username");
- 2.ele.value获得标签中的内容==
- 3.ele.value="值",设置标签的值
- 2.ele.value获得标签中的内容==
- 3.ele.value="值",设置标签的值
Html DOM 操作Html样式(style)
- ele.style.border="10px solid green":设置边框的样式
- ele.style.width = "200px":设置边框的宽度
- ele.style.fontSize = "50px":设置字体大小
- ele.style.width = "200px":设置边框的宽度
- ele.style.fontSize = "50px":设置字体大小
Html DOM其他标签用法
Select
- selectedIndex:设置或返回下拉列表中被选项目的索引号(下标),用作获得显示在页面的value和text。
- add(option,before):向 <select> 添加一个 <option> 元素,如果第二个参数为before,插入到第一个,为null,插入到最后一个。
- remove(index) :用于从下拉列表删除选项,index为索引号。
- add(option,before):向 <select> 添加一个 <option> 元素,如果第二个参数为before,插入到第一个,为null,插入到最后一个。
- remove(index) :用于从下拉列表删除选项,index为索引号。
option:
- text:设置或返回选项的文本值
- value:设置或返回被送往服务器的值。
- selected:设置或返回选项的 selected 属性的值,为true表示被选中
- value:设置或返回被送往服务器的值。
- selected:设置或返回选项的 selected 属性的值,为true表示被选中
Checkbox:
- checked:设置或返回 checkbox 是否应被选中,为true时被选中
- name :设置或返回 checkbox 的名称。
- value:设置或返回 checkbox 的 value 属性的值
- name :设置或返回 checkbox 的名称。
- value:设置或返回 checkbox 的 value 属性的值
Button:
- disabled: 属性可设置或返回是否禁用按钮,为true时禁用
- value :设置或返回显示在按钮上的文本。
- value :设置或返回显示在按钮上的文本。
Jquery
为什么要自定义myjs脚本库
原始的js操作,相对来说,比较复杂;可以将一些重复的动作,抽取出来,并建立一个新的脚本库
Jquery介绍
Jquery是什么?
JQuery是一个JS的类库文件
Jquery的作用?
可以简化遍历HTML文 档、操作DOM、处理事件、执行动画、开发Ajax等操作
Jquery的诞生
- 2006年8月诞生的一个开源项目,现在Jquery团队主要包括核心库,UI和插件开发等. 开发人员,凭借简洁的语法和跨平台的兼容性.
- 其独特而又优雅的代码风格改变了 javascript程序员的设计思路和编写程序的方式
- 其独特而又优雅的代码风格改变了 javascript程序员的设计思路和编写程序的方式
jquery的基本使用
开发流程
1. 导入jquery的js文件到项目中
2. 在页面使用script标签引入外部的jquery文件
3. 使用jquery语法操作元素
2. 在页面使用script标签引入外部的jquery文件
3. 使用jquery语法操作元素
js对象与jquery对象
注意:
- jquery对象不能够使用js对象的属性和方法
- js对象也不能使用jquery对象的属性和方法
- js对象也不能使用jquery对象的属性和方法
jquery对象与js对象相互转换
js对象-->jquery对象:
- $(js对象)
jquery对象-->js对象:
- jquery对象.get(0);
- jquery对象[0];
- $(js对象)
jquery对象-->js对象:
- jquery对象.get(0);
- jquery对象[0];
jquery选择器
jquery选择器介绍及分类
概念
- jquery操作都需要依赖于选择器
- 可以让jquery代码锁定指定的元素
- 不仅能简化代码,而且可以达到事半功倍的效果
- 可以让jquery代码锁定指定的元素
- 不仅能简化代码,而且可以达到事半功倍的效果
分类:
- 基本选择器
- 层次选择器
- 过滤选择器
- 基本过滤选择器
- 内容过滤选择器
- 属性过滤选择器
- 子元素过滤选择
- 层次选择器
- 过滤选择器
- 基本过滤选择器
- 内容过滤选择器
- 属性过滤选择器
- 子元素过滤选择
jquery选择器之基本选择器
- id选择器:$("#id")
- class选择器:$(".class")
- 元素选择器:$("元素名")
- 通配符选择器:$("*")
- class选择器:$(".class")
- 元素选择器:$("元素名")
- 通配符选择器:$("*")
jquery选择器之层次选择器
从父子关系、兄弟关系来选择页面上节点
- $("a b"):获取节点a下的所有的节点b包括子节点的子节点
- $("a > b"):获取节点a下的所有的子节点b
- $("a + b"):获取节点a的下一个兄弟节点b
- $("a ~ b"):获取节点a的所有兄弟节点b
- $("a > b"):获取节点a下的所有的子节点b
- $("a + b"):获取节点a的下一个兄弟节点b
- $("a ~ b"):获取节点a的所有兄弟节点b
过滤选择器
选择器之基本过滤选择器
从位置的角度来对页面的标签进行过滤选择
- $("tagName:first"):
- 选择第一个tagName标签
- $("tagName:last"):
- 选择最后一个tagName标签
- $("tagName:eq(2)"):
- 选择脚标为2的tagName标签
- $("tagName:gt(2)"):
- 选择脚标大于2的tagName标签
- $("tagName:lt(2)"):
- 选择脚标小于2的tagName标签
- $("tagName:odd"):
- 选择脚标为奇数的tagName标签
- $("tagName:even"):
- 选择脚标为偶数的tagName标签
- $('dom:not(.one)')
- 选择class不为one的所有div元素
- 选择第一个tagName标签
- $("tagName:last"):
- 选择最后一个tagName标签
- $("tagName:eq(2)"):
- 选择脚标为2的tagName标签
- $("tagName:gt(2)"):
- 选择脚标大于2的tagName标签
- $("tagName:lt(2)"):
- 选择脚标小于2的tagName标签
- $("tagName:odd"):
- 选择脚标为奇数的tagName标签
- $("tagName:even"):
- 选择脚标为偶数的tagName标签
- $('dom:not(.one)')
- 选择class不为one的所有div元素
jquery选择器之内容过滤选择器
从内容来对页面的标签进行过滤选择
- $("tagName:contains('aaa')")
- 选中内容包含"aaa"的tagName元素
- $("tagName:empty")
- 选中没有任何内容的tagName元素
- $("tagName:has(.one)")
- tagName中是否包含一个class为one的子元素,如果有就选中tagName
- 选中内容包含"aaa"的tagName元素
- $("tagName:empty")
- 选中没有任何内容的tagName元素
- $("tagName:has(.one)")
- tagName中是否包含一个class为one的子元素,如果有就选中tagName
jqeury选择器之属性过滤选择器
从属性的角度来对页面的标签进行过滤选择
- $("tagName[id]"):
- 选取含有属性id的tagName元素
- $("tagName[id='cc']"):
- 选取属性id值为"cc"的tagName元素
- $("tagName[id!='cc']"):
- 选取属性id值不为"cc"的tagName元素
- $("tagName[title^='cc']"):
- 选取属性id值以"cc"开头的tagName元素
- $("tagName[title$='cc']"):
- 选取属性id值以"cc"结束的tagName元素
- $("tagName[title*='cc']")
- 选取属性id值包含"cc"的tagName元素
- $("tagNametitle*='cc'[id!='ff']");
- 选取title属性包含"cc",name属性值为"e",id属性值不为"ff"的tagName
- 选取含有属性id的tagName元素
- $("tagName[id='cc']"):
- 选取属性id值为"cc"的tagName元素
- $("tagName[id!='cc']"):
- 选取属性id值不为"cc"的tagName元素
- $("tagName[title^='cc']"):
- 选取属性id值以"cc"开头的tagName元素
- $("tagName[title$='cc']"):
- 选取属性id值以"cc"结束的tagName元素
- $("tagName[title*='cc']")
- 选取属性id值包含"cc"的tagName元素
- $("tagNametitle*='cc'[id!='ff']");
- 选取title属性包含"cc",name属性值为"e",id属性值不为"ff"的tagName
jquery选择器之子元素过滤选择器
从父子关系对标签进行过滤选择
- $("tagName :nth-child(2)"):
- tagName元素下的第二个子元素(脚标从1开始)
- $("tagName :first-child"):
- tagName元素下的第一个子元素
- $("tagName :last-child"):
- tagName元素下的最后一个子元素
- $("tagName :only-child"):
- tagName元素下的仅仅只有一个子元素,那么选中这个子元素
- tagName元素下的第二个子元素(脚标从1开始)
- $("tagName :first-child"):
- tagName元素下的第一个子元素
- $("tagName :last-child"):
- tagName元素下的最后一个子元素
- $("tagName :only-child"):
- tagName元素下的仅仅只有一个子元素,那么选中这个子元素
jquery的dom操作
常用方法
- html()
- 设置/获取标签内容,解析html标签,相当于innerHTML
- text()
- 设置/获取标签内容,不解析html标签,相当于innerText
- val()
- 设置/获取value属性值,相当于value属性
- attr()
- 设置/获取属性值,相当于setAttribute/getAttribute
- removeAttr()
- 移除属性,相当于removeAttribute
- 设置/获取标签内容,解析html标签,相当于innerHTML
- text()
- 设置/获取标签内容,不解析html标签,相当于innerText
- val()
- 设置/获取value属性值,相当于value属性
- attr()
- 设置/获取属性值,相当于setAttribute/getAttribute
- removeAttr()
- 移除属性,相当于removeAttribute
jquery事件
jQuery 事件处理函数是 jQuery 中的核心函数。
_jquery事件(监听页面加载完成)
完整版:
- $(document).ready(function () { })
简化版:
- $(function () { }
- $(document).ready(function () { })
简化版:
- $(function () { }
jquery事件(事件绑定)
- 方式一:
- jquery对象.事件名(function(){ });
- jquery对象.事件名(function(){ });
- 方式二:
- jquery对象.bind("事件名",function(){ });
- jquery对象.bind("事件名",function(){ });
jquery遍历
方式一
方式一:内置对象this:当前元素对象,是一个js对象
- jquery数组对象.each(function(index,element){ });
- element是**js对象**
- jquery数组对象.each(function(index){ });
- 用this代替element
- jquery数组对象.each(function(index,element){ });
- element是**js对象**
- jquery数组对象.each(function(index){ });
- 用this代替element
方式二
方式二:内置对象this:当前元素对象,是一个js对象
- $.each(jquery数组对象,function(index,element){ });
- element是**js对象**
- $.each(jquery数组对象,function(index){ });
- 用this代替element
- $.each(jquery数组对象,function(index,element){ });
- element是**js对象**
- $.each(jquery数组对象,function(index){ });
- 用this代替element
jquery异步请求
- jQuery 提供了供 AJAX 开发的丰富函数(方法)库。
- 通过 jQuery AJAX,使用 HTTP Get 和 HTTP Post,您都可以从远程服务器请求 TXT、HTML、XML 或 JSON。
- 通过 jQuery AJAX,使用 HTTP Get 和 HTTP Post,您都可以从远程服务器请求 TXT、HTML、XML 或 JSON。
jquery异步请求之get
$.get(url,data,callback,type)
- url
- 请求服务器资源的路径
- data
- 请求参数,遵守json格式(键值对)
- callback
- 请求成功后,回调的函数
- type
- 服务器响应给浏览器的数据类(html,xml,json,jasonp,script,text)
- url
- 请求服务器资源的路径
- data
- 请求参数,遵守json格式(键值对)
- callback
- 请求成功后,回调的函数
- type
- 服务器响应给浏览器的数据类(html,xml,json,jasonp,script,text)
jquery异步请求之post
$.post(url,data,callback,type)
- url
- 请求服务器资源的路径
- data
- 请求参数,遵守json格式(键值对)
- callback
- 请求成功后,回调的函数
- type
- 服务器响应给浏览器的数据类型(html,xml,json,jasonp,script,text)
- url
- 请求服务器资源的路径
- data
- 请求参数,遵守json格式(键值对)
- callback
- 请求成功后,回调的函数
- type
- 服务器响应给浏览器的数据类型(html,xml,json,jasonp,script,text)
Json工具类
- 将java对象转换成json字符串
- 将json字符串响应到浏览器
- response.setContentType("json/application;charset=utf-8");
- 服务器告诉浏览器,响应正文是json字符串,浏览器应该以utf-8对响应正文进行解码
- 将json字符串响应到浏览器
- response.setContentType("json/application;charset=utf-8");
- 服务器告诉浏览器,响应正文是json字符串,浏览器应该以utf-8对响应正文进行解码
jquery异步请求之ajax
- $.ajax(options) 是低层级 AJAX 函数的语法。
- $.ajax 提供了比高层级函数更多的功能,但是同时也更难使用。
- option 参数设置的是 name|value 对,定义 url 数据、密码、数据类型、过滤器、字符集、超时以及错误函数。
- $.ajax 提供了比高层级函数更多的功能,但是同时也更难使用。
- option 参数设置的是 name|value 对,定义 url 数据、密码、数据类型、过滤器、字符集、超时以及错误函数。
属性
属性
- async
- 设置是否为异步请求
- contentType
- 设置请求头Content-Type,默认值:”application/x-www-form-urlencoded“
- data(常用)
- 请求参数
- dataType(常用)
- 响应正文的数据类型(html,xml,json,jasonp,script,text)
- complete(XHR, TS)
- 请求完成的回调函数
- error
- 请求失败的回调函数
- success(常用)
- 请求成功的回调函数
- timeout
- 设置请求延迟时间
- type(常用)
- 请求方式(Get/Post)
- url(常用)
- 请求路径
- xhr
- 获取异步请求对象
- async
- 设置是否为异步请求
- contentType
- 设置请求头Content-Type,默认值:”application/x-www-form-urlencoded“
- data(常用)
- 请求参数
- dataType(常用)
- 响应正文的数据类型(html,xml,json,jasonp,script,text)
- complete(XHR, TS)
- 请求完成的回调函数
- error
- 请求失败的回调函数
- success(常用)
- 请求成功的回调函数
- timeout
- 设置请求延迟时间
- type(常用)
- 请求方式(Get/Post)
- url(常用)
- 请求路径
- xhr
- 获取异步请求对象
顺序
顺序:
1. type
2. url
3. data
4. success
5. dataType
1. type
2. url
3. data
4. success
5. dataType
常用属性
常用属性
- data、dataType、success、type、url
- data、dataType、success、type、url
BootStarp
概念:
介绍
- Bootstrap是一个前端框架,由Twitter开发,非常受欢迎。
- Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。
- Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。
框架
相当于半成品;开发人员基于框架可以进行二次开发,大大的节省开发人员的开发时间。
特点
- 定义了很多的css样式和js插件。我们开发人员直接可以使用这些样式和插件得到丰富的 页面效果
- 支持响应式布局,写一套页面就可以在不同分辨率的设备上有比较好的效果。
- 支持响应式布局,写一套页面就可以在不同分辨率的设备上有比较好的效果。
流程
- 下载Bootstrap的相关资源
- https://www.bootcss.com/
- 将bootstrap资源导入到项目
-
- 将bootstrap资源导入到页面
- 导入bootstrap.css样式文件
- 导入jquery.js类库文件
- 导入boostrap.js类库文件
- https://www.bootcss.com/
- 将bootstrap资源导入到项目
-
- 将bootstrap资源导入到页面
- 导入bootstrap.css样式文件
- 导入jquery.js类库文件
- 导入boostrap.js类库文件
Bootstrap之响应式布局
概念
Bootstrap 提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列。
组成
- 栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局,你的内容就可以放入这些创建好的布局中。
- 栅格系统容器包含行;行包含列,列包含内容
- 栅格系统容器:
- container不铺满
- container-fluid铺满
- 行
- row
- 列
- col(col-lg、col-md、col-sm、col-xs)
- 栅格系统容器包含行;行包含列,列包含内容
- 栅格系统容器:
- container不铺满
- container-fluid铺满
- 行
- row
- 列
- col(col-lg、col-md、col-sm、col-xs)
网址:https://www.bootcss.com/
BootStarpValidator
概念:
- 基于前端框架的表单校验,可以提升用户使用体验
- Bootstrap Validator是基于Bootstrap、jquery组成。
- Bootstrap Validator是基于Bootstrap、jquery组成。
引入需要的相关资源:
- 引入bootstrap.css
- 引入bootstrapValidator.css
- 引入jquery.js
- 引入bootstrap.js
- 引入bootstrapValidator.js
- 引入bootstrapValidator.css
- 引入jquery.js
- 引入bootstrap.js
- 引入bootstrapValidator.js
给需要表单校验的字段加上div(class="form-group")
script操作
- 加载页面
通过表单去获得bootstrapValidator : $("#myForm").bootstrapValidator({ })
- message: 设置提示信息
- fields:{ }: 设置要校验的字段集合
- fields:{ }: 设置要校验的字段集合
username:{ 字段名
validators:{ 验证的规则
notEmpty:{ 不能为空
},
stringLength:{ 长度验证
min:6,
max:10
},
regexp:{ 正则表达式
regexp: /^[a-z0-9]{6,10}$/
}
}
},
validators:{ 验证的规则
notEmpty:{ 不能为空
},
stringLength:{ 长度验证
min:6,
max:10
},
regexp:{ 正则表达式
regexp: /^[a-z0-9]{6,10}$/
}
}
},
- 其他的验证格式
- different: { 两次输入不能相同
message: "账户和密码不能一致",
field: "username" 不能相同的属性
}
identical: { 两次输入必须相同
message: "两次密码不一致",
field: "password" 相同的属性
}
emailAddress: { 邮箱固定的格式
message: "邮箱格式不对"
}
- different: { 两次输入不能相同
message: "账户和密码不能一致",
field: "username" 不能相同的属性
}
identical: { 两次输入必须相同
message: "两次密码不一致",
field: "password" 相同的属性
}
emailAddress: { 邮箱固定的格式
message: "邮箱格式不对"
}
Echarts
介绍
ECharts 是一款由百度前端技术部开发的,基于 Javascript 的数据可视化图表库,提供直 观,生动,可交互,可个性化定制的数据可视化图表。
https://echarts.apache.org/zh/index.html
步骤
引入Echarts资源:
<script src="echarts/echarts.min.js"></script>
<script src="js/jquery-3.2.1.min.js"></script>
<script src="js/jquery-3.2.1.min.js"></script>
定义具备宽高的Echarts容器
<div id="main" style="width: 600px;height: 400px">
初始化Echarts对象
$(function () {
<%--初始化echarts容器--%>
var myChart = echarts.init(document.getElementById('main'));
var option = {
<%--..样式.--%>
};
<%--设定echarts的属性--%>
eCharts.setOption(option);
})
<%--初始化echarts容器--%>
var myChart = echarts.init(document.getElementById('main'));
var option = {
<%--..样式.--%>
};
<%--设定echarts的属性--%>
eCharts.setOption(option);
})
设置Echarts属性
<%--设定echarts的属性--%>
eCharts.setOption(option);
eCharts.setOption(option);
分类
折线图
饼状图
异步加载
异步请求服务器中的数据,并将该数据设置到Echarts容器中
xAxis: {
type: 'category',
data: data.list1
},
type: 'category',
data: data.list1
},
PowerDesigner
概述
介绍
- PowerDesigner是Sybase公司的一款设计软件
- 使用它可以方便地对系统进行分析设计,他几乎包 括了数据库模型设计的全过程
- 利用PowerDesigner可以制作数据流程图、概念数据模型、物理 数据模型、面向对象模型。
- 使用它可以方便地对系统进行分析设计,他几乎包 括了数据库模型设计的全过程
- 利用PowerDesigner可以制作数据流程图、概念数据模型、物理 数据模型、面向对象模型。
作用
- 在项目设计阶段通常会使用PowerDesigner进行数据库设计。
- 建立概念数据模型,便于和非专业人员进行业务上的沟通
- 建立物理数据模型,可以用来生成对应的库表
- 建立概念数据模型,便于和非专业人员进行业务上的沟通
- 建立物理数据模型,可以用来生成对应的库表
概念数据模型
数据模型是现实世界中数据特征的抽象。数据模型应该满足三个方面的要求:
- 能够比较真实地模拟现实世界
- 容易被人理解
- 便于计算机实现
- 容易被人理解
- 便于计算机实现
介绍
- Conceptual Data Model:概念数据模型
- 概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对 这一理论进行了扩充。它从用户的观点出发对信息进行建模,主要用于数据库的概念级设计。
- 概念数据模型是现实世界到信息世界的第一层抽象,主要是在高水平和面向业务的角度对信息的 一种描述,通常作为业务人员和技术人员之间沟通的桥梁。作为现实世界的概念化结构,这种数 据模型使得数据库的设计人员在最初的数据库设计阶段将精力集中在数据之间的联系上,而不用 同时关注数据的底层细节
- 概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对 这一理论进行了扩充。它从用户的观点出发对信息进行建模,主要用于数据库的概念级设计。
- 概念数据模型是现实世界到信息世界的第一层抽象,主要是在高水平和面向业务的角度对信息的 一种描述,通常作为业务人员和技术人员之间沟通的桥梁。作为现实世界的概念化结构,这种数 据模型使得数据库的设计人员在最初的数据库设计阶段将精力集中在数据之间的联系上,而不用 同时关注数据的底层细节
关系
0~1
1
0~n
1~n
物理数据模型
介绍
- Physical Data Model:物理数据模型
- 是概念数据模型和逻辑数据模型在计算机中的具体表示。
- 该模型描述了数据在物理存储介质上的 具体组织结构,不但与具体的数据库管理系统相关,同时还与具体的操作系统以及硬件有关,但 是很多工作都是由DBMS自动完成的,用户所要做的工作其实就是添加自己的索引等结构即可。
- 是概念数据模型和逻辑数据模型在计算机中的具体表示。
- 该模型描述了数据在物理存储介质上的 具体组织结构,不但与具体的数据库管理系统相关,同时还与具体的操作系统以及硬件有关,但 是很多工作都是由DBMS自动完成的,用户所要做的工作其实就是添加自己的索引等结构即可。
关系
一对一
一对多
多对多
转换
物理数据模型生成sql语句
更改数据库类型
物理数据模型转换为概念数据模型
概念数据模型转换为物理数据模型
powerDesigner
概念:
通过sql脚本去生成物理数据模型
步骤
File ->reverse engineer
多表设计
分类
一对一
- 用一张表的主键指向另一张表的主键
- 主键作为外键约束
- 主键作为外键约束
一对多
- 在多的一方添加一个字段,指向一的一方的主键
- 如果要保证数据的完整性,还需要将该字段作为外键约束
- 如果要保证数据的完整性,还需要将该字段作为外键约束
多对多
- 添加一个中间表
- 将这个中间表作为多的一方,另外两张表作为一的一方。
- 将一个多对多的关系拆分成两个一对多的关系!
- 将这个中间表作为多的一方,另外两张表作为一的一方。
- 将一个多对多的关系拆分成两个一对多的关系!
注意事项
在表被污染的时候不能设置外键
设置外键的两种方式(sql语句)
在创建时设置:CONSTRAINT 名字 FOREIGN KEY(本表的列名) REFERENCES 表名(列名)
修改时设置:ALTER TABLE 表名 ADD FOREIGN KEY(本表的列名) REFERENCES 表名(列名);
修改时设置:ALTER TABLE 表名 ADD CONSTRAINT 名字 FOREIGN KEY (本表的列名) REFERENCES 表名 (列名) ;
修改时设置:ALTER TABLE 表名 ADD FOREIGN KEY(本表的列名) REFERENCES 表名(列名);
修改时设置:ALTER TABLE 表名 ADD CONSTRAINT 名字 FOREIGN KEY (本表的列名) REFERENCES 表名 (列名) ;
多表查询
内连接查询
显式内连接
select * from 表A inner join 表B on 条件;
隐式内连接
select * from 表A , 表B where 条件;
外连接查询
左外连接查询
select * from 表A left outer join 表B on 条件;
以左边表为基准,左边表全部都会被查到
右外连接查询
select * from 表A right outer join 表B on 条件;
以右边表为基准,右边表全部都会被查到
0 条评论
下一页