JAVAweb
2021-01-14 09:12:04 0 举报
AI智能生成
javaWeb知识点梳理超级详细
作者其他创作
大纲/内容
JDBC
使用客户端工具访问数据库,需要手工建立链接,输入用户名和密码登录,编写SQL语句,点击执行,查看操作结果(结果集或受影响行数)。
什么是JDBC?
JDBC(Java DataBase Connectivity) Java连接数据库,可以使用Java语言连接数据库完成CRUD操作
JDBC核心思想
Java中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。
由数据库厂商提供驱动实现类(Driver数据库驱动)
由数据库厂商提供驱动实现类(Driver数据库驱动)
JDBC API
类型
全限定名
简介
class
java.sql.DriverManager
管理多个数据库驱动类,提供了获取数据库连接的方法
interface
java.sql.Connection
代表一个数据库连接(当Connection不是NULL时,表示已连接一个数据库)
interface
java.sql.Statement
发送SQL语句到数据库的工具
interface
java.sql.ResultSet
保存SQL查询语句的结果数据(结果集)
class
java.sql.SQLException
处理数据库应用程序时所发生的异常
全限定名
简介
class
java.sql.DriverManager
管理多个数据库驱动类,提供了获取数据库连接的方法
interface
java.sql.Connection
代表一个数据库连接(当Connection不是NULL时,表示已连接一个数据库)
interface
java.sql.Statement
发送SQL语句到数据库的工具
interface
java.sql.ResultSet
保存SQL查询语句的结果数据(结果集)
class
java.sql.SQLException
处理数据库应用程序时所发生的异常
JDBC开发步骤【重点】
1.使用Class.forName("com.mysql.jdbc.Driver"); 手动加载字节码文件到JVM中
2. 连接数据库
通过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
3.获取发送SQL的对象
Statement statement = connection.createStatement();
4.执行SQL语句
编写SQL语句,并执行,接收执行后的结果
- 注意:在编写DML语句时,一定要注意字符串参数的符号是单引号 '值'
- DML语句:增、删、改时,执行的结果是受影响行数(int类型)。
- DQL语句:查询时,返回的是数据结果集(ResultSet结果集)
- DML语句:增、删、改时,执行的结果是受影响行数(int类型)。
- DQL语句:查询时,返回的是数据结果集(ResultSet结果集)
5.处理结果
6.释放资源
遵循的是先开后关的原则,释放过程中用到的所有资源对象
ResultSet(结果集)
在执行查询SQL后,存放查询到的结果集数据
ResultSet rs = statement.executeQuery(sql)
遍历ResultSet中的数据
ResultSet以表(Table)结构进行临时结果的存储,需要通过JDBC API将其中的数据进行依次获取
- 数据行指针:初始位置在第一行数据前,每调用一次boolean next()方法,ResultSet中指针向下移动一行,结果为true,表示当前行有数据
- rs.getXxx("列名"); 根据列名获得数据
- rs.getXxx(整数下标); 代表根据列的编号顺序获得!从1开始
- 数据行指针:初始位置在第一行数据前,每调用一次boolean next()方法,ResultSet中指针向下移动一行,结果为true,表示当前行有数据
- rs.getXxx("列名"); 根据列名获得数据
- rs.getXxx(整数下标); 代表根据列的编号顺序获得!从1开始
PreparedStatement【重点】
PreparedStatement接口继承了Statement接口。执行SQL语句的方法没有区别!
PreparedStatement的应用
作用:1.预编译SQL语句,效率高!
2.安全,避免SQL注入
3.可以动态的填充数据,执行多个同构的SQL语句
2.安全,避免SQL注入
3.可以动态的填充数据,执行多个同构的SQL语句
pstmt.setXxx(下标,值); 参数下标是从1开始,为指定占位符下标绑定值
注意:PreparedStatement应用时,SQL字符串的参数都由?符号站位,被称为参数标记。在执行该SQL语句前,要为每个?参数赋值
ORM
ORM(Object Relational Mapping)
从数据库查询到的结果集(ResultSet)在进行遍历时,逐行遍历,取出的都是零散的数据。在实际应用开发中,我们需要将零散的数据进行封装整理
从数据库查询到的结果集(ResultSet)在进行遍历时,逐行遍历,取出的都是零散的数据。在实际应用开发中,我们需要将零散的数据进行封装整理
ORM 实体类(entity):零散数据的载体
- 一行数据中,多个零散的数据进行整理
- 通过entity的规则对表中的数据进行对象的封装
- 表名=类名;列名=属性名;提供各个属性的get、set方法
- 提供无参构造方法、(视情况添加有参构造)
- 通过entity的规则对表中的数据进行对象的封装
- 表名=类名;列名=属性名;提供各个属性的get、set方法
- 提供无参构造方法、(视情况添加有参构造)
DAO(Data Access Object)
数据访问对象
- 将所有对同一张表的操作都封装在一个XXXDaoImpl对象中。
- 根据增删改查的不同功能,实现具体的方法(insert,update,delete,select,selectAll)
- 经验:对于任何一张表中的数据进行操作时,无非就是增、删、改、查。应将对于一张表的所有操作统一封装在一个数据访问对象中。重用
- 根据增删改查的不同功能,实现具体的方法(insert,update,delete,select,selectAll)
- 经验:对于任何一张表中的数据进行操作时,无非就是增、删、改、查。应将对于一张表的所有操作统一封装在一个数据访问对象中。重用
日期类型
java.util.Date
- Java语言常规应用层面的日期类型。可以通过字符串创建对应的时间对象
- 无法直接通过JDBC插入数据库
- Java语言常规应用层面的日期类型。可以通过字符串创建对应的时间对象
- 无法直接通过JDBC插入数据库
- java.sql.Date
- 不可以通过字符串创建对应的时间对象。只能通过毫秒值创建对象(1970年1月1日至今的毫秒值)
- 可以直接通过JDBC插入数据库
- 不可以通过字符串创建对应的时间对象。只能通过毫秒值创建对象(1970年1月1日至今的毫秒值)
- 可以直接通过JDBC插入数据库
日期格式化工具
SimpleDateFormat 日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//按照指定格式转换成util.Date类型
java.util.Date date = sdf.parse("2000-01-01");
java.util.Date date = sdf.parse("2000-01-01");
连接池
自定义连接池
Java中提供了一个接口DataSource,通过实现该接口,可以创建连接池
用list结合来存储连接对象
Druid(德鲁伊)
- 创建database.properties 配置文件
- 引入druid-1.1.5.jar
- 引入druid-1.1.5.jar
注意:连接池中获得的Connection是DruidPooledConnection实现类,调用的close()方法不是关闭资源,而是将资源放回池中!
业务
概念:用户要完成的一个业务功能,是由一个或多个的DAO调用组成。
软件、程序提供的一个功能都叫业务
软件、程序提供的一个功能都叫业务
复用
- DAO数据访问操作复用
- 业务功能的复用 //不同的终端访问
- 业务功能的复用 //不同的终端访问
ThreadLocal
线程工具类:在整个线程中,一直到释放资源,用的是同一个Connection连接对象。
1、在整个线程(单条执行路径中)所持有的Map中,存储一个键(threadlocal)值(connection)对
2、线程(Thread)对象中持有一个ThreadLocalMap类型的对象(ThreadthreadLocals),threadLocals中保存了以ThreadLocal对象为Key,set进去的值为Value
3、每个线程均可绑定多个ThreadLocal,一个线程中可存储多个ThreadLocal
2、线程(Thread)对象中持有一个ThreadLocalMap类型的对象(ThreadthreadLocals),threadLocals中保存了以ThreadLocal对象为Key,set进去的值为Value
3、每个线程均可绑定多个ThreadLocal,一个线程中可存储多个ThreadLocal
三层架构设计
表示层
命名:xxxVIew
- 职责:收集用户的数据和需求、展示数据
- 职责:收集用户的数据和需求、展示数据
业务逻辑层
- 命名:XXXServiceImpl
- 职责:数据的加工处理、调用Dao组合完成业务实现、控制事务
- 职责:数据的加工处理、调用Dao组合完成业务实现、控制事务
数据访问层
- 命名:xxxDaoImpl
- 职责:向业务层提供数据,将业务层加工处理后的数据同步到数据库
- 职责:向业务层提供数据,将业务层加工处理后的数据同步到数据库
Apache的DbUtils使用
Commons DbUtils 是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能勾简化JDBC应用程序的开发!同时,不会影响程序的性能
DbUtils是Java编程中数据库操作实用小工具,小巧、简单、实用
- 对于数据表的查询操作,可以吧结果转换为List、Array、Set等集合。便于操作
- 对于数据表的DML操作,也变得很简单(只需要写SQL语句);
- 对于数据表的查询操作,可以吧结果转换为List、Array、Set等集合。便于操作
- 对于数据表的DML操作,也变得很简单(只需要写SQL语句);
DbUtils主要包含
ResultSetHandler接口:转换类型接口
- BeanHandler类:实现类,把一条记录转换成对象
- BeanListHandler类:实现类,把多条记录转换成List集合。
- ScalarHandler类:实现类,适合获取一行一列的数据。
- BeanHandler类:实现类,把一条记录转换成对象
- BeanListHandler类:实现类,把多条记录转换成List集合。
- ScalarHandler类:实现类,适合获取一行一列的数据。
QueryRunner:执行sql语句的类
- 增、删、改:update();
- 查询:query();
- 增、删、改:update();
- 查询:query();
new MapHandler()
将一条记录封装成map集合,列名为键,属性为值
适用于多表查询
搭配着BeanUtils使用
new MapListHandler()
将多条记录封装成一个list集合,集合内为每条数据封装的map集合为元素
搭配着BeanUtils使用
适用于多表查询
DbUtils的使用步骤
导入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特点
1、简易性:超文本标记语言的版本升级采用的超集方式。更加方便灵活
2、可扩展性:超文本标记语言采取的子类元素的方式,为系统扩展带来保证
3、平台无关性:
4、通用性:HTML是网络的通用语言,一种简单、通用的标记语言。
2、可扩展性:超文本标记语言采取的子类元素的方式,为系统扩展带来保证
3、平台无关性:
4、通用性:HTML是网络的通用语言,一种简单、通用的标记语言。
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的基本标签
标题标签
<h1>-<h6>
数字越小,标题文字越大!默认加粗、默认字号、默认占据一行
数字越小,标题文字越大!默认加粗、默认字号、默认占据一行
结构标签
html
head
body
容器标签
<div></div> : 块级标签,独占一行,自带换行
<span></span> : 行级标签,所有内容都在同一行
作用:<div>主要是结合css做页面分块 布局
<span>:进行友好提示信息的显示
<span>:进行友好提示信息的显示
链接标签
<a>文本或图片</a>
属性
href="跳转的地址"跳转外网需要添加协议
target:_self(当前文档)
_blank(新页面,会一直打开新的)
_search 之前打开的页面存在,则不打开新的页面,直接复用
name 充当锚点(顶部、底部)
需要为标签提供name属性,进行赋值
需要点击跳转的标签href属性给 #name
target:_self(当前文档)
_blank(新页面,会一直打开新的)
_search 之前打开的页面存在,则不打开新的页面,直接复用
name 充当锚点(顶部、底部)
需要为标签提供name属性,进行赋值
需要点击跳转的标签href属性给 #name
排版标签
注释标签:<!-- 注释 -->
换行标签:<br/>
段落标签:<p>文本文字</p>
特点:段落与段落之间有行高(行间距)自带换行
属性:文本对齐方式 align (left、center 、right)
水平线标签:<hr/>
width:水平线的长度(两种:像素表示。第二种:百分比显示)
size:水平线的粗细(避免过粗、太丑、一般给个位数 比如 6px)
color:水平线的颜色
align:水平线的对齐方式(left、center、right)
size:水平线的粗细(避免过粗、太丑、一般给个位数 比如 6px)
color:水平线的颜色
align:水平线的对齐方式(left、center、right)
列表标签
ul无序列表
ol有序列表
定义列表
dl
定义标题dt
定义描述dd
图片标签
img
属性
src 图片地址
width 图片的宽度
height 图片的高度
border 边框
alt 图片的文字说明 当图片未能正确加载时,才显示
title 鼠标悬停时,显示的文字
width 图片的宽度
height 图片的高度
border 边框
alt 图片的文字说明 当图片未能正确加载时,才显示
title 鼠标悬停时,显示的文字
表格标签
table
属性
默认没有边框体现
border:边框的宽度
bordercolor:边框的颜色
cellspacing:单元格的间距
cellpadding:单元格与内容的间距
width:宽度
height:高度
align:控制表格的对齐方式 left center right
td的属性:
align:控制的单元格内容的对齐方式 left center right
valign:控制单元格内容的垂直对齐方式 top middle bottom
border:边框的宽度
bordercolor:边框的颜色
cellspacing:单元格的间距
cellpadding:单元格与内容的间距
width:宽度
height:高度
align:控制表格的对齐方式 left center right
td的属性:
align:控制的单元格内容的对齐方式 left center right
valign:控制单元格内容的垂直对齐方式 top middle bottom
rowspan
合并行
colspan
和并列
tr行
td列
表单标签
类型type
text 普通文本输入框
password 密码输入框
radio 单选按钮
checked 多选按钮
select 下拉框,option下拉框的选项
file 文件上传选框
textarea 文本域
submit 提交按钮
reset 充值按钮
hidden 隐藏域,要和表单单一其提交的信息
password 密码输入框
radio 单选按钮
checked 多选按钮
select 下拉框,option下拉框的选项
file 文件上传选框
textarea 文本域
submit 提交按钮
reset 充值按钮
hidden 隐藏域,要和表单单一其提交的信息
常用属性
name 属性:表单项名,用于存储内容值
value属性:输入的值
disabled属性:禁用属性
readonly属性:禁用属性
checked属性:选择框指定默认选项
placeholder:提示
value属性:输入的值
disabled属性:禁用属性
readonly属性:禁用属性
checked属性:选择框指定默认选项
placeholder:提示
CSS
CSS基本语法
选择器 { 属性:值; 属性:值; 属性:值;}
css页面引入方法
外联式:通过link标签,链接到外部样式表到页面中。
嵌入式:通过style标签,在网页上创建嵌入的样式表。
内联式:通过标签的style属性,在标签上直接写样式。
CSS选择器
id选择器
通过id名来选择元素,元素的id名称不能重复,所以一个样式设置项只能对应于页面上一个元素,不能复用,
id名一般给程序使用,所以不推荐使用id作为选择器。
id名一般给程序使用,所以不推荐使用id作为选择器。
#名字
类选择器
通过类名来选择元素,一个类可应用于多个元素,
一个元素上也可以使用多个类,应用灵活,可复用,是css中应用最多的一种选择器。
一个元素上也可以使用多个类,应用灵活,可复用,是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标签试用,任何标签或id名,类名等都适用
伪类选择器
常用的伪类选择器有hover,表示鼠标悬浮在元素上时的状态,
伪元素选择器有before和after,它们可以通过样式在元素中插入内容。
伪元素选择器有before和after,它们可以通过样式在元素中插入内容。
层级选择器
主要应用在选择父元素下的子元素,或者子元素下面的子元素,可与标签元素结合使用,减少命名,
同时也可以通过层级,防止命名冲突。
同时也可以通过层级,防止命名冲突。
分组选择器
.box1,#box2,.box3{width:100px;height:100px}
优先级
优先级:内联样式 > id选择器 > 类选择器 > 标签选择器
规律:作用范围越小,优先级越大!!!
css属性
文本属性
line-height 设置文字的行高,如:line-height:24px;
text-decoration 设置文字的下划线,如:text-decoration:none; 将文字下划线去掉
text-indent 设置文字首行缩进,如:text-indent:24px; 设置文字首行缩进24px
text-align 设置文字水平对齐方式,如text-align:center 设置文字水平居中
word-spacing 设置单词间距
letter-spacing 设置字符之间间距
text-decoration 设置文字的下划线,如:text-decoration:none; 将文字下划线去掉
text-indent 设置文字首行缩进,如:text-indent:24px; 设置文字首行缩进24px
text-align 设置文字水平对齐方式,如text-align:center 设置文字水平居中
word-spacing 设置单词间距
letter-spacing 设置字符之间间距
字体属性
color 设置文字的颜色,如: color:red;
font-size 设置文字的大小,如:font-size:12px;
font-family 设置文字的字体,如:font-family:'微软雅黑';
font-style 设置字体是否倾斜,如:font-style:'normal'; 设置不倾斜,font-style:'italic';设置文字倾斜
font-weight 设置文字是否加粗,如:font-weight:bold; 设置加粗 font-weight:normal 设置不加粗
font-size 设置文字的大小,如:font-size:12px;
font-family 设置文字的字体,如:font-family:'微软雅黑';
font-style 设置字体是否倾斜,如:font-style:'normal'; 设置不倾斜,font-style:'italic';设置文字倾斜
font-weight 设置文字是否加粗,如:font-weight:bold; 设置加粗 font-weight:normal 设置不加粗
背景属性
*background-color: 背景颜色
*background-image: 背景图片
*background-repeat:是否重复,如何重复?(平铺) 属性:平铺(cover)
*background-position:定位
css3的属性
*background-size: 背景大小,如 background-size:100px 140px;
*background-image: 背景图片
*background-repeat:是否重复,如何重复?(平铺) 属性:平铺(cover)
*background-position:定位
css3的属性
*background-size: 背景大小,如 background-size:100px 140px;
边框属性
border:宽度 样式 颜色;
border-color;
border-style; 边框样式:solid实现,dotted点状线,dashed虚线,double双实线
border-width:
border-left-color;
border-left-style;
border-left-width:
CSS3的样式
border-radius:圆角处理
box-shadow: x轴偏移 y轴偏移 模糊度 扩散成都 颜色 inset内阴影 设置或检索对象阴影
border-color;
border-style; 边框样式:solid实现,dotted点状线,dashed虚线,double双实线
border-width:
border-left-color;
border-left-style;
border-left-width:
CSS3的样式
border-radius:圆角处理
box-shadow: x轴偏移 y轴偏移 模糊度 扩散成都 颜色 inset内阴影 设置或检索对象阴影
列表属性
list-stvle
简写属性。用于把所有用于列表的属性设置于一个声明中。
list-stvle-image
将图象设置为列表项标志。
list-stvle-position
设置列表中列表项标志的位置。
list-stvle-type
设置列表项标志的类型。
简写属性。用于把所有用于列表的属性设置于一个声明中。
list-stvle-image
将图象设置为列表项标志。
list-stvle-position
设置列表中列表项标志的位置。
list-stvle-type
设置列表项标志的类型。
ol ul列表
尺寸属性
width
设置元素的宽度
height
设置元素的高度
line-height
设置行高。
max-height
设置元素的最大高度。
max-width
设置元素的最大宽度。
min-height
设置元素的最小高度。
min-width
设置元素的最小宽度。
设置元素的宽度
height
设置元素的高度
line-height
设置行高。
max-height
设置元素的最大高度。
max-width
设置元素的最大宽度。
min-height
设置元素的最小高度。
min-width
设置元素的最小宽度。
盒子模型
边距
内边距
padding-top: 检索或设置对象顶边的内部边距
padding-right: 检索或设置对象右边的内部边距
padding-bottom:检索或设置对象下边的内部边距
padding-left: 检索或设置对象左边的内部边距
padding-right: 检索或设置对象右边的内部边距
padding-bottom:检索或设置对象下边的内部边距
padding-left: 检索或设置对象左边的内部边距
外边距
margin-top: 检索或设置对象顶边的外延边距
margin-right: 检索或设置对象右边的外延边距
margin-bottom: 检索或设置对象下边的外延边距
margin-left: 检索或设置对象左边的外延边距
margin-right: 检索或设置对象右边的外延边距
margin-bottom: 检索或设置对象下边的外延边距
margin-left: 检索或设置对象左边的外延边距
概念:CSS 框模型 (Box Model) 规定了元素框处理元素内容、内边距、边框 和 外边距 的方式。
术语解释
element : 元素。
padding : 内边距,边框距元素的距离。
border : 边框。
margin : 外边距,边框距其他元素边框的距离。
padding : 内边距,边框距元素的距离。
border : 边框。
margin : 外边距,边框距其他元素边框的距离。
css定位
固定定位
概念
CSS 定位 (Positioning) 属性允许你对元素进行定位。
position: fixed;
相对定位
概念
如果对一个元素进行相对定位,它将出现在它所在的位置上。然后,可以通过设置垂直或水 平位置,让这个元素“相对于”它的起点进行移动。
注意:在使用相对定位时,无论是否进行移动,元素仍然占据原来的空间。
position: relative;
绝对定位
概念
绝对定位(absolute) :绝对定位的元素的位置相对于最近的已定位父元素。
position: absolute;
css元素
块元素
块元素,也可以称为行元素,布局中常用的标签如:div、p、ul、li、h1~h6、dl、dt、dd等等都是块元素,
它在布局中的行为:
支持全部的样式
如果没有设置宽度,默认的宽度为父级宽度100%
盒子占据一行、即使设置了宽度
行内元素
内联元素,也可以称为行内元素,布局中常用的标签如:a、span、em、b、strong、i等等都是内联元素,它们
在布局中的行为:
支持部分样式(不支持宽、高、margin上下)
宽高由内容决定
盒子并在一行
代码换行,盒子之间会产生间距
子元素是内联元素,父元素可以用text-align属性设置子元素水平对齐方式,用line-height属性值设置垂直对齐方式
行内块元素
内联块元素,也叫行内块元素,是新增的元素类型,现有元素没有归于此类别的,img和input元素的行为类似这种元素,但是也归类于内联元素,
它们在布局中表现的行为:
支持全部样式
如果没有设置宽高,宽高由内容决定
盒子并在一行
代码换行,盒子会产生间距
子元素是内联块元素,父元素可以用text-align属性设置子元素水平对齐方式,用line-height属性值设置子元素垂直对齐方式
元素就是标签,布局中常用的有三种标签,块元素、内联元素、内联块元素,
了解这三种元素的特性,才能熟练的进行页面布局。
了解这三种元素的特性,才能熟练的进行页面布局。
display属性是用来设置元素的类型及隐藏的,常用的属性有:
1、none 元素隐藏且不占位置
2、block 元素以块元素显示
3、inline 元素以内联元素显示
4、inline-block 元素以内联块元素显示
2、block 元素以块元素显示
3、inline 元素以内联元素显示
4、inline-block 元素以内联块元素显示
伸缩布局
CSS3在布局方面做了非常大的改进,使得我们对块级元素的布局排列变得十分灵活,适应性非 常强,其强大的伸缩性,在响应式开发中可以发挥极大的作用
名词解释:
主轴(main axis):flex容器的主轴主要用来分配flex子元素,默认是水平方向
侧轴(cross axis):与主轴垂直的轴称为侧轴,默认是垂直方向
主轴和侧轴并不是固定不变的,可以通过flex-direction进行切换,默认为水平方向(row)。
补充属性
display中伸缩用到的属性
align-items
align-items 属性定义flex子项在flex容器的当前行的侧轴(纵轴)方向上的对齐方式。
justify-content
justify-content 用于设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式。
Servlet
三种实现方式
继承HttpServlet
GenericServlet类
如果要针对Http协议,需要手动强转
实现Servlet
如果要针对Http协议,需要手动强转
Servlet的生命周期
Servlet的初始化、存活、销毁!!
初始化
Servlet默认不是随着服务器的启动而初始化,当第一次访问Servlet时才初始化,后面访问就执行处理请求
会发现Servlet是一个单例!!
销毁
服务器关闭就销毁
_load on startu
有10个优先级:1~10;数字越小,优先级越高!
比如:Demo01Servlet,load-on-startup:1 ;Demo02Servlet , load-on-startup :2;
当服务器启动时,Demo01Servlet先初始化,然后,Demo02Servlet再初始化!
当服务器启动时,Demo01Servlet先初始化,然后,Demo02Servlet再初始化!
Servlet配置
自定义Servlet,第一步,声明该Servlet;第二步,给该Servlet配置访问路径
可以有多个访问名称,只需要给对应的Servlet多个<servlet-mapping>标签即可!
<url-parttern>书写规则
完全匹配:
目录匹配:
后缀名匹配:
缺省Servlet
url-parttern的值为"/"就是缺省Servlet
tomcat容器自带缺省Servlet
处理匹配不到的资源,返回404页面
处理静态资源,io流读写
处理静态资源,io流读写
在当前工程中自定义Servlet,将url-parttern设置为"/",就覆盖了tomcat容器中的缺省Servlet
服务器中路径问题
带协议的绝对路径: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():获取所有的参数名称
获取域对象:ServletContext
ServletContext对象
相当于是整个应用程序对象
作用
ServletContext是一个域对象,可以用来存储数据
在应用程序中的任何位置都能够访问
getAttribute(String parameterName) : 获取ServletContext域中指定名称的参数值
setAttribute(String paramterName,Object parameterValue):存储参数到ServletContext域中
removeAttribute(String parameterNam):将ServletContext域中指定名称的参数移除!
获取全局初始化参数
会随着服务器的启动而初始化
获取服务器真实磁盘路径
getRealPath:依据当前项目去生成真实磁盘路径,
Servlet3.0
支持注解开发,由注解得到配置,代替了web.xml的配置
用法:在Servlet类的上面直接使用@WebServlet
常用的属性
name:Servlet名称
url-parrerns:String[] 设置访问路径,可以设置多路径,数组的方法
loadonstartup:int 1-10
initParams:WebInitParam[] 设置Servlet的初始化参数
注解
注解介绍
概念:就是一个修饰符
特点:是JDK5.0之后引入的特性。以“@注解名”形式存在
作用
- 跟踪代码依赖性
- 执行编译时格式检查
- 代替已有的配置文件
- 执行编译时格式检查
- 代替已有的配置文件
java内置注解
@Overirde
标记指定方法是一个重写方法,否则报错
@Deprecated
标记一个类、字段、方法是一个过时的!
@SuppressWarings
value : 注解所压制的警告的类型
unchecked 未检查的转化,如集合没有指定类型还添加元素
unused 未使用的变量
resource 有泛型未指定类型
path 在类路径,原文件路径中有不存在的路径
deprecation 使用了某些不赞成使用的类和方法
fallthrough switch语句执行到底没有break关键字
rawtypes 没有写泛型,比如: List list = new ArrayList();
all 全部类型的警告
unused 未使用的变量
resource 有泛型未指定类型
path 在类路径,原文件路径中有不存在的路径
deprecation 使用了某些不赞成使用的类和方法
fallthrough switch语句执行到底没有break关键字
rawtypes 没有写泛型,比如: List list = new ArrayList();
all 全部类型的警告
用的最多是all
自定义注解
public @Interface 注解名{
数据类型 属性名1() default 默认值1;
数据类型 属性名2() ;
}
数据类型 属性名1() default 默认值1;
数据类型 属性名2() ;
}
value属性单独使用时,是可以省略"value="。
元注解概述
作用在自定义注解上,规定自定义注解的作用区域、存活策略!
常用的元注解
@Target
规定自定义注解的作用区域
TYPE:类、接口、注解、枚举
FIELD:成员你变量
METHOD:成员方法
PARAMETER:形参
CONSTRUCTOR:构造器
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解类型
PACKAGE:包
FIELD:成员你变量
METHOD:成员方法
PARAMETER:形参
CONSTRUCTOR:构造器
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解类型
PACKAGE:包
-------------------------------------------
@Retention
规定自定义注解的存活策略
SOURCE : 仅存活在源码
CLASS : 存活在编译期
RUNTIME : 存活在运行时
CLASS : 存活在编译期
RUNTIME : 存活在运行时
自定义注解@MyTest
测试类中,方法上如果使用了@MyTest注解,该方法就会执行!
步骤
1.自定义注解MyTest
2.编写Test01类,用来标注注解的
3.编写实现类Demo类
4.获取Test01Class对象
5.getMethods获取全部方法对象
6.
Arrays.stream(methods).forEach(method -> {
//method就是单个方法对象
//3,判断方法上是否有@MyTest注解
boolean present = method.isAnnotationPresent(MyTest.class);
if (present) {
//方法上有@MyTest注解,执行方法
try {
method.invoke(clazz.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
} else {
//方法上没有@MyTest注解
}
});
//method就是单个方法对象
//3,判断方法上是否有@MyTest注解
boolean present = method.isAnnotationPresent(MyTest.class);
if (present) {
//方法上有@MyTest注解,执行方法
try {
method.invoke(clazz.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
} else {
//方法上没有@MyTest注解
}
});
自定义注解@JDBCInfo
使用自定义的注解代替配置文件,用来获取连接对象,注册驱动
具体实现是在util类里面
思路
1.在util类中,定义四个常量,用来接收驱动,连接,用户名,密码
2.在静态快里面,首先获取util类的Class对象,判断该类是否有我们的自定义注解,有的话就获取注解对象,用注解对象获取注解内的属性值
方法:isAnnotationPresent(JDBCInfo.class):用来判断util类是否有该注解
getAnnotation(JDBCInfo.class)获取该注解对象
反射、注解、设计模式案例
装饰者模式
UserDao接口
UserDaoImpl实现类(被代理类)
UserDaoWrapper装饰类
装饰类里面有我们的增强方法
缺点:我们不想增强的方法都要重写
该类必须要实现被代理类的接口,并重写所有方法
动态代理设计模式
UserDao接口
UserDaoImpl实现类(被代理类)
Demo测试方法,中利用动态代理模式获取增强类
Proxy.newProxyInstance(被代理类的类加载器,被代理类的实现的所有接口,匿名内部类(编写要让哪个方法增强))
Cookie和Session
会话技术概念:打开浏览器,访问服务器中资源,关闭浏览器;这个过程就是会话。
会话分类
Cookie会话技术;浏览器会话技术
Session会话技术;服务器会话技术
作用
解决ServletContext域对象、Request域对象存储数据所存在的问题
Cookie
Cookie的流程
浏览器请求服务器,请求Demo01Servlet,创建一个Cookie对象,名称为cookie1
可以通过响应头Set-Cookie,携带cookie给浏览器进行保存
浏览器再次请求服务器,请求Demo02Servlet,获取cookie1对象
使用方式
方式一(不推荐)
response.addHeader("set-cookie","msg=hello")
方式二(推荐)
Cookie cookie = new Cookie("msg","hello");
response.addCookie(cookie);
response.addCookie(cookie);
获取Cookie
通过request对象获取所有的Cookie对象,存储到一个数组中
遍历该数组,匹配Cookie名称
如果匹配上,就知道了指定的Cookie对象
如果匹配不上,就没有指定的Cookie对象
Cookie的相关设置
持久化设置
cookie的生命周期
默认是随着浏览器的关闭而销毁
setMaxAge
设置cookie的存活时长,cookie就可以不随着会话的关闭而销毁!
路径设置
默认情况下,Cookie对象会随着任何一个请求携带到服务器
setPath
设置Cookie的访问路径
比如:
cookie1的path路径为:/项目名称/
cookie2的path路径为:/项目名称/jsps/
当访问http://localhost/项目名称/index.jsp 这时只有cookie1会被携带到服务器,因为 url中包含了cookie1的path
当我们访问http://localhost/项目名称/jsps/index.jsp 这时有cookie1和cookie2会被 携带到服务器,因为url中同时包含了cookie1和cooki2的path
cookie1的path路径为:/项目名称/
cookie2的path路径为:/项目名称/jsps/
当访问http://localhost/项目名称/index.jsp 这时只有cookie1会被携带到服务器,因为 url中包含了cookie1的path
当我们访问http://localhost/项目名称/jsps/index.jsp 这时有cookie1和cookie2会被 携带到服务器,因为url中同时包含了cookie1和cooki2的path
Session
Session的基本使用
Cookie之所以叫做浏览器会话,原因是Cookie的数据存储到浏览器!
- Session之所以叫做服务器会话,原因是Session的数据存储到服务器!
- 执行流程
第一次请求Demo01Servlet时,根据request.getSession方法, 新建一个session对象;
当第一次响应时,会将该session对象的id作为cookie头响应给浏览器保存
第二次请求Demo01Servlet时,根据request.getSession方法,请求中会有cookie头
会根据该JSESSIONID去服务器中找有没有对应的session对象,如果有就直接用,没有就新建!!!
注意:响应给Cookie的操作是底层给我们实现的
Session相关配置
生命周期
默认是Session对象没有操作30分钟就给销毁
session.invalidate方法,立马将对应的session对象销毁!后续就会新建session!
Session和Cookie之间的关系
首先我们在第一次获取session对象是会讲我们的session对象的id响应给cookie,在浏览器端进行存储,这时候session对象属于新建
我们接着第二次去调用request.getSession方法时,我们会根据cookie里面存储的JSEISSON=xxx来判断是获取session对象还是新建session对象
总之来说,当cookie中的session储存的id和服务器中存在的session对象的id不匹配,我们就会新建session对象,如果服务器中没有session对象,也会新建,还如果,cookie中不存在JSESSION也会新建session对象
session的基本使用
session的使用和request和servletContext的用法一样
三个方法
setAttribute
设置session域对象中的存储数据
getAttribute
获取session域对象中的存储数据
removeAttribute
移除session域对象中的存储数据
监听器
概念
事件源:事件发生的源头
监听器:监听事件发生
绑定:将监听器绑定到事件源
事件:能够触发监听器的事
Servlet监听器
- - 事件源:request域对象、session域对象、ServletContext域对象
- 监听器:Servlet三种监听器
- 绑定:配置web.xml
- 事件:域对象发生改变
- 监听器:Servlet三种监听器
- 绑定:配置web.xml
- 事件:域对象发生改变
监听器的分类
一类监听器
监听域对象的创建和销毁
二类监听器
监听域对象中的属性变更(属性设置、属性替换、属性移除)
三类监听器
监听域对象的java对象的绑定
一类监听器的基本使用
一类监听器
- ServletRequestListener : 监听ServletRequest域对象的创建、销毁
- HttpSessionListener :监听HttpSession域对象的创建、销毁
- ServletContextListener : 监听ServletContext域对象的创建、销毁
- HttpSessionListener :监听HttpSession域对象的创建、销毁
- ServletContextListener : 监听ServletContext域对象的创建、销毁
开发步骤
- 自定义类实现一类监听器
- 重写监听器中的方法
- 配置web.xml
- 重写监听器中的方法
- 配置web.xml
- 事件源: ServletContext域对象
- 监听器:ServletContextListener
- 绑定: web.xml配置
- 事件 : ServletContext域对象发生了创建、发生了销毁
- 监听器:ServletContextListener
- 绑定: web.xml配置
- 事件 : ServletContext域对象发生了创建、发生了销毁
二类监听器的基本使用
分类
ServletRequestAttributeListener
- 监听ServletRequest域对象中属性变更
- 监听ServletRequest域对象中属性变更
HttpSessionAttributeListener
- 监听HttpSession域对象中属性变更
- 监听HttpSession域对象中属性变更
ServletContextAttributeListener
- 监听ServletContext域对象中属性变更
- 监听ServletContext域对象中属性变更
三类监听器的基本使用
HttpSessionBindingListener
监听session域中的java对象的状态(绑定和解绑)
绑定:将java对象存储到session域对象
解绑:将java对象从session域对象移除
监听器组成
事件源:java对象
监听器:HttpSessionBindingListener
绑定:java对象实现HttpSessionBindingListener接口
事件:java对象在session中状态发生改变
意思:监听java对象的绑定与解绑
实现:
要在指定的java对象实现此接口,并重写方法
然后在服务器中就可以监听了
正则表达式
概念
是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种 规则。有自己特殊的应用。
作用
主要是用来做表单的内容的规则校验
基本使用
字符类
规定字符串的内容
[abc]
任意一个字符,为a或b或c即可
[a-zA-Z]
任意一个字符,范围在:a-z之间或A-Z之间
[0-9]
任意一个字符,范围在0-9之间
预定义字符类
\d
任意一个数字
\D
除了0-9的任意字符
\w
a-z,A-Z,0-9,_ 中任意一个字符
\W
除了\w包含的字符之外的任意字符
\s
空白符如空格,和tab
tab要在数量为1或多的情况下才能行
\S
除了空字符以外的任意字符
.
任意一个字符
数量词
X*
X出现的次数为零次或者多次
X?:X,要么只有一个,要么没有
X+:X,从1次到多次
X{n}:X,正好n次
X{n,}:X,从n次到多次
X{n,m}:X,从n次到m次
分割功能
可以将正则表达式挡在split中档分割规则
注意事项
只要没有标明长度,那么默认长度就是1!!!
Pattern和Matcher类
Pattern
相当于就是正则表达式,现在是正则对象
Matcher
- - 匹配对象,完成匹配功能等
find方法
在字符串中找到和正则匹配得上的子字符串,如果找到了返回true,否则返回false
group方法
获取字符串中找到和正则匹配得上的子字符串
具体代码day67
自定义tomcat服务器
原理
操作请求行、请求头、请求正文
操作响应行、响应头、响应正文
开发步骤
1.我们通过socket获取输入流,然后获取流中的请求行
2.通过请求行,我们访问资源的相对路径
3.创建高效输入流,将资源存到流中
4.利用socket创建输出流,将输入流中的数据,输出到socket上
优化方案
1.在前面的基础上加上死循环这样我们可以输出多条数据
2.我们在循环的基础中假如多线程,这样就实现了多线程访问
注意:多线程不能吧accpet代码包括,否则会造成无限创建socket对象
具体代码day67
长出错的毛病
1.配置文件的位置,参数是否正确
2.服务器的继承,配置等问题
3.在使用Bootstrapvalitor表单校验时,div中药添加class属性form-group
多表设计
分类
一对一
- 表A、表B
- 表A中的一条记录对应表B中的一条记录,表B中的一条记录对应表A中的一条记录
- 比如:公司和注册地址,一个公司只能有一个注册地址,一个注册地址只能有一个公司
- 表A中的一条记录对应表B中的一条记录,表B中的一条记录对应表A中的一条记录
- 比如:公司和注册地址,一个公司只能有一个注册地址,一个注册地址只能有一个公司
设计原则
- 用一张表的主键指向另一张表的主键
- 主键作为外键约束
- 主键作为外键约束
一对多
- 表A、表B
- 如果,表A中的一条记录对应表B中的多条记录,且表B中的一条记录对应表A中的一条记录,那么表A和表B就是一对多关系。表A是一的一方,表B是多的一方。
- 比如:部门和员工,一个部门可以有多个员工,而一个员工只能有一个部门
- 如果,表A中的一条记录对应表B中的多条记录,且表B中的一条记录对应表A中的一条记录,那么表A和表B就是一对多关系。表A是一的一方,表B是多的一方。
- 比如:部门和员工,一个部门可以有多个员工,而一个员工只能有一个部门
设计原则
- 在多的一方添加一个字段,指向一的一方的主键
- 如果要保证数据的完整性,还需要将该字段作为外键约束
- 如果要保证数据的完整性,还需要将该字段作为外键约束
多对多
- 表A、表B
- 表A中的一条记录对应表B中的多条记录,表B中的一条记录对应表A中的多条记录
- 比如:课程和学生,一个学生可以学习多个课程,一个课程可以被多个学生选择
- 表A中的一条记录对应表B中的多条记录,表B中的一条记录对应表A中的多条记录
- 比如:课程和学生,一个学生可以学习多个课程,一个课程可以被多个学生选择
设计原则
- 添加一个中间表
- 将这个中间表作为多的一方,另外两张表作为一的一方。
- 将一个多对多的关系拆分成两个一对多的关系!
- 将这个中间表作为多的一方,另外两张表作为一的一方。
- 将一个多对多的关系拆分成两个一对多的关系!
PowerDesigner
作用
- 在项目设计阶段通常会使用PowerDesigner进行数据库设计。
- 建立概念数据模型,便于和非专业人员进行业务上的沟通
- 建立物理数据模型,可以用来生成对应的库表
- 建立概念数据模型,便于和非专业人员进行业务上的沟通
- 建立物理数据模型,可以用来生成对应的库表
MySQL
数据库分类
关系型数据库
关系结构数据库:Oracle、MySQL、DB2、SQL Server,以表格(Table)形式存储,多表之间建立关联关系,通过分类、合并、连接、选取等方式实现访问。
非关系型数据库
MongDB、Redis,使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据
数据库管理系统
概念
数据库管理系统:指的是一种操作和管理数据库的大型软件,用于建立、使用、维护数据库,对数据库进行统一的管理和控制,保证数据库的安全性和完整性。
用户通过数据库管理系统访问数据库中的数据
用户通过数据库管理系统访问数据库中的数据
长见的数据库管理系统
Oracle:可以运行在UNIX、Windows等主流操作系统,支持所有的工业标准,并获得了最高级别的ISO标准安全性认证。
DB2:IBM公司的,满足中大公司的需要
SQL Server:微软退出的。
SQLLite:手机端的数据库
Mysql:免费、适合中小型企业
配置环境变量
windows
- - 创建MYSQL_HOME:C:\Program Files\MySQL\MySQL Server 5.7
- 追加Path:%MYSQL_HOME%\bin;
- 追加Path:%MYSQL_HOME%\bin;
MySQL数据库基本命令
对数据库操作的
创建
create database 数据库名 charvcter set 字符集
修改
alter database 数据库名 charvcter set 字符集
删除
drop database 数据库名
使用
use 数据库名
对于表内数据的操作
查询:SELECT 列名 FROM 表名
去重
distinct 列名
排序查询
SELECT 列名 FROM 表名 ORDER BY 排序列名 [排序规则]
asc升序,desc降序
条件查询
SELECT 列名 FROM 表名 WHERE 条件
区间判断(between and)
等值判断(=)
不等值判断(>、<、>=、<=、!=、<>)
逻辑判断(and、or、not)
NULL值判断(IS NULL、IS NOT NULL)
枚举查询(IN (值1,值2,值n....))
in就相当前面的列名等于括号内的值1或者值2......
模糊查询(_、%)
LIKE
- LIKE _(单个任意字符)
- 列名 LIKE 'S_'
- LIKE %(任意长度的任意字符 0~n个)
- 列名 LIKE 'S%'
- LIKE _(单个任意字符)
- 列名 LIKE 'S_'
- LIKE %(任意长度的任意字符 0~n个)
- 列名 LIKE 'S%'
分支结构查询
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
起别名可以
注意:case分支结构产生一个新的列
时间查询
SELECT 时间函数([参数列表]);
经验:执行时间函数查询,会生成一张虚拟表(一行一列)
时间函数
SYSDATE()
当前系统时间(年、月、日、时、分、秒)
CURDATE()
获得当前日期
CURTIME()
获得当前时间
WEEK(DATE)
获得指定日期是一年中第几周
YEAR(DATE)
获得指定日期的年份
MONTH(DATE)
获得指定日期的月份
DAY(DATE)
获得指定日期的天
HOUR(DATE)
获得指定时间的小时值
MINUTE(DATE)
获得指定时间的分钟值
SECOND(DATE)
获得指定日期的秒值
DATEDIFF(DATE1,DATE2)
获得DATE1和DATE2之间相隔的天数
ADDDATE(DATE,N)
在指定日期加上N天后的日期
当前系统时间(年、月、日、时、分、秒)
CURDATE()
获得当前日期
CURTIME()
获得当前时间
WEEK(DATE)
获得指定日期是一年中第几周
YEAR(DATE)
获得指定日期的年份
MONTH(DATE)
获得指定日期的月份
DAY(DATE)
获得指定日期的天
HOUR(DATE)
获得指定时间的小时值
MINUTE(DATE)
获得指定时间的分钟值
SECOND(DATE)
获得指定日期的秒值
DATEDIFF(DATE1,DATE2)
获得DATE1和DATE2之间相隔的天数
ADDDATE(DATE,N)
在指定日期加上N天后的日期
字符串查询
语法:SELECT 字符串函数([参数列表]);
- 经验:执行字符串函数,产生一张虚拟表,(一行一列)
字符串函数 说明
CONCAT(str1,str2,str3...) 将多个字符串进行拼接
INSERT(str,pos,len,newStr) 将str中指定pos位置开始len长度的内容替换为newStr
LOWER(str) 将指定字符串转换为小写
UPPER(str) 将指定字符串转换为大写
SUBSTRING(str,pos,len) 将str字符串指定pos位置开始截取len个内容
CONCAT(str1,str2,str3...) 将多个字符串进行拼接
INSERT(str,pos,len,newStr) 将str中指定pos位置开始len长度的内容替换为newStr
LOWER(str) 将指定字符串转换为小写
UPPER(str) 将指定字符串转换为大写
SUBSTRING(str,pos,len) 将str字符串指定pos位置开始截取len个内容
聚合函数
语法:SELECT 聚合函数(列名) FROM 表名;
- 经验:聚合函数式对多条数据的单列进行统计,返回统计后的一行结果
聚合函数
COUNT() 求总行数
SUM() 求单列中所有行的总和
AVG() 求单列中所有行的平均值
MAX() 求单列中所有行的最大值
MIN() 求单列中所有行的最小值
SUM() 求单列中所有行的总和
AVG() 求单列中所有行的平均值
MAX() 求单列中所有行的最大值
MIN() 求单列中所有行的最小值
分组查询
语法: SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名)
GROUP BY
分组依据。如果有WHERE,在WHERE之后生效
分组依据。如果有WHERE,在WHERE之后生效
分组之后的每组相当于一列
分组过滤查询
语法: SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名) HAVING 过滤规则
HAVING
过滤规则是对分组后的数据进行过滤
过滤规则是对分组后的数据进行过滤
#HAVING是在分组之后的数据进行过滤
限定查询
语法:SELECT 列名 FROM 表名 LIMIT 起始行,查询行
LIMIT offset_start,row_count
限定查询结果的起始行和总行数
限定查询结果的起始行和总行数
子查询(作为条件判断)
:SELECT 列名 FROM 表名 WHERE 条件(子查询结果)
- 注意:将子查询"一行一列"的结果作为外部查询的条件。做第二次查询
- 子查询得到的是一行一列的结果才能作为外部条件的等值或不等值判断条件
- 子查询得到的是一行一列的结果才能作为外部条件的等值或不等值判断条件
子查询(作为枚举查询的条件)
SELECT 列名 FROM 表名 WHERE 列名 IN(子查询结果)
经验:将子查询得到的"多行一列"的结果作为外部查询的枚举查询条件,做第二次查询
子查询(作为一张表)
SELECT 列名 FROM (子查询结果集) WHERE 条件;
经验:将子查询得到的"多行多列"的结果作为外部查询的一张临时表,做第二次查询
合并查询(了解)
语法:
- SELECT 列名 FROM 表名 1 UNION SELECT 列名 FROM 表名2
- SELECT 列名 FROM 表名 1 UNION ALL SELECT 列名 FROM 表名2
- SELECT 列名 FROM 表名 1 UNION SELECT 列名 FROM 表名2
- SELECT 列名 FROM 表名 1 UNION ALL SELECT 列名 FROM 表名2
注意:合并的两个结果集,列数必须相同,列类型、列名可以不同
表连接查询
语法:SELECT 列名 FROM 表1 连接方式 表2 ON 连接条件;
inner join on 内连接查询:将两张表相同列一一对应
left join on 左外连接查询
注意:左外连接,是以左表为主表,依次向右表匹配,匹配到,则返回正确结果
匹配不到,则返回NULL值,填充显示
右外连接查询(RIGHT JOIN ON)
- 注意:右外连接,是以右表为主表,依次向左匹配,匹配到,返回正确结果
- 匹配不到,则返回NULL填充
- 匹配不到,则返回NULL填充
DML操作(增、删、改)
新增(INSERT)
INSERT INTO 表名 (列1,列2,列3...) VALUES(值1,值2,值3.....)
注意:表名后的列名列表以及VALUES里的值列表要一一对应(个数、顺序、类型)
修改(UPDATE)
UPDATE 表名 SET 列名1=新值1,列名2 = 新值2...... WHERE 条件
- 注意:SET后跟着多个列 = 值,绝大多数情况下,都要加WHERE条件,指定修改的目标,否则为整表更新
删除
DELETE FROM 表名 WHERE 条件
注意:删除时,如若不加WHERE条件,删除的是整张表的数据。结构不变
清空(TRUNCATE)
TRUNCATE TABLE 表名;
- 注意:TRUNCATE与DELETE不加WHERE删除整张表数据不同:
- DELETE仅仅删除数据,结构不变。
- TRUNCATE是把整张表销毁,再按照原表的格式、结构创建一张新表
- DELETE仅仅删除数据,结构不变。
- TRUNCATE是把整张表销毁,再按照原表的格式、结构创建一张新表
对表操作
数据表的创建(CREATE)
CREATE TABLE 表名(
列名 数据类型 [约束],
列名 数据类型 [约束],
.......
列名 数据类型 [约束] //最后一列的创建,末尾不需要加逗号
)[charset=utf8]; //根据需要指定表的字符编码集
列名 数据类型 [约束],
列名 数据类型 [约束],
.......
列名 数据类型 [约束] //最后一列的创建,末尾不需要加逗号
)[charset=utf8]; //根据需要指定表的字符编码集
约束
主键约束
唯一约束
自动增长列
非空约束
默认值约束
引用完整性约束
数据表的修改(ALTER)
#向现有表中添加列
ALTER TABLE Student ADD image BLOB;
#ADD 新列名 数据类型 [约束]
ALTER TABLE Student ADD image BLOB;
#ADD 新列名 数据类型 [约束]
修改表中的列
ALTER TABLE student MODIFY phone VARCHAR(14) NOT NULL
注意:修改表中的某列时,需要写全列的名字、数据类型、约束
删除表中的列
ALTER TABLE student CHANGE borndate birthday DATE NOT NULL;
- 注意:改变列名时,在给定新列名的同时,要指定列的数据类型和约束
修改表名
ALTER TABLE student RENAME stu;
删除表(DROP)
DROP TABLE 表名
事务
概念
事务是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务中,所有的SQL语句都成功执行时,整个事务成功!有一个SQL语句执行失败,整个事务都执行失败!
事务的边界
- 开始:连接到数据库,执行一条DML语句。 上一个事务结束后,又输入了一条DML语句,即事务的开始
- 结束:
- 提交:
- 显示提交:COMMIT;
- 隐式提交:一条DML语句。正常退出(客户端退出链接)
- 回滚:
- 显示回滚:ROLLBACK;
- 隐式回滚:非正常退出(断电、死机),执行了创建、删除的语句,但是失败了!会为这个无效的SQL语句执行回滚。
- 结束:
- 提交:
- 显示提交:COMMIT;
- 隐式提交:一条DML语句。正常退出(客户端退出链接)
- 回滚:
- 显示回滚:ROLLBACK;
- 隐式回滚:非正常退出(断电、死机),执行了创建、删除的语句,但是失败了!会为这个无效的SQL语句执行回滚。
事务的原理
数据库会为每一个客户端都维护一个空间独立的缓存区(回滚段),一个事务中所有的增删改语句的执行结果都会缓存在回滚段中,只有当事务中所有的SQL语句均正常结束(COMMIT),才会将回滚段中的数据同步到数据库。否则无论因为任何原因失败了,则整个事务回滚(ROLLBACK);
事务的特性
- Atomicity(原子性)
表示的是一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。
- Consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过得数据都必须回滚到修改前状态。
- Isolation(隔离性)
事务查看数据操作时数据所处的状态,要么是另一个并发事务修改数据之前的状态,要么是另一个并发事务修改它之后的状态。事务不会查看中间状态的数据
- Durability(持久性)
事务完成之后,对于数据库的影响是永久性的。
表示的是一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。
- Consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过得数据都必须回滚到修改前状态。
- Isolation(隔离性)
事务查看数据操作时数据所处的状态,要么是另一个并发事务修改数据之前的状态,要么是另一个并发事务修改它之后的状态。事务不会查看中间状态的数据
- Durability(持久性)
事务完成之后,对于数据库的影响是永久性的。
事务的应用
应用环境:基于增删改语句的操作结果(均返回操作后受影响的行数),可通过程序逻辑手动控制事务的提交或回滚
- 注意:开启事务后,在当前事务内执行的语句均属于当前事务,成功再执行COMMIT,失败要进行ROLLBACK
权限管理
创建用户
CREATE USER 用户名 IDENTIFIED BY 密码
授权
GRANT ALL ON 数据库.表名 TO 用户名;
撤销权限
REVOKE ALL ON 数据库.表名 FROM 用户名
删除用户
DROP USER 用户名;
视图
概念
视图,虚拟表,从一个表中或多个表中查询出来的结果表,作用和真实表一样,包含一系列的带有行和列的数据。视图中,可以使用SELECT语句查询数据,也可以使用INSERT、UPDATE、DELETE修改记录,视图可以使用户操作方便,并保障了数据库系统安全。
视图特点
优点
- 简单化,数据所见即所得
- 安全性,只能查询或修改视图中锁能见到的数据
- 逻辑独立性,可以屏蔽真实表结构变化带来的影响。
- 简单化,数据所见即所得
- 安全性,只能查询或修改视图中锁能见到的数据
- 逻辑独立性,可以屏蔽真实表结构变化带来的影响。
缺点
- 性能相对较差,简单的查询会稍微复杂
- 修改不方便,当视图的数据时复杂的聚合视图时,无法修改。
- 性能相对较差,简单的查询会稍微复杂
- 修改不方便,当视图的数据时复杂的聚合视图时,无法修改。
视图的创建
语法:CREATE VIEW 视图名 AS 查询数据源表的语句;
视图的修改
- 方式一:CREATE OR REPLACE VIEW 视图名 AS 查询源表的语句;
- 方式二:ALTER 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
数据库的索引
概念
索引(index)是帮助MySQL高效获取数据的数据结构(有 序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某 种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构 就是索引。
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的 记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的 二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就 可以运用二叉查找快速获取到相应数据。
总结
可以将索引看作一本书的目录。
优缺点
优点
提高了记录查询的速度
提高了记录排序的效率
缺点
索引占用了空间
索引会降低DML(增删改)操作的速度
因为你修改数据不仅要修改数据还要修改索引
结构
索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引 都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。MySQL目前提供了以下4 种索引:
- BTREE索引
- Hash索引
- R-TREE索引
- FULL-TEXT索引
- Hash索引
- R-TREE索引
- FULL-TEXT索引
- 主要使用的索引结果是BTREE索引.
BTREE结构
BTREE结构又叫多路平衡索引树,一颗m叉的BTree特性如下:
树中每个节点最多包含m个孩子。
除根节点与叶子节点外,每个节点至少有[ceil(m/2)]个孩子。
若根节点不是叶子节点,则至少有两个孩子。
所有的叶子节点都在同一层。
每个非叶子节点由n个key与n+1个指针组成,其中[ceil(m/2)-1] <= n <= m-1
以5叉BTree为例,key的数量:公式推导[ceil(m/2)-1] <= n <= m-1。所以 2 <= n <=4 。当 n>4时,中间节点分裂到父节点,两边节点分裂。
索引分类
唯一索引
索引字段的值必须唯一
单值索引
所以只包含一个字段
复合索引
索引包含多个字段
注意字段就是数据表中的列
索引语法
查看索引
show index from 表名;
创建索引
create index 索引名 on 表名 (字段名1,字段名2...);
注意事项
查询多,增删改,就适合使用索引;否则不适合。
数据库的存储
数据库存储过程概述
概念
就是在数据库端存储一个已经编译好的SQL语句
作用
如果没有使用存储过程,存在的问题
SQL语句从服务器传输到数据库时,存在安全问题
数据库执行SQL语句时,每次都要进行编译再运行,效率一般
如果使用存储过程,就可以解决以上两个问题。
数据库存储过程语法
语法
创建存储过程
-- 临时修改截止符
DELIMITER $
CREATE PROCEDURE 过程名称(in|out 参数名称1 参数类型 , in|out 参数名称2 参数类型...)
BEGIN
SQL语句;
END$
DELIMITER ;
DELIMITER $
CREATE PROCEDURE 过程名称(in|out 参数名称1 参数类型 , in|out 参数名称2 参数类型...)
BEGIN
SQL语句;
END$
DELIMITER ;
调用存储过程
call 存储过程名称(参数1,参数2...)
数据库触发器概述及基本使用
概念
数据库触发器是一个与表相关联的、存储了 SQL 语句的程序。
每当一个特定的数据操作语句 (Insert,update,delete)在指定的表上发出时,数据库自动地执行触发器中定义的SQL语句。
new对象和old对象
old对象
SQL语句执行之前的记录对象
new对象
SQL语句执行之后的记录对象
语法
创建触发器
delimeter $
create trigger 触发器名称
before|after insert|delete|update
on表名 for each row
begin
SQL语句;
end$
delimeter ;
create trigger 触发器名称
before|after insert|delete|update
on表名 for each row
begin
SQL语句;
end$
delimeter ;
基本使用
当tb_user表中发生了修改行为,那么就会修改tb_class中的记录
DELIMITER $
CREATE TRIGGER t1
AFTER UPDATE
ON tb_user FOR EACH ROW
BEGIN
UPDATE tb_class SET num = num + 1 WHERE cid = 1;
END $
DELIMITER ;
-- 调用修改记录的存储过程
CALL pro2(2,110);
CREATE TRIGGER t1
AFTER UPDATE
ON tb_user FOR EACH ROW
BEGIN
UPDATE tb_class SET num = num + 1 WHERE cid = 1;
END $
DELIMITER ;
-- 调用修改记录的存储过程
CALL pro2(2,110);
数据库的设计范式
概念
设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被 称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
分类
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
第一范式(1NF):
每一列都是不可分割的原子数据项
第二范式(2NF):
在1NF的基础上,非码属性必须完全依赖于主码(在1NF基础上消除非 码属性对主码的部分函数依赖)
完全函数依赖
A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性 组中所有的属性值。 例如:(学号,课程名称) --> 分数
部分函数依赖
A-->B,如果A是一个属性组,则B属性值得确定只需要依赖于A属性 组中某一些值即可。 例如:(学号,课程名称) -- > 姓名
传递函数依赖
A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属 性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数 依赖于A 例如:学号-->系名,系名-->系主任
码
如果在一张表中,一个属性或属性组,被其他所有属性所完全函数依赖,则称这个 属性(属性组)为该表的码 例如:该表中码设置为(学号,课程名称)
主码
码属性组中的所有属性
非码
除主码属性组以外属性
第三范式(3NF)
在2NF基础上,消除传递依赖
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版本
tomcat
Web项目
静态项目
包含都是静态资源:html、js、css、图片、音频等等
动态项目
包含都是静态资源:html、js、css、图片、音频等等
可以有动态资源及WEB-INF文件夹
WEB-INF文件夹及web.xml
tomcat部署项目
将tomcat目录以外的资源部署到容器中
B_虚拟目录初级版
将tomcat目录以外的资源部署到容器中
在tomcat的目录 -> conf文件夹 -> server.xml中 , 加一个<Contex>
在tomcat的目录 -> conf文件夹 -> server.xml中 , 加一个<Contex>
<Context docBase="项目路径" path="项目访问名称"/>
C_虚拟目录优化版
基于虚拟目录初级版!!
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"/>
A_直接将项目放到webapps下
web动态项目的相关设置
tomcat安装目录 -> conf文件夹 -> web.xml
每一个web动态项目都会包含web.xml
代码
<welcome-file-list>
<welcome-file>demo01.html</welcome-file>
<welcome-file>demo01.htm</welcome-file>
<welcome-file>demo01.jsp</welcome-file>
</welcome-file-list>
<welcome-file>demo01.html</welcome-file>
<welcome-file>demo01.htm</welcome-file>
<welcome-file>demo01.jsp</welcome-file>
</welcome-file-list>
idea部署web项目
1.创建Java Enterprise ,选中Web application
2.项目名称、工作空间的选择
3.JavaWeb目录介绍
4.IDEA配置tomcat
选择Edit Configurations,
点击加号 ->tomcat server -> local
点击Configure -> 点击加号 -> 选择tomcat
5.tomcat配置
on update action: 操作
Redeploy:重新部署项目
项目配置:部署项目到tomcat
访问名称
只有资源来到了dayxx_war_exploded文件夹中,才意味着部署成功!!!
Http协议
概念:两个设备进行数据交换的约定!
超文本传输协议(hypertext transfer protocl)
超文本:字符、音频、视频、图片等等
基于tcp协议。tomcat服务器底层实现本质上就是TCP(Socket)
超文本:字符、音频、视频、图片等等
基于tcp协议。tomcat服务器底层实现本质上就是TCP(Socket)
通过抓包的方式演示http协议
请求-响应模型!!!
请求
请求行
请求头
请求正文
响应
响应行
响应头
响应正文
请求的执行流程
发起请求
域名解析
本地域名解析器(C:\Windows\System32\drivers\etc\host),
如果本地解析器无法解析,那么就交给互联网上的DNS解析器得到IP
根据ip和端口,可以得到一个Socket对象,执行请求
携带请求行、请求头、请求正文
服务器响应浏览器
携带响应行、响应头、响应正文
http请求
请求组成
请求行
Request URL : 请求路径,告诉服务器要请求的资源路径
Request Method : 请求方式 , GET/POST
protocol : http协议版本
Request Method : 请求方式 , GET/POST
protocol : http协议版本
请求头
Content-Type:浏览器告诉服务器,请求正文的数据类型
User-Agent:浏览器告诉服务器,我是个什么样的浏览器
User-Agent:浏览器告诉服务器,我是个什么样的浏览器
请求正文
请求正文,只有当请求方式为post,且有请求参数时才会有请求正文!!!Form Data
GET请求和POST请求:
get请求只能携带小数据、get请求下的请求参数会直接拼接到Request URL(请求网址)后面,QueryStringParameters
post请求可以携带大数据、post请求下的请求参数会存放到请求正文
请求参数:比如,表单中的输入框中的值.
如果我们要做文件上传,需要用到post请求,文件比较大!!
请求参数:比如,表单中的输入框中的值.
如果我们要做文件上传,需要用到post请求,文件比较大!!
HTTP响应
Http响应组成
响应行
Status Code : 响应状态码
200:服务器响应成功
302: 告诉浏览器,进行重定向
304: 页面上的内容没有发生改变,不需要重新请求服务器
404: 没有对应的服务器资源
500:服务器内部错误!
302: 告诉浏览器,进行重定向
304: 页面上的内容没有发生改变,不需要重新请求服务器
404: 没有对应的服务器资源
500:服务器内部错误!
响应头
Location:告诉浏览器重定向的资源路径,需要结合响应状态码302使用
Content-Type:
服务器告诉浏览器,响应正文的数据类型
Content-Type:text/html;charset=utf-8; 服务器告诉浏览器,响应正文是文本和html标签;告诉浏览器,应该以utf-8的形式进行解码!浏览器就会以html标签及utf-8的形式对响应正文进行渲染显示!!!
Content-Type:text/html;charset=utf-8; 服务器告诉浏览器,响应正文是文本和html标签;告诉浏览器,应该以utf-8的形式进行解码!浏览器就会以html标签及utf-8的形式对响应正文进行渲染显示!!!
refresh:
定时跳转
Content-Disposition:
文件下载
响应正文
浏览器显示的内容
Servlet的概述及入门
servlet就是一个java程序,可以和浏览器进行交互,servlet的使用需要有服务器编译环境的支持!!
配置方法
先按f4,然后加号吧tomcat添加进去,最好勾选
Servlet的执行流程
浏览器发起请求: http://localhost:8080/day50/demo01
就会在服务器中找访问名称为demo01的Servlet -> Demo01Servlet
请求的处理就交给了Demo01Servlet的实例,根据请求方式get/post,决定是给doGet还是doPost方法处理!!!
注意
不管是get请求还是post请求,对于服务器来说,没差别的!!!
get请求将请求参数放到请求网址
post请求将请求参数放到请求正文
服务器最终无非就要获取请求参数。getParameter()方法!
Servlet
看一下代码底层,HttpServlet最终实现的doGet和doPost都是基于顶层接口Servlet的service的抽象方法实现的
反射补充
类加载
在class文件加载到jvm中时,会对应创建一个Class对象;分为三个步骤:加载、连接、初始化
加载
将class文件加载到内存区域,对应生成一个Class对象
连接
验证:验证类的结构是否正确
准备:初始化静态成员
解析:将字节转换成jvm能够执行的引用(对象、变量、方法)
初始化
将对象中的成员变量初始化
加载时机
Class.forName("com.mysql.jdbc.Driver") : 将Driver类加载到jvm中的方法区
初始化Fahter类的子类Son类:Father类也会加载
Son类会使用到Father类中的成员变量,Father类中成员变量就需要进行初始化,就需要将Father加载到内存,子类要调用父类的构造方法。
类加载器
将class文件加载进内存,并生成对应的Class对象
根类加载器
加载java中的核心类,主要加载F:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar中的类
扩展类加载器
加载java中的扩展类,主要加载F:\Program Files\Java\jdk1.8.0_202\jre\lib\ext所有jar包中的类
系统类加载器
加载开发人员编写的自定义类、以及一些第三方的jar包中类
类反射机制
通过类的Class对象,动态去调用类中的属性和方法
获取Class对象方式
1.Class.forName("全类名")
2.类名.class
编译期内
3.成员对象.getClass()
运行期内
反射结合工厂模式
使用继承
解决代码的复用性
使用工厂模式
解决耦合度
使用反射机制
解决代码冗余
反射操作构造器
使用反射机制操作public、protected、默认、private的构造器
操作public的构造方法
1.获取类对象
2.使用类对象调用getConstructor()方法,返回一个构造函数的对象
3.使用构造函数对象调用newInstance()方法,获取成员对象
注意:在第二步的方法里可以添加有参构造函数的参数的类对象,然后在第三部方法里添加自己的实参,这样就获得了有参构造函数
操作非public的构造方法
1.获取类对象
2.使用类对象调用getDeclaredConstructor,返回构造函数的对象,返回那个构造函数具体看方法内的参数
3.暴力反射,使用获取的构造函数对象调用setAccessible(true)
4.使用构造函数调用newInstance(),获取成员对象
注意:在第二步的方法里可以添加有参构造函数的参数的类对象,然后在第三部方法里添加自己的实参,这样就获得了有参构造函数
反射操作成员变量
使用反射机制操作public、protected、默认、private的成员变量
操作public 修饰的成员变量
1.获取类对象,并获取成员对象
2.类对象调用getFiled(“成员变量名”)方法,返回的是成员变量对象
3.成员变量对象调用set(obj,value),obj是对于那个对象的成员变量操作,value是设置的成员变量的值
4.成员变量对象调用get(成员对象),获取成员变量对象修改的成员变量的值,没有修改就返回默认值
操作非public修饰的成员变量
1.获取类对象,并获取成员对象
2.类对象调用getDeclaredFiled(“成员变量名”)方法,返回的是成员变量对象
3.暴力反射,成员变量对象调用setAccessible(true)
4..成员变量对象调用set(obj,value),obj是对于那个对象的成员变量操作,value是设置的成员变量的值
5.成员变量对象调用get(成员对象),获取成员变量对象修改的成员变量的值,没有修改就返回默认值
反射操作成员方法
使用反射机制操作public、protected、默认、private的成员方法
操作public 修饰的成员方法
1.获取类对象和成员对象
2.类对象调用getMethod("方法名称","方法的参数类型的类对象"...),获取的是成员方法对象
传入是参数类型的类对象不是参数的类对象
3.成员方法对象调用invoke(成员对象,方法实参)
操作非public修饰的成员方法
1.获取类对象和成员对象
2.类对象调用getDeclaredMethod("方法名称","方法的参数类对象"...),获取的是成员方法对象
3.暴力反射,成员方法对象调用setAccessible(true)
4.成员方法对象调用invoke(成员对象,方法实参)
反射越过泛型检查
java中的泛型的作用范围在编译期,也就是说在运行时,是没有泛型的!
反射技术,可以在程序运行时,动态地调用List类中add方法,往集合中添加任意类型的元素。
运行时:new对象获得类对象,再用类对象操作泛型
反射结合配置文件
编写bean.properties,配置对象的唯一标识及对象的全类名,根据这段配置创建一个对象
操作方法跟JDBC差不多
获取自身流,拿到配置文件内的参数,获取类对象操作
静态代理设计模式
增强被代理类的功能
步骤
自定义类实现和被代理类相同的接口
在代理类中声明被代理类的对象
在代理类的方法中使用被代理类调用方法
特点:可以控制被代理类对象
作用:增强被代理类的功能
缺点:必须要重写被代理类接口的所有的方法(包括不需要增强的方法,增高了耦合性)
装饰者设计模式
增强被代理类的功能
步骤和静态代理类一个样,就是不能控制被代理类,需要在外部传入被代理类对象
缺点:必须要重写被代理类接口的所有的方法(包括不需要增强的方法,增高了耦合性)
作用:增强被代理类的功能
特点:不能控制被代理类对象
动态代理设计模式
基于接口的方法增强
实现
方式一:定义类实现InvocationHandler接口
方式二:使用匿名内部类实现InvocationHandler接口
接口内的三个 参数
1.不了解
2.被代理的原方法
3.被代理类的原方法的参数
主要步骤:
1.我们要先创建被代理类对象
2.使用Proxy.newProxyInstance方法
方法内部参数:1.获取被代理类的类加载器
2.获取被代理类的实现的所有接口
3.InvocationHandler接口实现类传入
优点:不需要重写接口所有的方法!
自定义连接池
需求:我们connection对象close时不是关闭资源,而是将资源放回连接池中
自己使用装饰者设计模式写一个连接池
1.我们先创建配置文件,将参数不全,然后再mysql数据库中创建对应的表
2.创建DButil类,用来复用获取数据库连接对象,以及关闭资源
3.创建MyConnection类实现Connection接口,声明Connection对象,重写所有方法,我们要增强close方法,声明我们的连接池也就是list集合,然后在有参构造方法中初始化我们声明的两个对象
传入Connection对象的原因是重写所有方法,以及将自身添加进集合,完成close操作
传入集合(连接池)就是将资源Connection加入连接池中
4.在close方法中,我们将list集合调用add方法将connection加入完成归还资源操作
5.创建连接池类,在取出连接的方法中,我们要讲增强代理类替代被代理类返回,这样我们在释放资源是调用的就是增强类中的close了
注意:在这里面被代理类就是原始的connection,增强类是我们自己写的MyConection类
缺点:要重写所有的Connection内的方法
使用动态代理写一个连接池
第1,2和上述一样
3.我们创建连接池类,在取出资源方法中使用动态代理,匿名内部类实现InvocationHandler接口
注意:使用动态代理获取的相当于是一个实现了被代理类接口的一个类的对象
request和response
概念
当浏览器发起请求后,服务器会创建一个请求对象、一个响应对象,通过service方法传入给Serlvet
作用
- equest对象处理请求信息(请求行、请求头、请求正文)
- response对象处理响应信息(响应行、响应头、响应正文)
- response对象处理响应信息(响应行、响应头、响应正文)
ServletRequest和HttpServletRequest的关系、ServletResponse和HttpServletResponse的关系?
- ServletRequest是HttpServletRequest的父接口,
- ServletResponse是HttpServletResponse的父接口,
- HttpServletRequest针对Http协议、HttpServletResponse针对Http协议
- ServletResponse是HttpServletResponse的父接口,
- HttpServletRequest针对Http协议、HttpServletResponse针对Http协议
reponse
操作响应行
- setStatus:操作正常响应状态码,比如:200、302
- sendError:操作错误响应状态码,比如: 404
- sendError:操作错误响应状态码,比如: 404
操作响应头
- setHeader:直接覆盖响应头原有值
- addHeader:在响应头原有值的后面追加
- addHeader:在响应头原有值的后面追加
_response操作重定向
重定向的流程
当浏览器访问一个资源Demo03Servlet,访问名称为“/demo03”
Demo03Servlet进行重定向
1.操作响应状态码302
2.操作响应头Location,服务器告诉浏览器,重定向的资源的访问路径
浏览器进行一个新的请求,完成重定向
response.sendRedirect("demo04");
response操作定时跳转
概念
- 一个资源定时一段时间之后,跳转到另外一个资源
- 操作响应头refresh
- 操作响应头refresh
案例
resp.setHeader("refresh","5;url=demo07");
在demo06中的doGet里面掉转到访问名称为demo07的里面
responese操作响应正文
响应正文:就是浏览器显示的主体内容
常用方法
response.getWriter().write():操作响应正文
用流将内容写出去
注意事项
响应正文会存在乱码
这是服务器的编码格式和浏览器的解码格式不同意造成的
response.setCharacterEncoding("utf-8"):
告诉服务器应该用utf-8进行编码
response.setHeader("Content-Type","text/html;charset=utf-8");
告诉浏览器用utf-8进行解码
setContentType("text/html;charset=utf-8")
告诉服务器应该用utf-8进行编码
告诉浏览器 , 响应正文是文本+html标签,应该以utf-8格式解码响应正文
request
request操作请求行
常用方法
getRequestURI
获取请求路径
访问项目的绝对路径
/day15/demo02
getMethod
获取请求方式
getRemoteAddr
获取请求ip
getLocalPort
获取请求端口
getQueryString
请求网址"?"后面的路径
getContextPath
获取项目名称
/day15
request操作请求头
getHeader()
获取指定请求头的值
User-Agent
判定请求是由哪种浏览器发起
request操作请求参数
请求正文
post+请求参数
get请求
请求参数
不管是get请求 还是 post请求 都有!!!
常用方法
getParameter(xxx)
获取指定请求参数的值
getParameterNames
获取所有请求参数名称
getParameterValues(String parameterName)
获取指定请求参数所有值
getParameterMap
键,获取所有请求参数名称 , 相当于getParameterNames方法
值,获取指定请求参数所有值,相当于getParameterValues方法
结合entrySet
获取的set集合内存的是map集合的视图,也就是每一个值就是一个键值对合成的值
中文乱码
请求参数中文乱码之post
本质
请求正文中的中文参数乱码
解决乱码方法
setCharacterEnconding(utf-8)
告诉服务器应该以utf-8解码请求正文
逆向,先编码在解码
先将乱码字符串以iso8859-1编码成字节
将字节以utf-8解码成字符串
具体实现代码
username = new String(username.getBytes("iso8859-1"),"utf-8");
请求参数中文乱码之get
本质
Query String中的中文参数乱码
解决乱码方法
逆向,先编码在解码
先将乱码字符串以iso8859-1编码成字节
将字节以utf-8解码成字符串
具体实现代码
username = new String(username.getBytes("iso8859-1"),"utf-8");
修改tomcat容器的URIEncoding="utf-8"
config-server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="utf-8"
redirectPort="8443" />
connectionTimeout="20000"
URIEncoding="utf-8"
redirectPort="8443" />
请求参数中文乱码终极解决方案
方案
get请求乱码最终版本
tomcat8.5
- 相当于是tomcat7.0修改了URIEncoding="utf-8"
- 就解决了get请求参数中文乱码问题
- 就解决了get请求参数中文乱码问题
post请求乱码最终版本
request.setCharacterEncoding("utf-8")
就解决了post请求参数中文乱码问题
注意事项
将tomcat容器的URIEncoding="utf-8",对Query String中的请求参数有效,对请求正文中无效,对post请求下的中文乱码无效!
request操作请求转发
请求转发
从服务器内的一个资源跳转到另一个资源
流程
1.浏览器发起请求,请求Demo01Servlet
2.Demo01Servlet,请求转发到Demo02Servlet
3.在服务器内部,直接从Demo01Servlet跳转到了Demo02Servlet
注意:转发浏览器只请求了一次
请求转发和重定向的区别
请求次数
转发一次
重启向两次
跳转区别
重定向既可以站内资源进行跳转,站外资源也可以进行跳转
转发只能跳转站内资源
站内资源为:项目内的所有资源
站外资源为:项目之外的资源,比如百度
路径区别
要转发的资源的相对路径无区别
要转发的资源的绝对路径有区别
重定向,是从先从项目开始找,再找资源
转发,是直接从项目中找资源
request作为域对象
域对象
可以存储数据的对象
回顾ServletContext域对象的作用范
不同设备、当前项目中的任意一个资源都可以访问ServletContext域中的数据!
不同设备为不同的浏览器
request域对象的作用范围
request对象的生命周期
发起请求时,request初始化
响应就销毁
request域对象的作用范围在一次请求中!
request在重定向和转发中使用!
重定向中不能使用request域对象
转发中可以使用request域对象
过滤器
概念
过滤器就是一个用于在请求之前处理资源的组件
生命周期
- 随着服务器启动而初始化
- 随着请求的发出而过滤
- 随着服务器关闭而销毁
- 随着请求的发出而过滤
- 随着服务器关闭而销毁
执行流程
- 浏览器发起请求
- 服务器会根据这个请求,创建request对象及response对象
- 过滤器会持有request对象及response对象
- 只有当过滤器放行之后,request对象及response对象才会传给Serlvet
- 服务器会根据这个请求,创建request对象及response对象
- 过滤器会持有request对象及response对象
- 只有当过滤器放行之后,request对象及response对象才会传给Serlvet
过滤器链
根据配置顺序,遵从"先过滤,后放行"的原则!
过滤器的基本使用
开发步骤
自定义类实现Filter接口
重写init、doFilter、destroy方法
在web.xml中配置过滤器
- 声明过滤器
- 过滤器配置过滤路径
- 过滤器配置过滤路径
过滤器的相关配置
初始化参数
在web.xml中声明过滤器的里面,添加标签<init-param>
Filter的过滤路径
完全匹配
配置路径和访问路径完全一直
目录匹配
如:/day15/*
访问day15下面的文件就过滤
后缀名匹配:
必须以"*"开头,以后缀名结尾
过滤器的注解开发
@WebFilter注解
WebInitParam[] initParams() default {};
- 配置初始化参数
- 配置初始化参数
- String filterName() default "";
- 配置过滤器名称
- String[] servletNames() default {};
- 配置过滤的Servlet
- String[] urlPatterns() default {};
- 配置过滤路径
- 配置过滤器名称
- String[] servletNames() default {};
- 配置过滤的Servlet
- String[] urlPatterns() default {};
- 配置过滤路径
执行顺序
- 按照过滤器的类名的字典顺序决定谁先过滤,谁先放行!
- 比如AFilter、BFilter,那么AFilter就会先过滤,BFilter会先放行!
- 比如AFilter、BFilter,那么AFilter就会先过滤,BFilter会先放行!
过滤器实现登录案例步骤
1.准备登录界面,登录处理代码,登录后的处理代码,过滤器的设置,以及bean里的对象User
2.登录处理代码
1.获取当前用户输入的账号密码与我们自己设置的进行判断
1.成功,我们将用户名和密码存入到User对象中,并将User对象放入session中(修改登录状态),并且判断我们是否选择了七天自动登录复选框,选择了的话我们将用户的账号和密码存入到cookie中并设置cookie的存活时长为7天,并且我转发到登陆后处理代码
1.获取对象的登录状态,进行判断是否存在登录状态
1.存在,我们向页面输出用户名+欢迎回来字符串
2.不存在.我们跳转到登录界面,进行登录
为什么会不存在登录状态,因为我们有可能一开始就进行对登录后处理代码的访问,这样我们就不存在登录状态
2.不成功,就转发到登陆界面
3.在过滤器中我们进行自动登录的设置
1.访问的登录界面的时候,我们直接放行让她去访问
2.不是访问登录界面的时候
1.判断当前是否存在登录状态
存在,就直接放行
不存在
1.判断所有cookie有你没有我们要的cookie
1.有,我们将cookie中的值,来和我们指定的账号密码进行对应
1.对应相等,我们修改登录状态(将设置好的User对象,放入session中),放行
2.不相等,我么你跳转到登录界面
2.没有,直接跳转到登录界面
cookie就是自动登录的关键,cookie只有当我们选择了7填登录复选框,并且成功登录才会存在我们浏览器中
过滤器实现敏感词屏蔽
主要思路是,在过滤器中处理请求对象中携带的内容,看内容是否有我们自己定义的敏感词,有的话替换成***然后再放行
主要还是我们Parameter方法进行处理的,我们采用动态代理对Parameter方法加强,让他可以处理敏感词
然后我们对于加强了Parameter方法的request对象放行回去
JSP
为什么要引入jsp?
html文件无法获取java程序中的数据,同时,如果使用Servlet来显示java数据又显得不太合理!
什么是jsp
jsp:java server page
简单理解为,它就是一个可以获取java数据的html文件。
jsp相关概念
jsp为什么是一个Servlet
jsp文件会转义成对应的java文件
比如: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标签作为响应正文响应给浏览器进行渲染显示!
jsp脚本
作用
可以在页面上写java代码
分类
声明脚本
<%! Java代码%>
在jsp对应java类中,生成一个成员变量
片段脚本
<%Java代码%>
在jsp对应的java类的_jspService方法中,生成一个局部变量
输出脚本
<%=变量值%>
向浏览器输出内容,相当于response.getWriter().write()
jsp注释
概念
jsp文件中,既可以有html代码,也可以有java代码
这就意味着,jsp文件中,既可以使用html注释,也可以使用java注释,同时还可以使用jsp注释
jsp指令
作用
用于指示jsp执行某些操作 、用于指示jsp表现特定行为或效果
<%@ 指令名称 属性名1="属性值1" 属性名2="属性值2" %>
分类
taglib
作用
在当前jsp页面中导入jstl标签库
格式
<%@taglib prefix="前缀" uri="路径" %>
应用场景
导入jstl标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
include
作用
用于将外部引入到jsp文件中
基本使用:<%@ include file="top.jsp"%>
page
代码实现
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" errorPage="error.jsp" %>
<%@ page isErrorPage="true" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" errorPage="error.jsp" %>
<%@ page isErrorPage="true" %>
属性值
contentType="text/html;charset=UTF-8"
- 告诉浏览器应该以utf-8解码响应正文,告诉服务器应该以utf-8对响应正文进行编码
- 告诉浏览器应该以utf-8解码响应正文,告诉服务器应该以utf-8对响应正文进行编码
language="java"
- 设置jsp页面能够使用的语言,不动!
- 设置jsp页面能够使用的语言,不动!
import="java.util.List"
- 在当前jsp页面中导入List类
- 在当前jsp页面中导入List类
isELIgnored="false"
- 当前jsp页面不要忽略el表达式,默认就是不忽略
- 当前jsp页面不要忽略el表达式,默认就是不忽略
errorPage="error.jsp"
- 当前jsp页面发生异常,所要跳转到页面
- 当前jsp页面发生异常,所要跳转到页面
- isErrorPage="true"
- 标记当前jsp页面是否是一个错误页面,如果为true那么就可以使用jsp内置对象exception,否则不能使用
- 标记当前jsp页面是否是一个错误页面,如果为true那么就可以使用jsp内置对象exception,否则不能使用
jsp内置对象
什么是jsp内置对象?
可以在jsp页面上直接使用的对象
九大内置对象
page
当前页面对象,java.lang.Object
out
JspWriter对象,javax.servlet.jsp.JspWriter
config
ServletConfig对象,javax.servlet.ServletConfig
request
请求对象,javax.servlet.http.HttpServletRequest
response
响应对象,javax.servlet.http.HttpServletResponse
pageContext
当前页面上下文对象,javax.servlet.jsp.PageContext
exception
异常对象,java.lang.Throwable
application
ServletContext对象,javax.servlet.ServletContext
session
会话对象,javax.servlet.http.HttpSession
使用事项
在jsp对应的java文件中,已经提前声明好了这些内置对象,所以可以直接使用。
使用方式跟servlet里面的使用方式一样
jsp内的四大域对象
pageContext
1.获取九大内置对象
2.操作域
范围:仅限于本页面
操作其他域
request
pageContext.getAttribute("msg1", PageContext.REQUEST_SCOPE);
session
<% pageContext.setAttribute("msg","hello",pageContext.SESSION_SCOPE)%>
application
pageContext.setAttribute("msg3","hello page3",PageContext.APPLICATION_SCOPE);
request
使用方式和以前一样
session
使用方式和以前一样
application
使用方式和以前一样
el表达式
概念
格式
${表达式}
el(expression language),是由jsp内置提供
作用
向页面输出数据
获取web对象
注意事项
- - 如果page指令中isELIgnored="true",jsp页面就不会解析执行el表达式,会原样显示!!!
默认为false
基本操作
el获取域数据基本使用
获取page域数据
<%
pageContext.setAttribute("msg1","hello page1");
%>
${pageScope.msg1}
pageContext.setAttribute("msg1","hello page1");
%>
${pageScope.msg1}
获取request域数据
<%request.setAttribute("msg1","hello page1");%>
${requestScope.msg1}
${requestScope.msg1}
获取session域数据
<%session.setAttribute("msg1","hello page1");%>
${sessionScope.msg1}
${sessionScope.msg1}
获取application域数据
<%application.setAttribute("msg1","hello page1");%>
${applicationScope.msg1}
${applicationScope.msg1}
el获取复杂域数据
获取数组
<%--el表达式操作数组--%>
<%
String[] msgs = {"小明","小红"};
pageContext.setAttribute("msgs",msgs);
%>
<%=
((String[])pageContext.getAttribute("msgs"))[0]
%>
${msgs[1]}<br>
<%
String[] msgs = {"小明","小红"};
pageContext.setAttribute("msgs",msgs);
%>
<%=
((String[])pageContext.getAttribute("msgs"))[0]
%>
${msgs[1]}<br>
获取单链集合(List)
<%--el表达式操作list集合--%>
<%
List<String> list = new ArrayList<>();
list.add("哈哈");
list.add("呵呵");
request.setAttribute("msg1",list);
%>
<%=
((List<String>)request.getAttribute("msg1")).get(0)
%>
${msg1[1]}<br>
<%
List<String> list = new ArrayList<>();
list.add("哈哈");
list.add("呵呵");
request.setAttribute("msg1",list);
%>
<%=
((List<String>)request.getAttribute("msg1")).get(0)
%>
${msg1[1]}<br>
获取双链集合(Map)
<%--el表达式操作map集合--%>
<%
HashMap<String, String> map = new HashMap<>();
map.put("username","wang");
//返回值相同键被顶掉的的值
String password = map.put("password", "123");
// System.out.println(password);
session.setAttribute("msg2",map);
%>
<%=
((HashMap<String,String>)session.getAttribute("msg2")).get("username")
%>
${msg2.password}<br>
<%
HashMap<String, String> map = new HashMap<>();
map.put("username","wang");
//返回值相同键被顶掉的的值
String password = map.put("password", "123");
// System.out.println(password);
session.setAttribute("msg2",map);
%>
<%=
((HashMap<String,String>)session.getAttribute("msg2")).get("username")
%>
${msg2.password}<br>
获取Java对象
<%--el表达式操作java对象--%>
<%
User user = new User();
user.setId(1);
user.setUsername("Tom");
user.setPassword("123");
application.setAttribute("user",user);
%>
<%=
((User)application.getAttribute("user")).getId()
%><br>
${user.password}
<%
User user = new User();
user.setId(1);
user.setUsername("Tom");
user.setPassword("123");
application.setAttribute("user",user);
%>
<%=
((User)application.getAttribute("user")).getId()
%><br>
${user.password}
el表达式执行运算
算术运算
+,-,*,/(div),%(mod)
关系运算
>(gt),>=(ge),<(lt),<=(le),==(eq),!=(ne)
逻辑运算符
与(and),&&
或,or ||
非 ,not !
三元运算符
${num1 gt num2 ? "num1大于num2" : "num1不大于num2"}
el表达式中web对象
pageScope
pageContext域对象
requestScope
request域对象
sessionScope
session域对象
applicationScope
application域对象
param
相当于request.getParameter()
paramValues
相当于request.getParameterValues()
header
获取单个请求头值
headerValues
获取一组请求头的值
initParam
获取初始化参数
cookie
Map<String,Cookie>,键是cookie名称,值是cookie对象
pageContext
相当于pageContext对象,获取jsp九大内置对象
jstl库
概述
jstl (java standard tag libarary)
和el表达式结合使用,可以让功能更加强大!
环境准备
导入jar包
jstl.jar
standard.jar
standard.jar
在jsp页面导入jstl标签库
使用taglib指令
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl核心6个标签
set标签
相当于 域对象.setAttrbute()方法
向域对象(page域、request域、session域、application域)中存储数据
属性
var:参数名称
value:参数值
scope:域名称
remove标签
相当于 域对象.removeAttrbute方法
移除域对象中的数据
属性
var:参数名称
scope:域
catch标签
捕获异常
捕获jsp页面的异常,相当于try...catch
属性
var:声明异常对象名称,比如:var="e" ,变量e就可以接收异常对象
if标签
条件判断
属性
test:编写条件
forEach标签
遍历集合或者数组
属性
var:元素名称
begin:开始
end:结束
step:步长
items:集合或者数组
varStatus
current:当前元素
index:当前元素下标(开始)
first:是否为第一个元素
last:是否为最后一个元素
count
从开始计数
用法
<c:forEach items="$ { atts }" var="item" varStatus="s">
<h2><c:out value="$ { item }"/>的四种属性:</h2>
index:$ {s.index}</br>
count:$ {s.count}</br>
first:$ {s.first}</br>
last:$ {s.last}</br>
</c:forEach>
<h2><c:out value="$ { item }"/>的四种属性:</h2>
index:$ {s.index}</br>
count:$ {s.count}</br>
first:$ {s.first}</br>
last:$ {s.last}</br>
</c:forEach>
forToken标签
分割字符串
jsp设计模式
Mode1
所有的操作都在在jsp页面中进行
开发简单,维护难
Mode2
处理请求,业务处理,数据交互在servlet中操作
显示页面在jsp中操作
优缺点:开发较难,维护简单
BeanUtils框架
概念
可以将请求参数封装到java对象中
开发步骤
1.导入jar包
直接使用
注意事项
页面上的name属性值要和java对象中的属性名一致!
MVC设计模式
概念
它是一种软件设计典范,用一种业务逻辑,数据,界面分离的方式来组织代码,将业务逻辑聚集 到一个部件中,方便程序的重复使用,提高我们的开发效率。
jsp的model2模式是mvc设计模式的一种!!
组成
m
model:数据的封装
v
view:显示页面
c
controller
请求处理
servlet
业务处理
service
操作数据库
dao
弊端:c中的功能太多,冗余
三层架构完善mvc模式
c
controller:请求处理
service:业务处理
dao:操作数据库
分页查询
逻辑分页
一次性将所有数据查询出来,保存到List集合中,后续,如果有分页请求,再对List集合进行拆分
优缺点
- 优点:减少了操作数据库的次数
- 缺点:单次查询数据库的时间过长
- 缺点:单次查询数据库的时间过长
物理分页
不是一次性将所有数据全部查询出来.查询第一页:发送一条查询10条的SQL语句.查询下 一页数据:又发送一条查询后10条的SQL语句.
优缺点
- 优点:单词查询数据库的时间非常短
- 缺点:操作数据库的次数增加
- 缺点:操作数据库的次数增加
sql语句
select * from 表名 limit ? , ?
第一个?:开始查询脚标(从0开始)
第二个?:查询多少个
分页记录的数据
- 当前页数(currentPage)
- 总页数(totalPage)
- 总记录数(totalSize)
- 每页记录数(pageSize)
- 当前页数据(list)
- 总页数(totalPage)
- 总记录数(totalSize)
- 每页记录数(pageSize)
- 当前页数据(list)
步骤
我们需要将上述五条数据封装在一起并储存到域中,然后返回jsp页面
我们的封装操作要在service层做
文件上传概念及原理
概念
本质就是将一台电脑中的文件根据网络协议通过io流传递到另外一台电脑(服务器)上。
网络编程
ip
电脑在网络中的唯一标识
port(端口))
软件在电脑中的唯一标识
协议
不同设备进行沟通的规则!
文件上传和下载
文件上传三要素
method="post"
enctype="multipart/form-data"
<input type="file" name="file"/>
文件上传后台代码
概念
就是将本地电脑中的文件上传到服务器中的磁盘中
开发步骤
创建磁盘文件项工厂对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
创建核心解析对象
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
解析上传请求
如果是描述文本,直接打印
如果是上传文件,就进行io读写
详情代码请看day26
文件上传常用API
ServletFileUpload类
parseRequest
解析请求,获取文件项
setHeaderEncoding
解决文件名中文乱码
FileItem类
isFormField
判断是否是普通上传项。返回值为true,那么是普通上传项,否则是文件上传项
getFieldName
获取字段名称
<input name=?>
就是name的名称
getString(String encoding)
获取描述文本,指定编码格式
getName
获取上传文件名称
getInputStream
获取上传文件对应的输入流
文件下载基本功能
概念
将服务器中的文件通过网络通信协议传输到本地电脑中
步骤
设置媒体类型
告诉浏览器下载文件的类型
操作响应头"Content-Type"
String mimeType = request.getServletContext().getMimeType(fileName);
System.out.println(mimeType);
response.setContentType(mimeType);
System.out.println(mimeType);
response.setContentType(mimeType);
设置下载窗口
操作响应头“Content-Disposition”
response.setHeader("Content-Disposition","attachement;filename="+fileName);
IO流读写
下载文件中文乱码
不同浏览器对文件名称的编码方式不同,所以需要区分不同的浏览器
//不同的浏览器对文件名称的编码方式不同,以google浏览器为代表的是以utf-8对文件名称进行编码
//其他的一些浏览器以base64对文件名称进行编码
//判断使用的浏览器的类型User-Agent
String userAgent = request.getHeader("User-Agent");
String newFileName = null;
if (userAgent.contains("Chrome")) {
//以utf-8进行编码
newFileName = URLEncoder.encode(fileName,"utf-8");
} else {
//以base64进行编码
newFileName = base64EncodeFileName(fileName);
}
//其他的一些浏览器以base64对文件名称进行编码
//判断使用的浏览器的类型User-Agent
String userAgent = request.getHeader("User-Agent");
String newFileName = null;
if (userAgent.contains("Chrome")) {
//以utf-8进行编码
newFileName = URLEncoder.encode(fileName,"utf-8");
} else {
//以base64进行编码
newFileName = base64EncodeFileName(fileName);
}
自定义文件上传
概念
将本地电脑中的文件通过网络通信协议传输到服务器中!
文件上传原理
发送端
使用本地输入流读取本地电脑中文件
使用网络通信的输出流将本地输入流中的内容传输到服务器电脑
接收端
使用网路通信的输入流读取上传的问题的数据
- - - 使用本地输出流将上传文件的数据写出到服务器的文件中
自定义文件上传优化
问题
接收端接受一次文件,接受程序就会结束!
如果后续还有用户需要上传文件就会失败!
引入循环
当用户上传了一个大文件,耗时10分钟,那么在这10分钟内,其他用户是无法上传文件的!
引入多线程
ajax异步上传
准备
导入两个js库
ajaxfileupload.js
ajaxupload.js
应用
主要用于图片的异步上传
具体代码
$.ajaxFileUpload({
url: '${pageContext.request.contextPath}/img?methodName=uploadImg',
secureuri: false,
fileElementId: 'hotelImg',
dataType: 'json',
data: {},
success: function (data, status) {
if (data.flag) {
$("#picUrl").val(data.picUrl);
$('#viewImg').attr('src', "${pageContext.request.contextPath}/" + data.picUrl);
}
}
}
)
url: '${pageContext.request.contextPath}/img?methodName=uploadImg',
secureuri: false,
fileElementId: 'hotelImg',
dataType: 'json',
data: {},
success: function (data, status) {
if (data.flag) {
$("#picUrl").val(data.picUrl);
$('#viewImg').attr('src', "${pageContext.request.contextPath}/" + data.picUrl);
}
}
}
)
语法
语法:$.ajaxFileUpload([options])
options参数说明:
1、url:上传处理程序地址。
2,fileElementId: 需要上传的文件域的ID,即<input type="file">的ID。
3.secureur:是否启用安全提交,默认为false。
4,dataType:服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
5,success:提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
6,error:提交失败自动执行的处理函数。
7,data :自定义参数。这个东西比较有用,当有数据是与上传的图片相关的时候,这个东西就要用到了。
8, type : 当要提交自定义参数时,这个参数要设置成post
JavaScript
概念
JavaScript是一门脚本语言
脚本语言
不需要编译,直接就可以被浏览器解析执行.
组成
由ECMAScript、BOM、DOM组成
ECMAScript和页面结合
概念
JavaScript是一门脚本,要起作用,必须结合页面使用
分类
内部结合
直接在页面文件中编写script标签,将js代码编写到script标签内容中
外部结合
在页面文件中使用script标签的src属性引入外部的js文件
ECMAScript之注释
单行注释
//注释
多行注释
/*注释*/
ECMAScript之数据类型
number
整数、小数、NaN(not a number)
string
字符串("abc"、'abc')
boolean
true、false
null
空对象
undefined
定义一个变量,但是没有赋初值
引用数据类型
js对象
ECMAScript之变量
概念
提高复用性,提高可维护性!
java是强类型语言,JavaScript是弱类型语言
强类型语言
在定义变量时,要确定数据类型,在赋值时,只能赋值指定类型的数据
弱类型语言
在定义变量时,不确定数据类型,在赋值时,赋值多种类型的数据
格式
var 变量名 = 值;
ECMAScript之typeof方法
查看数据的类型
用法
typeof(值)
ECMAScript运算
一元运算符
++,-- , +(正号)
算术运算符
+ ‐ * / %
赋值运算符
= += ‐=
比较运算符
> < >= <= == ===(全等于)
逻辑运算符
&& || !
三元运算符
flag ? "为true":"为false"
流程控制语句
if...else...
switch:
在java中,switch语句可以接受的数据类型: byte int shor char,枚举(1.5) ,String(1.7) 在JS中,switch语句可以接受任意的原始数据类型
while
do...while
for
ECMAScript基本对象
Function
var 方法名 = new Function("形式参数列表","方法体");
注意事项
- 不需要返回值类型
- 形参不需要参数类型
- 如果方法定义了形参,调用时,可以不传递实际参数!
- 形参不需要参数类型
- 如果方法定义了形参,调用时,可以不传递实际参数!
Array
概念
Array 对象用于在单个的变量中存储多个值。
创建
var arr1 = new Array("a","b","c");
var arr2 = ["a","b","c"];
var arr2 = ["a","b","c"];
常用属性
length
常用方法
join
用于把数组中的所有元素放入一个字符串。(可在方法中添加字符)
pop
用于删除并返回数组的最后一个元素。
push
可向数组的末尾添加一个或多个元素,并返回新的长度。
Boolean
Date
概念
Date 对象用于处理日期和时间。
常用方法
toLocaleString
获取本地的当前时间
getFullYear
获取年份
getMonth
获取月份,范围:0~11
getDate
获取天
getHours
获取小时
getMinutes
获取分钟
getSeconds
获取秒
getTime
获取对应的毫秒值
Number
String
RegExp
概念
RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
创建
var reg = /^正则表达式$/
var reg1 = /^[a]{3}$/;
console.log(reg1.test("aaaa"));
console.log(reg1.test("aaaa"));
Global(全局函数对象)
ECMAScript之全局对象
概念
全局属性和函数可用于所有内建的 JavaScript 对象。
常用方法
parseInt
将数字字符串转换成数字
isNaN
判断变量是否是一个NaN
eval
将json字符串转换成js对象,方便调用属性
Json介绍
概念
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
它基于ECMAScript的 一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习 惯。这些特性使JSON成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析 和生成(网络传输速率)。
语法
单一对象
- - {"属性名1":"属性值1" , "属性名2":"属性值2"}
- 多个对象
[{"属性名1":"属性值1" , "属性名2":"属性值2"} , {"属性名1":"属性值1" , "属性名2":"属性值2"}]
解释
- 数据在键值对里面
-数据之间由逗号分隔
- 大括号保存对象
-中括号保存数组
Json值
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
java对象自动转成json字符串
1.导入jar包
2.创建ObjectMapper对象
3.调用writeValueAsString方法
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)
flag:为true就是异步请求;否则为同步请求
send
发送参数
setRequestHeader
- 设置请求头
ECMAScript之方法
方式一
function 方法名(形参列表) {
方法体;
}
方法体;
}
方式二
var 方法名 = function(形参列表){
方法体
}
方法体
}
方式三
var 方法体 = new Function("形参列表","方法体");
注意事项
- - 在方法中,有一个内置对象arguments,包含所有的实际参数
ECMAScript之事件
概念
- 事件源:发生事件的源头
- 监听器:发生事件后触发的组件
- 事件绑定:将事件源和监听器关联
- 事件:能够触发监听器的事
- 监听器:发生事件后触发的组件
- 事件绑定:将事件源和监听器关联
- 事件:能够触发监听器的事
事件注册
使用标签中的事件属性
使用js的dom分配
document获取标签对象,然后调用事件
常用事件
onclick
监听鼠标点击了
onload
监听页面或图片加载完成
onfocus
监听获取焦点
onblur
监听失去焦点
onkeydown
监听键盘按下
onkeyup
监听键盘松开
onmousedown
监听鼠标按下
onmouseup
监听鼠标松开
onmousemove
监听鼠标移动
onchange
监听内容改变
onsubmit
监听表单提交
BOM
bom : browser object model,浏览器对象模型
分类
window
作用
跳转页面
location
获取其他bom对象
显示警告框
alert
显示确认框
confirm
显示输入框
prompt
关闭窗口
close
常用属性
location
获取location对象跳转页面
Navigator
获取浏览器信息对象
screen
获取屏幕信息的对象
document
获取文档对象
history
获取历史记录对象
常用方法
alert
显示警告框
confirm
显示确认框
prompt
显示输入框
close
关闭页面
注意:close方法:Scripts may close only the windows that were opened by it,能够关闭的页面是由该页面打开的其他页面。
setInterval
setInterval(code,millisec):设置重复动作
code:重复调用的代码
millisec:重复间隔时间,单位为毫秒
返回值是重复对象
clearInterval
clearInterval(id_of_setinterval):清除重复动作
id_of_setinterval:重复对象的id
setTimeout
setTimeout(code,millisec):设置延迟动作
code:延迟调用的代码
millisec:延迟时间
返回值是延迟对象
clearTimeout
clearTimeout(id_of_settimeout):请求延迟动作
id_of_settimeout:延迟对象的id
延迟和重复的区别是
延迟只会调用一会代码而重复是无限调用
Navigator
获取浏览器信息对象
screen
location
概述
Location 对象包含有关当前 URL 的信息。
常用属性
href
设置或返回完整的 URL。
常用方法
reload
刷新当前页面
history
概述
History 对象包含用户(在浏览器窗口中)访问过的 URL。
常用方法
back
加载 history 列表中的前一个 URL。
forward
加载 history 列表中的下一个 URL。
go
加载 history 列表中的某个具体页面。
go(-1):相当于back方法
go(1):相当于forward方法
XML DOM
dom : document object model,文档对象模型
分类
Xml DOM
既可以操作xml文件,也可以操作html文件
HTML DOM
只能操作html文件
常用对象
decument对象
概念
Document 对象是一棵文档树的根,可为我们提供对文档数据的最初(或最顶层)的访问入口。
作用
创建元素节点、文本节点、属性节点、注释节点
获取元素节点
常用方法
createElement
创建元素节点对象
createTextNode
创建文本节点对象
createAttribute
创建属性节点对象
getElementById
根据id获取元素节点对象
getElementsByTagName
根据标签名称获取一组元素节点对象
element对象
概述
Element 对象表示 XML 文档中的元素。元素可包含属性、其他元素或文本。如果元素含有文本,则在文本节点中表示该文本。
作用
操作该元素中的属性节点
操作该元素中的子元素节点
操作该元素中的文本节点
常用方法
getAttribute
返回指定属性的值
setAttribute
设置属性值
removeAttribute
移除指定属性
getElementsByTagName
根据标签名称获取一组子孙元素
appendChild
操作子节点(子元素、属性、文本)
注意事项
getAttribute方法获取属性值,必须显式地设置在标签上!
Node对象
概念
Node对象是整个 DOM 的主要数据类型。
Node对象可以是元素节点、属性节点、文本节点。
常用属性
childNodes
获取父节点下所有的子节点组成的数组(子节点有元素节点,文本节点)
firstChild
获取父节点下第一个子节点
lastChild
获取父节点下最后一个子节点
nodeType
获取节点的类型
类型
1:元素
2:属性
3:文本
8:注释
9:文档
parentNode
获取子节点的父节点对象
常用方法
appendChild
var textNode = document.createTextNode("学好java");
childDiv.appendChild(textNode);
子div 包含 ”学好java”
removeChild
移除父节点下指定的子节点
说明:元素就是标签,属性就是标签内的属性
代码案例,看day31
Html DOM
概念
HTML DOM 定义了访问和操作HTML文档的标准方法。
HTML DOM 把 HTML 文档呈现为带有元素、属性和文本的树结构(节点树)。
常用对象
document对象
getElementById
getElementByTagName
innerHTML、innerText
innerHTML
用于往标签中插入内容(包含html标签)、解析html标签
innerText
用于往标签中插入内容(包含html标签)、不能解析html标签
去翻一翻API,太多常用对象和属性方法了
代码案例,看day31
补充方法
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
javascript:void(0)
作用于超链接,href属性,是超链接属性,禁用href
jQuery
概述
JQuery是一个JS的类库文件
作用
可以简化遍历HTML文 档、操作DOM、处理事件、执行动画、开发Ajax等操作
使用
开发流程
导入jquery的js文件到项目中
在页面中使用script标签引入外部的jquery文件
使用jquery语法操作元素
jquery对象和js对象
jquery对象能否直接使用js对象的属性和方法?
不能!
js对象能否直接使用jquery对象的属性和方法?
不能!
jquery对象和js对象的相互转换
js对象 -> jquery对象
$(js对象)
jquery对象 -> js对象
jquery对象.get(0)
jquery对象[0]
jquery选择器介绍及分类
概念
jquery操作都需要依赖于选择器
可以让jquery代码锁定指定的元素
- - 不仅能简化代码,而且可以达到事半功倍的效果
分类
基本选择器
id选择器
$("#id")
类选择器
$(".class")
标签选择器
$("元素名")
通用选择器
$("*")
层次选择器
从父子关系、兄弟关系来选择页面上节点
$("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标签
注意:脚标是从0开始的
内容过滤选择器:
从内容来对页面的标签进行过滤选择
$("tagName:contains('aaa')")
选中内容包含"aaa"的tagName元素
$("tagName:empty")
选中没有任何内容的tagName元素
$("tagName:has(.one)")
tagName中是否包含一个class为one的子元素,如果有就选中tagName
属性过滤选择器
从属性的角度来对页面的标签进行过滤选择
$("tagName[id]"):
选取含有属性id的tagName元素
$("tagName[id='cc']"):
选取属性id值为"cc"的tagName元素
$("tagName[id!='cc']"):
选取属性id值不为"cc"的tagName元素
$("tagName[title^='cc']"):
选取属性title值以"cc"开头的tagName元素
$("tagName[title='cc']"):
选取属性title值以"cc"结束的tagName元素
$("tagName[title*='cc']")
选取属性title值包含"cc"的tagName元素
$("tagName[title*='cc'][name='ee'][id!='ff']");
选取title属性包含"cc",name属性值为"ee",id属性值不为"ff"的tagName
子元素过滤选择器
从父子关系对标签进行过滤选择
$("tagName :nth-child(2)"):
tagName元素下的第二个子元素(脚标从1开始)
$("tagName :first-child"):
tagName元素下的第一个子元素
$("tagName :last-child"):
tagName元素下的最后一个子元素
$("tagName :only-child"):
tagName元素下的仅仅只有一个子元素,那么选中这个子元素
补充选择器
:checked
选取所有选中的复选框或单选按钮。
jquery的dom操作
常用方法
html()
设置/获取标签内容,解析html标签,相当于innerHTML
text()
设置/获取标签内容,不解析html标签,相当于innerText
val()
设置/获取value属性值,相当于value属性
attr()
设置/获取属性值,相当于setAttribute/getAttribute
removeAttr()
移除属性,相当于removeAttribute
jQuery事件
概念
jQuery 事件处理函数是 jQuery 中的核心函数。
语法
jquery对象.事件函数
事件函数
click
js事件去掉on
在事件函数里面写出发事件调用的方法
事件绑定
方式一
jquery对象.事件名(function(){
});
});
方式二
jquery对象.bind("事件名",function(){
});
});
jquery的遍历
语法
方式一
内置对象this:当前元素对象,是一个js对象
jquery数组对象.each(function(index,element){
});
});
方式二
$.each(jquery数组对象,function(index,element){
});
});
jquery的异步请求
概念
jQuery 提供了供 AJAX 开发的丰富函数(方法)库。
通过 jQuery AJAX,使用 HTTP Get 和 HTTP Post,您都可以从远程服务器请求 TXT、HTML、XML 或 JSON。
分类
$.ajax(options)
把远程数据加载到 XMLHttpRequest 对象中
$.ajax(options) 是低层级 AJAX 函数的语法。
$.ajax 提供了比高层级函数更多的功能,但是同时也更难使用。
option 参数设置的是 name|value 对,定义 url 数据、密码、数据类型、过滤器、字符集、超时以及错误函数。
常用参数
async
设置是否为异步请求
true为异步 ,默认为这个
false为同步
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
获取异步请求对象
常用属性
data、dataType、success、type、url
$.get(url,data,callback,type)
使用 HTTP GET 来加载远程数据
url
请求服务器资源的路径
data
请求参数,遵守json格式(键值对)
callback
请求成功后,回调的函数
type
服务器响应给浏览器的数据类型(html,xml,json,jasonp,script,text)
$.post(url,data,callback,type)
使用 HTTP POST 来加载远程数据
type
服务器响应给浏览器的数据类型(html,xml,json,jasonp,script,text)
callback
请求成功后,回调的函数
data
请求参数,遵守json格式(键值对)
url
请求服务器资源的路径
方法
serialize
将表单提交的数据序列化成字符串
说明:异步请求就是模仿表单提交
代码代码看day33
lombok
给idea配置Lombok插件
file -> settings -> plugins
当前工程导入lombok.jar
enable annotation processing
常用方法
@Getter、@Setter注解
- 生成get方法
- 既可以用到类上,也可以用到成员变量上
- 既可以用到类上,也可以用到成员变量上
- 生成set方法
- 既可以用到类上,也可以用到成员变量上
- 既可以用到类上,也可以用到成员变量上
@ToString注解
- 生成toString方法
- 只能使用到类上
- 只能使用到类上
@NoArgsConstructor、@AllArgsConstructor
生成无参构造方法
根据类中的所有字段生成有参构造方法
@Data
生成无参构造、get/set方法、hashCode方法、equals方法、toString方法
Bootstrap概念
介绍
Bootstrap是一个前端框架,由Twitter开发,非常受欢迎。
Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。
框架
相当于半成品;开发人员基于框架可以进行二次开发,大大的节省开发人员的开发时间。
特点
定义了很多的css样式和js插件。我们开发人员直接可以使用这些样式和插件得到丰富的 页面效果
支持响应式布局,写一套页面就可以在不同分辨率的设备上有比较好的效果。
官网
https://www.bootcss.com/
步骤
- 导入bootstrap.css样式文件
- 导入jquery.js类库文件
- 导入boostrap.js类库我呢见
- 导入jquery.js类库文件
- 导入boostrap.js类库我呢见
响应式布局
概念
Bootstrap 提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列。
组成
栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局,你的内容就可以放入这些创建好的布局中。
栅格系统容器包含行;行包含列,列包含内容
栅格系统容器
固定宽度
container
100%宽度
container-fluid
行
row
列
col(col-lg、col-md、col-sm、col-xs)
Bootstrap Validator
概念
基于前端框架的表单校验,可以提升用户使用体验
Bootstrap Validator是基于Bootstrap、jquery组成。
开发流程
当前项目引入BootStrap Validator相关的资源
引入bootstrap.css
引入bootstrapValidator.css
引入jquery.js
引入bootstrap.js
引入bootstrapValidator.js
编写form表单
给需要表单校验的字段加上div(class="form-group")
编写js校验规则
代码看day36,部分代码如下
$(function () {//页面加载完成
$("#myForm").bootstrapValidator({
message : "this is not a valid field",//设置提示信息
fields:{//设置要校验的字段集合
username:{
validators:{
notEmpty:{
},
stringLength:{
min:6,
max:10
},
regexp:{
regexp: /^[a-z0-9]{6,10}$/
}
}
},
$("#myForm").bootstrapValidator({
message : "this is not a valid field",//设置提示信息
fields:{//设置要校验的字段集合
username:{
validators:{
notEmpty:{
},
stringLength:{
min:6,
max:10
},
regexp:{
regexp: /^[a-z0-9]{6,10}$/
}
}
},
Echarts
概念
ECharts 是一款由百度前端技术部开发的,基于 Javascript 的数据可视化图表库,提供直 观,生动,可交互,可个性化定制的数据可视化图表。
官网
https://echarts.apache.org/zh/index.html
开发流程
引入Echarts资源
定义具备宽高的Echarts容器
初始化Echarts对象
设置Echarts属性
0 条评论
下一页