HTML
HTML 标签
一个标签就是一个容器,所有的操作应该在标签中设置
字体标签
< font> < /font>
字体标签的选项
< font size=1~7, color=“#ffffff”>
其中color为三个16进制的数 第一个ff 表示0-255红色的灰度值,第二个为绿色灰度值,第三个为蓝色灰度,属性值要用字符串
换行标签
注释标签
空白地方写注释的内容
标题标签
<h 1-6>
1-6级标签
水平线标签‘
《hr 这里写属性/>
属性值 size:粗细 color: 颜色 与字体标签返回值一致
转义字符
<: < ; > :>使用转义字符时要使用分号 空格:kongge 
列表标签
标签《br>《/br>标签表示列表的范围
在dl标签里面 《dt>
上层内容 在dl标签里面 《dd>《/dd> 下层内容
有序列表
《ol》《/ol》 ol有属性type 选择为 1,a. i
《ul》《/ul》 无序符号的列表 也有title
pre标签
《pre>内容《/pre> 原样输出 内容里面是什么格式页面显示什么格式
图像标签
《img src=”图像的同意标识符的路径”/》
属性值 width表示图片的宽度 height表示图片的高度 属性alt表示图片上面显示的文字
同样../表示上层路径
超链接标签
- 链接资源 《a href=”链接资源的路径” >显示在页面的内容 a target属性设置打开的方式(=_blank在空白页打开) (href=””打开文件夹,“#”不做任何事)
- 定位资源标签《a name=”top”>顶部 《a href=”#top”> a href=”#top”> 回到顶部</a》
表格标签 重要
《table>表格的范围
*table标签里面有一个《tr>标签
**在tr标签里面有个《td>标签
定义一行用《tr> 在tr里面操作每一个单元格用《td>
table border标签设置表格的边界 bordercolor属性边界的颜色 cellspacing属性单元格的间隔 width表格的宽 height表格的高度
tr标签属性值 align(left center right)表示这一行单元格内的文字的排版方式
td标签属性值 align(left center right)表示某个单元格内的文字的排版方式
《caption>表格的标题
跨行 跨列
,td标签里面有两个属性值 rowspan和colspan表示跨行和跨列,(参数为数字,表示跨了几行几列),画表格的时候先数有几行每行有几个单元格,跨行的单元格按第一次出现的地方算。
表单标签
*把数据提交给服务器,这个过程用表单标签实现
《form>定义一个表单的范围
**输入项:可以输入内容和选择内容的部分
***大部分的输入项标签《input type=”输入项的类型”/>
****普通的输入项type=”text”
****密码输入项 type=”password” 页面为黑点
****单选输入项 type=”radiio”
使用单选输入项需要加属性name 例如选男选女 《input type=”radio” name=”sex”/> 男 《input type=”radio” name=”sex”/>女 这两个name属性必须一样
****复选输入项 type=”checkbox”/
name 例如选男选女 《input ty pe=”radio” name=”sex”/> 男 《input type=”radio” name=”sex”/>女 这两个name属性必须一样
****文件输入项 type=”file”
****下拉选择项
《select name=”定义下拉的名称”>
《option value=”值”>页面显示
《option value=”值”>页面显示
《option value=”值”>页面显示
《/select>
****文本域标签
《textarea cols=”数” rows=”数”> 文本类容<。textarea>
****提交注册表 type=”submit” name=”页面信息”,只有在输入项里写上name属性,才能提交该输入
div和span
- div:每一个div占一行,块级标签
- span: 文本信息在一行展示,行内标签
语义化标签:HTML5中为了提高程序的可读性,提供的一些标签
《header》 《footer》
juint测试
步骤
定义一个测试类
- 测试类名 Test+被测试的类名
- 包名 xxx.xxx.xxx.test
定义测试的方法、可以独立运行
- 方法名为test+需要测试的方法
- 返回值 void
- 参数 空
给参数加@test
导入@test环境
通过Assert类断言来判断
@before @after
@before在测试方法执行之前执行,一般用于资源申请
@after在测试方法执行之后执行,一般用于资源的释放
即使出现异常,这两个方法也会执行
反射:框架设计的灵魂
框架 :半成品的软件,可以简化编码
反射: 将类的各个组成部分分装为其他的对象
class对象功能:
首先建立class对象 Class PersonClass=Person.class;auto p=new Person();
获取成员变量
Filed getFileds();获取public修饰的成员变量
Filed getDecleredFiled();获取所有修饰符的成员变量
获取构造方法
PersonClass.getConstrure(Person所对应的构造方法的类型名)
获取成员方法
auto a=PersonClass.getMethon(String 方法名,可选参数:方法参数列表)
执行方法 a.invoke(p);
注解
- 注解:用一种代码级别的说明,用来对包、类、字段、方法的说明
作用分类
- 编译检查
- 通过代码注解生成文档
- 代码分析
JDK预定义的一些注解
- @Override 检测注解方法是否继承父类
- @Depercated 该注解标注的内容表示已经过时,已经弃用
- @SuppressWarning 压制警告, @SupressWarning(“all”)
自定义注解
* public @interface 注解名{}
- 本质
public interface 注解名 extends java.lang.annotation.Annotation{}
属性: 接口中定义的抽象方法
要求
属性的返回类型
- 基本数据类型
- String
- 枚举
- 注解
- 以上数据类型的数组
写属性的时候加上int a(),表示属性定义了属性需要在使用注解的时候加上赋值 @属性名(复制)。数组取值用{}。
元注解,写在自定义注解的前面
- @Target: 描述注解能够作用的位置。TYPE作用域类,Methon作用方法,FIELD作用域成员变量
- @Retention: 描述注解保留的阶段,三个阶段,一般为RUNTIME
- @Decumented: 描述注解是否被抽取到api文档中
@Inherited: 描述注解是否被子类继承
程序中使用注解:获取注解的属性值,假设自定义注解为pro,由
获取注解定义位置的字节码文件对象
获取注释对象
- getAnnptation(class)
获取注解抽象方法的属性值
数据库的基本概念
MySQL
配置
MySQL服务启动 以管理员身份运行cmd net start/stop mysql
MySQL登录和退出(127.0.0.1表示本机)
mysql -uroot -p123456
mysql -hip地址 -uroot -p密码
MySQL的目录结构
- MySQL安装目录
- MySQL数据目录
SQL
sql 结构化查询语言,定义了操作所有关系型数据库的的规则。每一种数据库都存在不一样的地方
SQL语法
- SQL语句可以单行或者多啊很难过书写,以分号结尾
- MySQL sql语句不区分大小写
- 3种注释
- –或者#单行注释
- 多行注释/* 注释 */
SQL分类
- DDL数据定义语言
- DML数据操作语言
- DQL数据查询语言
- DCL数据控制语言
DDL
操作数据库
1. C(Creat):创建
* create database 数据库名
* create database if not exist db2 cahracter set 字符集名称 #创建数据库并用指定的字符集
2. R():查询
* 查询数据库名称
* show 数据库
* 查询某个数据库的字符集
* SHOW CREAT DATABASE
U:修改
- 修改数据库的字符集
- alter database 数据库名 character set 字符集名;#改变数据库的字符集
- 修改数据库的字符集
D:删除
- 删除数据库
- drop 数据库名;
- 删除数据库
使用数据库
- 查询正在使用的数据库名称
select database()
使用数据库
use 数据库名;
操作表
C 创建
语法
Creat table 表名(
列名1 数据类型1,
列名2 数据类型,
。。。
列明n 数据类型
);
注意最后一列不需要都好
数据库类型
- int
- double
- date: 日期,只包含年月日
- datetime 包含时分秒的日期
- timestamp: 如果将来不给这个字段赋值或者复制为null,系统自动填充系统时间
- varchar:字符串
- vachar(20)
复制表 create table like 原表
R 查询
- 查询数据库的名称
- show tables
- 查询表结构
- desc 表明
- 查询数据库的名称
U 修改
- 修改表名
- alter table 表名 rename to 新的表明;
修改表的字符集
alter table 表名 character set 新的表名;
添加一列
alter table 表名 add 列名 数据类型;
修改列名称、类型
alter table 表名 change 列名 新列名 数据类型
alter table 表名 modify 列名 新数据类型
删除列
alter table 表名 drop 列名;
D 删除
- drop table if exists 表明。
create table ‘student’(
id int,
name varchar(32)
);
DML
增删改表中的记录
增加数据
- insert into 表名(列名1,列名2,…,列名n)values(值1,…,值n);
- insert into 表名 values(值1,值2 ,…,值m,null,null);
删除数据
delete from 表名 [where 条件]
删除表的所有数据 TRUNCATE TABLE 表名
修改数据
update 表名 set 列名1=值1,列名2=值2 where 条件
update student set age=117 where id=3;
DQL
排序查询
order by 排序字段 排序方式1,排序字段2 排序方式2;
- 升序方式 asc 升序 desc 降序
如果有多个排序条件,则当前边条件一样时,才会判断第二条件
聚合函数 将一列数据作为一个整体,进行纵向计算
- count 计算个数
- max 计算最大值
- min 最小
- sum 和
- avg 平均
举例:select count(name)from student
count会略过null
分组查询
group by
- 注意分组之后查询的字段:分组字段、聚合函数 select后面查询的字段:分组字段、聚合函数
select sex ,avg(math) from student/* 可以在这里写where */ group by sex;//查询男女同学的数学平均分,结果会如下图
sex avg(math) 女 91.000 男 72.600 注意:where和having的区别
- where在分组前进行限定,如果不满足条件,则不进行分组,having在分组后判断,如果不满足条件,则不会查询
- where后不可加聚合函数,having后可加聚合函数
分页操作
select * from 表名 limit 开始页码,页数;
开始页码=(当前页码-1)*每页的数据,也就是说开始页码是表中当前记录的前一条记录
DQL
语法
select 字段列表 from 表名 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定
条件查询
where子句后跟条件
不等于!= 或者<>
between and 相当于 age<=30&&age>=20 相当于 age between 20 and 30;
in 集合 age in (22,15,10)
LIKE 模糊查询 比如查询姓马的记录 _单个任意字符 %多个任意字符 select * from student where name like ‘马%’
IS NULL 判断为空
and
or
not
// *表示全部记录
约束
对表的数据进行限定,保证数据的正确性、有效性,完整性。
- 分类
- 主键约束:primary key
- 非空 not null
- 唯一约束 unique
- 外键约束 foreign
非空约束
在创建表的时候创建 后面加not null
唯一约束
删除唯一约束
ALTER TABLE STU DROP INDEX 唯一约束的字段
添加唯一约束
alter table 表名 modify 字段名 类型 unique
主键约束
区别于其他记录的唯一标识,非空且唯一
删除主键约束 ALTER TABLE STU DROP PRIMARY KEY;
添加主键
Atter table stu modify id INT primary key
可以为主键添加自动增长
id int primary key AUTO_INCREMENT
主键自动增长在添加数据会按1、2、3 的顺寻增加
外键约束
语法 在需要外键约束的表中最后加上constraint 这个链接的名称 foreign key (该表需要外键约束的字段) REFERENCE 外部约束表(他的主键)
CONSTRAINT emp_dept_fk FOREIGN KEY (DEP_ID) REFERENCES department(id)
删除外键
ALTER TABLE EMPLOYEE DROP FOREIGN KEY 创建的外键名 emp_dept_fk
添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键名) REFERENCES 主表名称(主表列)
级联更新
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键名) REFERENCES 主表名称(主表列) ON UPDATE CASCADE ON DELETE /UPDATE CASCADE
- 分类
数据库的设计
多表的关系
一对一
在任意地方添加外键,指向另一个的主键,并且将这个外键添加唯一约束
多对一
设置外键约束,例如员工表加一个部门的外键表
多对多
再建一个表,这个表有两个外键分别指向多对多关系的主键
范式
- 第一范式:每一列都是不可分割的原子数据项
- 第二范式: 在第一范式的基础上,非码属性都完全依赖于码属性(消除了第一范式非主属性对码的部分依赖),也就是说,消除了冗余,让表中的属性值都可以由主属性得到
- 在二范式的基础上,任何非主属性不依赖于其他非主属性 消除了传递依赖
数据库的备份和还原
命令行
mysqldump -u -p >保存的路径 ,sql
还原 在use database 之后用source a.sql
图形界面,各个图形界面软件不一样.大概都是右键备份和导出
多表查询
select 列名 from 表名 1 表名 2 where 条件
笛卡尔积:有两个集合,取这两个集合的所有组合情况
内连接查询
隐式内连接查询 查询员工表所对应的员工和部门信息
select * from emp,dept where emp.’dep_id’=dept.id;
以后写SQL会这样写
1
2
3
4
5
6
7
8
9select
t1.name,
t2.gender,
t2.name#先不写,先写from
from
emp t1,
dept t2#对emp和dept表取别名
where
t1.'dept_id'=te.'id';
显示内连接
select * from emp join dept on emp.’dep_id’=dept.id.与select * from emp,dept where emp.’dep_id’=dept.id;显示的结果一致
外连接查询
左外链接
select 字段列表 from 表1 left join 表2 on 条件
坐外连接查询的是表1的所有记录以及两表的笛卡尔满足条件的交集
子查询
在查询中嵌套查询
比如查询工资最高的员工信息
#1 查询最高的员工工资
select max(salary) from emp;
#2 查询最高的工资的员工信息
1
2
3
4
5
6
7
8
9
10select
*
from
emp t
where
t.'salary'=(select
max(salary)
from
emp
);子查询的不同情况
子查询的结果是单行单列的
子查询可以作为条件去判断,例如上述代码
子查询的结果是多行单列的
使用in来判断
子查询的结果是多行多列的
使用子查询作为虚拟表
事务
事务的概念
如果一个包含多个步骤的业务操作,都被事务管理,则这些操作要么同时成功。
事务基本操作
开启事务 start transaction
回滚 rollbac
提交 commit
在MYSQL数据库中事务默认自动提交
- 一条增删改语句MySQL会自动提交事务
- 开启事务需要手动提交
关闭打开自动提交事务
查询默认事务提交方式
select @@autocommit 1代表默认 0代表手动
修改事务默认提交方式
set @@autommit=0
如果手动提交事务没有提交事务,则在关闭数据库程序,系统会默认回滚,不会该表表中数据
事务的四大特性
- 原子性: 是不可分割的最小单位,要么同时成功
- 持久性: 当事务提交或者回滚后,数据库会持久化的保存数据
- 隔离性: 多个事务之间相互独立
- 一致性: 事务操作前后,数据总量不变
管理用户DCL
管理用户
添加用户
create user ‘用户名’ @ ‘主机名’ IDENTIFIED BY ‘密码’;
删除用户
drop user ‘用户名’ @ ‘主机名’
查询用户
- use MySQL数据库
修改用户密码
update user set password=password(‘新密码’) where user =‘用户名’;
管理权限
GRANT 权限列表 ON 数据库名.表名 to ‘用户名’ @ ‘主机名’;
GRANT SELECT ON DB3.STUDENT TO ‘LISI’@’%’;
JDBC
- JAVA 数据库连接,Java语言操作数据库
JDBC的本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口编程,真正执行的代码是执行jar包的实现类。
- 快速入门:
- 步骤:
- 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键–>Add As Library - 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象 Statement
- 执行sql,接受返回结果
- 处理结果
- 释放资源
- 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
- 步骤:
- 快速入门:
详解各个对象:
DriverManager:驱动管理对象
- 功能:
- 注册驱动:告诉程序该使用哪一个数据库驱动jar
static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
写代码使用: Class.forName(“com.mysql.jdbc.Driver”);
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
- 注册驱动:告诉程序该使用哪一个数据库驱动jar
- 功能:
获取数据库连接:
* 方法:static Connection getConnection(String url, String user, String password) * 参数: * url:指定连接的路径 * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称 * 例子:jdbc:mysql://localhost:3306/db3 * 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称 * user:用户名 * password:密码 3. Connection:数据库连接对象 1. 功能: 1. 获取执行sql 的对象 * Statement createStatement() * PreparedStatement prepareStatement(String sql) 2. 管理事务: * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务 * 提交事务:commit() * 回滚事务:rollback() 1. boolean execute(String sql) :可以执行任意的sql 了解 2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句 * 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。 3. ResultSet executeQuery(String sql) :执行DQL(select)语句 返回值就是一个查询表 * boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true * getXxx(参数):获取数据 * Xxx:代表数据类型 如: int getInt() , String getString() * 参数: 1. int:代表列的编号,从1开始 如: getString(1) 2. String:代表列名称。 如: getDouble("balance") 注意光标最开始在第一条记录的上边,也就是属性值的那一行 最后可以这样打印查询表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16* 注意:
* 使用步骤:
1. 游标向下移动一行
2. 判断是否有数据
3. 获取数据
//循环判断游标是否是最后一行末尾。
while(rs.next()){
//获取数据
//6.2 获取数据
int id = rs.getInt(1);
String name = rs.getString("name");
double balance = rs.getDouble(3);
System.out.println(id + "---" + name + "---" + balance);
}
抽取JDBC工具类JDBCUtils
目的:简化书写
分析:
注册驱动也抽取
抽取一个方法获取连接对象
需求:不想传递参数(麻烦),还得保证工具类的通用性。
解决:配置文件
jdbc.propertiesurl= user= password=
driver=
使用配置文件
将配置文件的内容使用静态代码块读取,可以使用properties集合类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34//在JDBCutils下
private static String url;
private static String user;
private static String password;
static{
//读取资源文件,获取值。
try {
//1. 创建Properties集合类。
Properties pro = new Properties();
//获取src路径下的文件的方式--->ClassLoader 类加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
// System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties
//2. 加载文件
// pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties"));
pro.load(new FileReader(path));
//3. 获取数据,赋值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4. 注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//注意在静态代码块中只能处理异常,不能抛异常,并且获取src路径文件需要使用ClassLoader类加载器preparedStetement:执行sql的对象
SQL注入的问题:用String拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性的问题
- 输入用户名随便,输入密码: a’ or ‘a’=’a
- sql:select * from user where username=’dasdasfge’ and password=a’ or ‘a’=’a
解决sql注入的问题:使用PreparedStatement对象来解决
sql参数使用?作为占位符
步骤
- 注册驱动,获取Connect对象
- 定义sql:如select * from user where user=? and password=?;
获取执行sql语句的对象 Connection.prepareStatement(String sql)
给?赋值
方法: setxxx(参数1,参数2)
- 参数1:?的位置编号 从1开始
- 参数2 : ?的值
- 执行sql,接受返回的结果
- 参数1:?的位置编号 从1开始
JDBC事务
事务:一个 包含u东哥步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
- 开启事务
- 提交事务
- 回滚事务
使用Connection对象来管事务
开启事务:setAutoCommit(boolean autoCommit):参数设置为false,即开启事务
在sql之前开启
提交事务:commit();在sql之后开启
回滚事务:rollback();回滚在catch里面做
数据库连接池
实现
标准接口:DataSource javax.sql包
- 方法:
- 获取连接:getConnection()
- 方法:
一般我们不去实现它,由数据库的厂商来实现
- C3P0:数据库连接池技术
- 归还连接:如果连接对象Connection是从连接池中获取的,那么调用close()方法,则不会再关闭连接了,而是归还连接
C3P0:数据库连接池技术
- 步骤:
- 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
- 不要忘记导入数据库驱动jar包
- 定义配置文件:
- 名称: c3p0.properties 或者 c3p0-config.xml
- 路径:直接将文件放在src目录下即可。
- 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
创建核心对象 数据库连接池对象 ComboPooledDataSource
获取连接: getConnection
Druid:
导入jar包
定义配置文件
- 是properties形式的
- 可以叫任意名称,可以放在任意的目录
获取数据库连接池对象:通过工厂类获取
DruidDataSoruceFactory
获取连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26* 代码:
public class JDBCUtils {
//1.定义成员变量 DataSource
private static DataSource ds ;
static{
try {
//1.加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
Spring JDBC
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
导入jar包
创建JdbcTemplate对象。依赖于数据源DataSource
- JdbcTemplate template = new JdbcTemplate(ds);
调用JdbcTemplate的方法来完成CRUD的操作
- update():执行DML语句。增、删、改语句
- queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
- 注意:这个方法查询的结果集长度只能是1
- queryForList():查询结果将结果集封装为list集合
- 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
- query():查询结果,将结果封装为JavaBean对象
- query的参数:RowMapper
- 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
- new BeanPropertyRowMapper<类型>(类型.class)
- query的参数:RowMapper
- queryForObject:查询结果,将结果封装为对象
- 一般用于聚合函数的查询
Web概念
Javaweb
使用Java语言开发基于互联网的项目
软件架构
c\s b\s
CSS:页面美化和布局控制
- 含义层叠样式表
- 多个样式可以作用到同一个HTML元素上,同时生效
CSS使用:CSS与HTML结合方式
- 内联样式
- 内部样式:在head标签内,定义style标签,style标签的标签体内容就是css代码
- 外部样式
- 定义css资源文件
- 在head标签内,定义link标签,引入外部的资源文件,一般定义一个css文件夹
css语法
格式:
选择器{
属性名1:属性值1;
属性名2:属性值2;
…
}
选择器:筛选具有相似特征的元素
基础选择器
id选择器:选择具体的id属性值的元素
- 语法 在style中#id属性值{}在《div id=”id”>内容《》
- 元素选择器
- 语法:标签名称
- 注意:id选择器优先级高于元素选择器
- 类选择器:选择具有相同的class属性值的元素
- 语法: .class属性值
- id>元素>类
扩展选择器
- 选择所有的元素
- 语法: *{}
- 并集选择器
- 选择器1,选择器2{}
- 子选择器
- 语法:选择器1,选择器2{}
- 父选择器
- 语法:选择器1>选择器2{}
- 属性选择器:选择元素的名称,属性名=属性值的元素
- 语法:元素名称[属性名=“属性值”]{}
- 伪选择器
- 语法:元素:状态{}
- 选择所有的元素
属性
字体文本
- font-size:字体大小
- color:文本颜色
- text-align:对齐方式
- line-height:行高
背景
- background:
边框
- border:设置边框
尺寸
- width:宽度
盒子模型:控制布局
- margin 外边距 从本元素看,在里边的叫内,在外边的叫外
- padding 内边距
- 默认情况下内边距会影响整个盒子的大小
JavaScript
概念:一门客户端脚本语言
运行在客户端浏览器的,每一个浏览器都有JavaScript的解析引擎
脚本语言,不需要编译,直接就可以被浏览器解析
功能
可以来增强用户和html页面的交互,可以控制html的元素,让页面有一些动态的效果
客户端脚本语言的标准
基本语法
与HTML结合方式
- 内部js
- 定义《script》,标签体就是js代码
- 外部js
- 定义《script》,通过src属性引入外部的js文件
- 注意
- script标签可以定义在页面的任意的位置。但是定义的位置影响执行的顺序
- 内部js
注释 // 和 /*
数据类型
- number 正数/小数/nan
- string 字符串
- Boolean
- null
- undefined 未定义
变量
var 变量名=值
typeof 判断对象的类型,null的结果是object
用var和不用var声明变量的区别
使用var声明的是局部变量,不使用var声明的是全局变量
流程控制语句
if switch while for
函数
创建方法
- function fun2(a,b){}
- var fun3=function(a,b){}
函数的参数
1
2
3
4
5function add(){
var sum=0;
for(var i=9;i<arguments.length;i++)
sum+=arguments[i];
}可以这样使用该代码计算和
add(1,2,3,5);
add(2,5,9,6,2,1,2);
Array:数组对象
- 创建
- var arr=new Array(元素列表);
- var arr=new Array(长度);
- var arr=[元素列表];
- 属性 length
- 特点
- 类型可变
- 长度可变
- 创建
RegExp正则表达式对象
\d:单个数字字符
\w:单个单词字符
?:表示出现0次或1次
*:表示出现0次或多次
+:出现1次或多次
{m,n}:表示出现次数在m到n之间
正则对象
创建
var reg=new RegExp(“正则表达式”);
var reg=/正则表达式/;
^表示正则表达式的开始,$表示正则表达式的结束
Gloab
- 特点:全局对象,这个Gloab中封装的方法不需要对象可以直接调用
- 方法
- encodeURI():url编码
- decodeURI();url解码
- encodeURIComponent():url编码
- decodeURIComponent():url解码 3、4比1、2编码更多,utf-8编码是一个汉字会对应三个字节,少部分对应两个字节
- parseInt();将字符串转为数字
DOM简单学习
功能:控制HTML文档的内容
代码:获取页面标签(元素)对象 Element
- document.getElementById(“Id值”):通过元素的id获取元素对象
操作element对象:
- 修改属性值 src
- 修改标签体内容: innerHTML
HTML与dom树
核心dom模型
HTMLdom模型
Node:节点对象
- 特点:所有dom对象都可以被认为是一个节点
- 方法:
- appendchild():向子节点列表的结尾添加子节点
- removechild();删除并返回当前节点的指定子节点
- replacechild();用新节点替换一个子节点
HTML DOM
- 标签体的设置和获取 :innerHTML 获取标签内HTML的源码
- 使用HTML元素对象的属性
- 控制样式
事件监听机制
- 概念:某些组件被执行了某些操作后,触发某些代码的执行 如单击 双击 等
- 事件源 如 按钮 图片等
- 监听器 代码
- 注册监听:将事件,事件源结合在一起
- 常见的事件
- 点击事件 onclick 单击事件
- ondblclick:双击事件
- 焦点事件
- onblur失去焦点 一般用于表单的验证
- onfocus 获得焦点
- 加载事件
- onload 页面或图像完成加载
- 鼠标事件
- onmousedown 鼠标按钮被按下
- onmouse什么
- 键盘事件
- onkey什么
- 选择和改变
- onchange 改变 一边用于下拉列表
- onselect 选择
- 表单事件
- onsubmit 确认按钮被点击
- onreset重置按钮并点击
- 点击事件 onclick 单击事件
事件的简单学习
功能 某些组件被执行了某些操作后,触发某些代码的执行
通过js获取元素对象,指定时间属性,设置一个函数
BOM
- 概念 浏览器对象模型
- 将浏览器各个组件部分封装为对象
- window 窗口
- Navigator 浏览器
- screen screen
- history 历史记录
- location 地址栏
window窗口
特点
- window对象不需要创建可以直接使用window,window.方法名();
- window引用可以省略。方法名();
方法
与弹出框有关的方法
alert(“”);显示一段消息和确认按钮的对话框
confirm(“”);显示带有一段消息以及确认取消按钮的对话框
- 如果用户点击确认,则返回true
- 如果点击取消,则返回false
与开关闭有关的方法
close()关闭浏览器窗口
open();打开一个新窗口,返回window对象
与定时器有关的方法
setTimeout();//一次性的定时器 有两个参数,第一个参数是封装好的js函数,第二个是毫秒值 返回id
setInterval();//循环定时器 返回id
clearInterval(id);//关闭定时器
获取DOM对象,获取bom对象
location对象 地址栏对象
- reload();重新加载文档 href属性 当前页面的地址
Bootstrap:一个前端开发的框架
这个框架总结一句话、样式、插件太多,去看离线文档
- 好处 定义了很多css样式和js插件。我们开发人员可以直接使用这些样式和插件得到丰富的页面效果
- 响应式布局
- 同一个页面可以适用于不同分辨率的设备
- 实现:依赖于栅格该系统:将一行平均分为12个格子,可以指定元素占几个格子
- 步骤
- 定义容器 相当于以前的table
- 容器的分类
- container 两边留白
- container-fluid 每一种设备都是100%宽度
- 容器的分类
- 定义行 相当于tr 样式:row
- 定义元素。指定该元素在不同设备上所占的格子的数目 样式 col-设备代号-格子数目
- 设备代码
- xs超小屏幕 手机<768px col-xs-12
- sm 小屏幕 平板 >=768pc
- md 中等屏幕 笔记本显示器 >=992px
- lg:大屏幕 >=1200px
- 设备代码
- 注意
- 一行中如果格子数目超过12,则超出的部分紫红换行
- 栅格类属性可以向上兼容。栅格类适用于与屏幕宽度大于或等于分界点大小的设备
- 定义容器 相当于以前的table
css样式和js插件
全局CSS样式
- 按钮:class=”btn btn-default” default可选择
- 图片:class=”img-responsive”图片任意尺寸都占100%;class=”img-circle” 改变图片的形状
- 表格和表单
快速入门
- 下载bootstrap
- 在项目中将三个文件夹复制
- 创建html页面,引入必要的文件
基本模板
1 |
|
其他例如轮播图的框架查看本地api
xml
概念:可扩展标记语言
- 可扩展:标签都是自定义的
功能
- 存储数据
- 配置文件
- 在网络中传输
- 存储数据
与html的区别
- xml标签是自定义的,html是预定义的
- xml语法严格,html松散
- xml用于存储数据
语法
基本语法
- .xml
- 第一行必须是文档声明
- xml文档中有且仅有一个根标签<users》</users》
- 标签必须正确关闭、区分大小写
组成部分
- 文档说明
- 格式《?xml version=’1.0’ ?>
- 属性
- version:版本号 必须的属性
- encoding:编码方式。告知解析引擎当前文档使用的编码字符集
- standalone:是否独立
- 指令
- 标签
- 属性
- 文本
- CDATA区:在该区域中的数据会被原样展示
- 格式
- 约束 规定xml文档的书写规则
- 能够在xml中引入约束文档
- 能够简单读懂约束文档
- 文档说明
DTD约束
- 引入DTD文档到xml中
- 外部DTD
- 本地 <!DOCTYPE 根标签名 SYSTEM “DTD文件的位置”》
- 网络 <!DOCTYPE 根标签名 public “DTD文件名” “dtd文件位置url”》
解析:操作xml文档,将文档中的数据读取到内存中
- 解析xml的方式
- DOM 将xml文件一次性的加载到内存中
- sax 逐行读取,基于事件驱动的
- 解析xml的方式
jsoup快速入门
- 步骤
- 导入jar包
- 获取对象
- 获取对应的标签
Joup对象 parse方法获取xml文件
document对象 获取element对象
- 快捷查询方式
- selector:选择器 参考文档
- 使用的方法:Element
- XPath:
- selector:选择器 参考文档
tomcat
可能遇到的问题
黑窗口一闪而过
配置JAVA_HOME环境变量
启动报错: 占用了端口号
暴力 使用netstat -ano去找到8080的进程然后在任务管理器上干掉
温柔 在conf/server.xml找到
1
2
3<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改port,一般会将tomcat默认端口号修改为80.80端口号是http协议的端口号
部署
部署项目的方式
直接将项目放在webapps目录下即可
/hello叫项目的访问路径
简化部署:将项目打成一个war包,再将war包放置在webapps目录下war包会自动解压缩
配置config/server文件
在《host>标签体中配置
《Context docBase=”D:\hello” path=”/hehe” />
其中docbase项目路径 path为虚拟路径
在config\Catalina\localhost创建任意名称的xml文件,在文件中编写《Context docBase=”D:\hello” /> 虚拟目录:xml文件的名称
静态项目于动态项目
Java动态项目的目录结构
–项目的根目录
– WEB-INF目录
—web.xml:web项目的核心配置文件
– classes目录:放置字节码文件的目录
–lib目录:防止引来的jar包
将tomcat集成到IDEA中,并且创建JavaEE的项目,部署项目
Servlet
概念:运行在服务器端的程序
- servlet就是一个接口 定义了Java类被浏览器访问到(tomcat识别)的规则。
- 将来我们自己定义一个类,实现servlet接口,复写方法
快速入门
创建JavaEE项目
定义一个类,实现servlet接口
实现接口中的抽象方法
配置servlet
在web.xml中配置
《servlet>
《servlet-name>demo1</servlet-name》
《servlet-class>cn.itcast.web.servlet.ServletDemo1《/servlet-class>
《/servlet>
《servlet-mapping>
《servlet-name>demo1《servlet-name>
《url-pattern>/demo1《url-pattern>
《servlet-mapping>
servlet的执行原理
servlet执行方法
init 初始化方法 在servlet创建时调用,只会调用一次
默认情况下,第一次被访问时,servlet被创建
可以指定创建事件
《load-on-start-up>a《/load-on-start-up>
a为负数,访问时创建 其他情况服务器启动时被创建
为了线程安全,尽量不要创建成员变量,要创建也不要赋值
service方法每一次Servlet被访问,执行。
destroy 在服务器正常关闭时执行。执行一次
- 在servlet被销毁之前执行
- 在servlet3.0之后可以在实现类上写@WebServlet(urlPatterns = “/demo2”)注解来配置servlet /demo2为资源路径
IDEA于tomcat的相关配置
- IDEA会为每一个tomcat部署的项目单独建立一份配置文件
- 查看控制台的log:Using CATALINA_BASE: “C:\Users\朱明明.IntelliJIdea2019.3\system\tomcat_thirdtime”
Servlet的两个抽象实现类
GenericServlet
将servlet接口中将其他方法做了默认的空实现,之间service方法抽象
HTTPservlet 对Http协议的一种分组
- 定义类继承Httpseervlet
- 复写 doget();dopost()
servlet的相关配置
- urlpartten:Servlet访问路径
- 一个servlet可以定义多个访问路径 @WebServlet({“/d4”,”/dd4”,”/ddd4”})
- 路径的定义规则
- /xxx
- /xxx/xxx
- *.do
- urlpartten:Servlet访问路径
HTTP
概念 超文本传输协议
- 传输协议:定义了,客户端和服务器端通信时,发送信息的格式
- 特点
- 基于TCP/IP的高级协议
- 默认端口号为80
- 基于请求/响应模式 一次请求对应一次响应
- 无状态的 每次请求之间相互独立 不能交互数据
请求消息数据格式
请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
- HTTP有其中请求方式
- GET:
- 请求行在url中
- 请求的url长度有限制
- 不太安全
- POST
- 请求的参数在请求体中
- 请求url长度没有显示
- 相对安全
- GET:
- HTTP有其中请求方式
请求头
请求头名称: 请求头值
- 常见的请求头
- User-Agent:浏览器告诉服务器,浏览器的版本信息。可以在服务器端获取头信息,解决解决兼容问题
- Reference
- 告诉服务器当前请求从哪里来
- 防盗链
- 告诉服务器当前请求从哪里来
- 常见的请求头
请求空行
空行
请求体(正文)
username=zhangsan
响应消息数据格式
Request
- request对象和response对象的原理
- request和response对象是由服务器创建的。我们来使用他们
- request对象时来获取请求消息、response对象来设置响应消息
request 对象的继承关系
ServletRequest –接口
| 继承
HttpServletRequest –接口
| 实现
org.apache.catalina.connector.RequestFacade 类tomcat实现
request功能
获取请求头
GET /day14/demo1?name=zhangsan HTTP/1.1
获取虚拟目录
getContextPath()
获取请求URI
getRequestURI()
getRequestURL()
获取请求行
- 方法
- string getHeader(String name);用过请求头的名称获取请求头的值
- Enumeration<String》 getHeaderName()获取所有的请求头的名称,类似于迭代器访问
- 方法
获取请求体
只有post方式,采用请求体,在请求体中封装了POST请求参数
步骤
获取流对象
BufferedReader getReader()//获取字符输入流,只能操作字符数据
ServletInputStream getInputStream() 获取字符输入流,可以操作所有类型的数据
注意form表单action选项要从虚拟目录写起 《 form action=”/day18_tomcat/demo2” method=”post”>
再从流对象中拿去数据
其他方法
获取请求参数通用方法:不论get还是post,这些方法都能用
String getParameter(String name):根据参数获取参数值 username=zs 获取密码
String getParameterValues(String name)
根据参数获取参数值数组 hobby=””&&hobby=””
getParameterNames()获取所有请求的参数名称
getParameterMap() 湖片区所有参数的map集合
- 中文乱码问题
- get方式:tomcat8已经将乱码方式解决了
- post方式:设置流的编码 req.setCharacterEncoding(“utf-8”);但是在tomcat9中文乱码已经解决
请求转发:一种在服务器内部的资源跳转方式
- 步骤
- 通过request对象获取请求转发器对象 getRequestDispatcher(String path)
- 使用 这个对象的forward方法转发
- 特点
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务前内部资源里
- 转发时一次请求
- 步骤
3. 共享数据
4. 获取ServletContext
> form 表单中的action路径写法
>
> 虚拟目录+servlet的资源路径
封装数据BeanUtils的使用
获取所有的参数
map=getParameterMap();
创建需要填充数据的对象
User=new User();
使用BeanUtils填充
BeanUtils.populate(user map);
响应格式
- 数据格式
- 响应行
- 组成:协议/版本 响应状态码
- 响应状态码:故武器告诉浏览器本次请求响应的一个状态
- 状态码都是三位数字
- 分类
- 1xx:服务器接受客户端消息但是没有接受完成,等待一段事件,发送状态码
- 2xx:成功
- 3xx:重定向302,访问缓存304
- 4xx:客户端错误 404请求路径没有资源 405:请求方式没有对应额doxxx
- 5xx:服务器端错误 500:服务器端出现异常
- 分类
- 状态码都是三位数字
- 响应头
- 格式:头名称:值
- 常见的响应头
- Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
- Content-disposition:服务器告诉客户端以什么格式打开响应体数据
- 值:
- in-line默认值,在当前页面内打开
- attachment:以附件形式打开响应体。文件下载
- 值:
- 响应体:传输的数据
- 响应行
response对象
功能:设置响应消息
- 设置相应行
- 格式 HTTP/1.1 200 ok
- 设置状态码 setStatus(int sc)
- 设置响应头
- setHeader(String name,String value)
- 设置响应体:
- 使用步骤、
- 获取输出流
- PrintWritter getWriter()
- 字节 ServletOutStream getOutputStream()
- 使用输出流,将数据输出到客户端浏览器
- 获取输出流
- 使用步骤、
- 设置相应行
案例
完成重定向
response.sendRedirect(“虚拟路径/资源名”)
重定向特点
- 地址栏放生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能request对象来共享数据
转发特点
- 转发地址栏不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求。可以使用request对象来共享数据
路径的写法:
路径的分类
相对路径:通过相对路径不能确定唯一资源
- 如./idnex.html
- 不以/开头,以.开头
- 规则:找到方位的当前资源和目标资源之间的对应为hi关系 ./当前路径 ../后退一级目录 不推荐使用相对路径
绝对路径:通过绝对路径可以确定唯一的资源
- 如:http://localhost/day15/demo2 可以简化为/day15/demo2 以/开始的路径
- 规则:判断定义的路径是给谁用的
- 给客户端浏览器使用:需要加虚拟目录
- 建议虚拟目录动态获取 request.getContextPath()
- 给服务器使用:不需要加虚拟目录
- 给客户端浏览器使用:需要加虚拟目录
注意servlet的类实在src下的,在资源里src里的文件是在虚拟路径下一级的
输出字符数据到浏览器
步骤
- 获取字符输出流
- 输出数据
乱码问题
告诉浏览器响应体使用的编码
response.setContentType(“text/html;charset=utf-8”);
输出字节数据到浏览器
步骤
- 获取字节输出流
- 输出数据
验证码
Servletcontext对象
盖帘:代表整个web应用,可以和程序的容器来通信
获取
通过request对象来获取
request.getServletContext();
通过HTTPservlet获取
- getServltContext();
功能
- 获取MIME类型
- 在互联网同行过程中定义的一种文件数据类型
- 格式 大类型/小类型 text/html image/jpeg
- getMimeType(String file)
- 在互联网同行过程中定义的一种文件数据类型
- 域对象:共享数据 和require对象一样可以使用setAttribute和getAttribute,但是Servletcontext域对象的作用域是整个tomcat
- 获取文件的真实(服务器)路径 getRealPath()
- 获取MIME类型
会话技术
- 会话:一次会话中包含多次请求和响应
- 一次会话:浏览器第一次给服务器发送请求,会话建立,知道有一方断开为止
- 功能:在一次会话的范围内的多次请求间,共享数据
- 方式
- 客户端会话技术 Cookie
- 服务器端会话技术:Session
Cookie
- 概念:将数据保存在客户端的技术
- 快速入门
- 使用步骤
- 创建Cookie对象,绑定数据
- new Cookie(String name,String vvalue)
- 发送Cookie对象,
- response.addCookie(Cookie cookie)
- 获取Cokkie,拿到数据
- Cookie[] request.getCookies()
- 创建Cookie对象,绑定数据
- 使用步骤
- Cookie原理分析
- 响应头会设置一个键值对 set-cookie:msg=hello
- 请求头会获得一个键值对 cookie:msg=hello
- Cookie的细节
- 一次可不可以发送多个cookies
- 可以
- 可以创建多个Cookie 调用多次addCookie方法
- cookie在浏览器中保存多长事件
- 当浏览器关闭,cookie对象销毁
- 持久化存储
- setMaxAge(int sseconds)
- 正数,把Cookie数据写道硬盘的文件中,cookie的存活事件
- 负数:默认值
- 0:删除cookie
- setMaxAge(int sseconds)
- cookie能不能存中文
- 在tomcat8之后,cookie支持中文数据
- cookie的共享问题
- 假设在一个tomcat服务器中,部署了对各web项目,那么在这些web项目里cookie不能共享
- setPath(“”);设置虚拟目录可以调整cookie的共享范围,如果要共享可以将字符串写上”/“
- Cookie的特点和作用
- cookie数据存储在浏览器
- 浏览器对于单个cookie的大小有限制,对于同一域名下的总cookie数量也有限制
- 一次可不可以发送多个cookies
JSP
概念
JAVA 服务器端页面
- 可以理解为一个特殊的页面,既可以定义HTML标签,又可以写Java代码
- 简化书写
JSP原理
- JSP本质上就是一个servlet
JSP的脚本:JSP定义的Java代码的方式
- 《% 代码¥》 定义的Java代码,在service方法中,service方法中可以定义什么
- 《%! 代码%》定义的Java代码,在jsp转换后的Java类的成员位置
- 《%= 代码%》定义的Java代码会输出到页面上
jsp的内置对象
- request
- response
- out
- response.getWriter()和out.writer()
- 在tomcat服务器真正的给客户端做出响应之前,会先找response缓冲区数据,再去找out缓冲区数据
Session
概念:服务器端会话技术,再一次的会话键共享数据
快速入门
HttpSession对象:
Object getAttribute(String name)
void setAttribute(name,value)
void romove();
Session原理
- Session的实现是依赖于Cookie的
- 细节:
- 当客户端关闭后卖服务器不关闭,两vi获取session是否为同一个
- 默认不是
- 如果想要相同,可以创建Cookie 键为JSESSIONID 值为session.getId()
- 客户端不关闭,服务器关闭后,两次获取的session是同一个么
- 不是
- session的钝化
- 在服务器正常关闭之前,将session对象系列化到硬盘上
- session的活化
- 在服务器启动后,将session文件转化到内存的session对象
- session什么收呗销毁
- 服务器关闭
- session对象调用invalidate()
- session默认失效事件30分钟
- session的特点
- session用于存储一次会话多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
- 当客户端关闭后卖服务器不关闭,两vi获取session是否为同一个
JSP
指令
- 作用:用于配置JSP页面,导入资源文件
- 格式《%@ 指令名称 属性名=属性值 %》
- 分类
- page 配置JSP页面
- contentType 等同于response.setContentType()
- 设置响应体的mime类型以及字符集
- 设置当前页面的编码
- import 导包
- errorpage:但钱页面发生异常后,会自动跳转到指定的错误页面
- isErrorPage 标识但钱页面是不是错误页面 是的话可以使用内置对象exception
- contentType 等同于response.setContentType()
- include 页面包含
- taglib 导入资源
- 格式<%@taglib prefix=”c” uri=”http://java,sun.com/jsp/jstl/core" %>
- prefix 前缀,自定义的,以后使用采用《c 使用
- page 配置JSP页面
- 分类
注释
html注释
《!– –》只能注释HTML代码片段
jsp注释
《%– –%》可以注释所有
内置对象
变量名 作用
- pqgeContext 当前页面共享数据 setAttribute()还可以获取八个内置对象
- request 一次请求访问多次资源
- session 一次会话的多个请求
- application 所有用户间共享数据
- response 响应
- page 当前页面(servlet)对象 this
- out 输出对象,数据输出到页面
- config servlet的配置对象
- exception 只有声明iserrorpage 异常对象
mvc开发模式
- mvc 模型 视图 控制器
- 模型 完成具体的业务操作,如:查询数据库,封装数据 JavaBean
- 试图 展示数据 JSP
- 控制器 Servlet
- 获取用户的输入
- 调用模型
- 将数据交给试图进行展示
EL表达式
概念 表达式语言
作用 替换和简化Java代码的编写
语法:${表示式}
注意事项
- jsp默认支持el表达式,忽略el表达式可以在表达式前写\
使用
- el表达式只能从与对象里获取值
- 语法:${域名,键名}
- ${域名称.键名}
- pageScope -》pageContext
- requsetScopde -》request
- sessionScope -》session
- applicationScope -》application
- ${键名}:会按照1、2、3、4的顺序查找键
- 获取对象
- 对象: ${域名.键名.属性名}
- 本质上调用getter方法
- List对象:${域名成.键名[索引]}
- map集合 ${域名.键名.key}
- 对象: ${域名.键名.属性名}
- ${域名称.键名}
JSTL
概念:JSP标准标签库
- 是由Apache组织提供的开源的免费jsp标签
用于简化一环jsp页面上的java代码
使用步骤
导入jar包
引入标签库 taglib:指令 《%@ taglib %>
1
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用标签
1
<c:if test="true">范德萨</c:if>
常见的JSTL标签
if
- test为必须的属性,接受bollean表达式,一般情况下,test属性值会结合el表达式一起使用
choose
foreach
重复操作
属性
begin 开始 。end 结束。 var 临时变量 。step 步长。
便利容器
items:容器对象
var:容器中元素的临时变量
注意:每个对象都需要el表达式获取
三层架构:软件设计架构
界面层(表示层):用户看得到的界面。用户可以通过界面上的组件和服务器进行交互
业务逻辑层:处理业务逻辑的
数据访问层:操作数据存储文件
综合案列总结
超链接跳转到servlet是href标签,并且要用${pageContext.request.contextPath}/servlet名称来跳转
jstl的uri为”http://java.sun.com/jsp/jstl/core" 导入方式为 <%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core" %>
验证码的写法,因为超链接本来就可以点击 所以不需要绑定单击事件
- 在checkCode上应该把验证码存入session
1
2
3
4
5
6
7
8
9
10<label for="vcode">验证码:</label>
<input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/>
<a href="javascript:refreshCode()">
<img src="${pageContext.request.contextPath}/checkCodeServlet" title="看不清点击刷新" id="vcode"/>
</a>
<%-- refreshCode的写法--%>
function refreshCode() {
var vcode = document.getElementById("vcode");
vcode.src="${pageContext.request.contextPath}/checkCodeServlet?time="+new Date().getTime();
}在form表单里提交的名字为name 只要是提交了数据,就要设置reques.setCharacter(“utf-8”);
在路径上传id ${pageContext.request.contextPath}/servlet?${user.id}
在提交表单的时候使用隐藏域提交id 本鞥
当某些请求在前端不可获取或者想设置默认值时,可以在servlet 获取参数的时候判断为不为空
过滤器
- 概念:当访问服务器资源时,过滤器可以截下请求,完成一些操作
- 过滤器的作用
- 一般用于通用操作。如登录验证,同一编码、敏感字符验证
- 快速入门
- 步骤
- 定义一个类,实现接口Filter
- 重写方法
- 放行:filterChain.doFilter(require,response)
- 配置拦截路径
- xml
- 注解
- 过滤器的配置
- web.xml的配置
- 过滤器执行流程
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行下边的代码
- 过了不起的周期问题
- 过滤器的配置
- 拦截路径的配置
- 具体资源路径: /index.jsp 只有访问idex.jsp资源时,过滤器才会被执行
- 目录拦截: /user/* 访问/user 下的所有资源时,过滤器都会被拦截
- 后缀名拦截: *.jsp 访问所有后缀名为jsp的资源时,过滤器都会执行
- 拦截所有资源: /* 访问所有资源时过滤器都会执行
- 拦截方式配置:资源被访问的方式
- 注解配置
- 设置dispatcherTypes属性
- REQUEST 浏览器直接请求资源
- FOWOED 转发访问资源
- INCLUDE 包含访问资源
- ERROR 错误跳转资源
- ASYNC 异步方位资源
- 设置dispatcherTypes属性
- web.xml配置
- 注解配置
- 拦截路径的配置
- 过滤器链
- 执行顺序 如果有两个过滤器 1和2
- 1
- 2
- 资源执行
- 2
- 1
- 过滤器先后顺序问题
- 注解配置:按照类名自负床比较规则标胶,值小的先执行
- web.xml配置:谁定义在上面,谁先执行
- 执行顺序 如果有两个过滤器 1和2
- 步骤
jQuery
- 简介:一个JavaScript框架,简化开发,本质上就是就是文件,封装了js的原生代码而已
jQuery快速入门
步骤
下载jQuery
导入jQuery的js文件 导入xxxmin.js
注意在引入js文件的时候,一定要加上字符集charset=”UTF-8”,要不然js文件上的英文也会报乱码错误的问题
使用
jQuery对象与js对象的转换
- jQuery对象与js对象方法不通用
- 两者之间的转换
- jq –>js: jq对象[索引] 或者 jq对象.get(索引)
- js –>jq: $(js对象)
选择器
基本操作
事件绑定
$(“#b1”).click(function(){alert(“abc”)})
写#表示用id绑定事件 不写#表示绑定整个所有的div
src的写法”./js/jquery.js”
入口函数
不同于JavaScript的windows.onload,jQuery采用$(function(){函数的内容}) 并且这个入口函数可以写多次,而JavaScript的onload只能写一次
样式的控制:css方法
分类
基本选择器
- 元素选择器
- 语法:$(“html标签名”)获取所有匹配标签名称的元素
- id选择器
- 语法:$(“#id的属性值”)获取与指定id属性匹配的元素
- 类选择器
- 语法:$(“.class的属性值”)获取与指定的class属性值匹配的元素
- 并集选择器
- 语法:$(“选择器1,选择器2…”)获取多个选择器选中元素
- 元素选择器
层级选择器
- 后代选择器
- 语法$(“A B “)选择A元素内部的所有B元素
- 子选择器
- 语法:$(“A > B”)选择A元素内部所有的B子元素
- 后代选择器
属性选择器
选择div下的title
1
2
3$("#b1").click(function () {
$("div[title]").css("backgroundColor","red");
});选择div下的title=test
1
2
3$("#b2").click(function () {
$("div[title='test']").css("backgroundColor","red");
});
过滤选择器
选择第一个div #div:first
选择最后一个第一个div #div:last
选择class不为one的所有div
#div:not(.one)
选择div序列为偶数的div 奇数从0开始
#div:odd
选择标题 :head
表单过滤选择器
- 可用元素选择器
- 语法::enable 获取可用元素
- 不可用元素选择器
- 语法: :disable获取不可用元素
- 选中选择器
- 语法: :checked获取单选/复选框里的元素
- 选中选择器
- 语法: :selected 获取下拉框选中元素
- 可用元素选择器
DOM操作
内容操作
- html():获取/设置元素的标签体内容 <a》<font》内容《/font></a》 会获得<font》内容《/font></a》
- 获取/设置元素的标签体的纯文本内容 <a》<font》内容《/font></a》 获得 内容
- val():获取value的属性值
属性操作
通用属性操作
- atr():获取/设置元素属性
- removeAttr():删除属性
- prop():获取/设置元素的属性
- removeProp():删除属性
attr和prop的区别
如果是固有的属性,建议使用prop 如果是自定义属性,建议使用attr
对class属性操作
- addClass():添加class属性值
- removeClass():删除class属性值
- toggleClass():切换class属性
- toggleClass(“one”)如果元素对象上存在class=”one”,则将属性one删除,如果元素对象不存在class=”one”,则添加
CRUD操作
- append():父元素将子元素最佳到末尾
- 对象1.append(对象2):将对象2添加到对象1元素内部,并且在末尾。
- prepend():父元素将子元素最佳到开头
- 对象1.prepend(对象2).将对象2添加到对象1元素内部,并且在开头。
- appendTo():
- 对象1.append(对象2):将对象1添加到对象2元素内部,并且在末尾。
- prependTo
- 对象1.prepend(对象2).将对象1添加到对象2元素内部,并且在开头。
- after():添加元素到元素后边
- 对象1.after(对象2):将对象2添加到对象1后边,对象1和对象2是兄弟关系
- before()
- 对象1.after(对象2):将对象2添加到对象1前面,对象1和对象2是兄弟关系
- insertafter()
- insertBefore()
- remove()
- empty()
- append():父元素将子元素最佳到末尾
jQuery高级
动画
- 默认显示和隐藏方式
- show([speed,[easing],[fn]])
- hide([speed,[easing],[fn]])
- toggle([speed,[easing],[fn]])
- 滑出显示和隐藏方式
- slideDown([speed,[easing],[fn]])
- slideUp([speed,[easing],[fn]])
- slideToggle([speed,[easing],[fn]])
- 嵌入淡出显示隐藏方式
- fadeIN([speed,[easing],[fn]])
- fadeOut([speed,[easing],[fn]])
- fadeToggle([speed,[easing],[fn]])
- 默认显示和隐藏方式
js遍历
- js遍历方式
- for(; ;)
- jq遍历方式
- jQ对象.each(callback)
- $.each(obj1,[callback])
- for..of
- js遍历方式
事件绑定
jQuery标准的绑定方式
jq对象.事件方法(“回调函数”)
onoff绑定事件/解除绑定
jq对象.on(“事件名称”,回调函数)
jq对象.off(“事件名称”)
插件:增强jQuery的功能
实现方式
$.fn.extend(object)
增强通过jQuery获取的对象的功能 如$(“#mid”)
1
2
3
4
5$.fn.extend(
方法名:function(){
写方法体
}
)
2. $.extend(obj)
* 增强jQuery对象的功能 $/jQuery
Ajax:异步的JavaScript和xml
- 概念
- 异步和同步:客户端和服务器端相互通性的基础上,在不加载整个页面的基础上,实现部分内容的数据交互
实现方式
原生js的实现方式
jQuery的实现方法
$.ajax()
语法$.ajax{键值对}
1
2
3
4
5
6
7
8
9
10$.ajax({
url:"",
type:"",
data:{"username":"jack"} //发送给服务器的信息
success:function(data){
alert(data);};//服务器端的回调函数
error:function(){
}//出错的回调信息
})
2. $.get()发送get请求
* 语法$.get(url, *[data]*, *[callback]*, *[type]*)其他参数键上方
3. $.post()发送post请求
> 注 最后的type指定类型为"json",这样servlet传回来的数据就不会是字符串了
JSON JavaScript对象表示法
json现在多用于存储和交换文本信息进行数据的传输
语法
基本规则
数据在名称/值对中:json数据是由键值对构成,键为字符串,值为数字 字符串 逻辑值 数组 json对象 null
数据有逗号分割
花括号保存对象:{}定义json格式
方括号保存数组:[] 一般将两种括号组合使用
获取数据
- json对象.键名
- json对象[“键名”]
- 数组对象[“索引”]
json数据和Java对象
json转为Java对象
导入Jackson的相关jar 包
创建Jackson的核心对象 objectMapper
调用objectMapper的相关方法进行转化
mapper.read(字符串,object.class)
Java对象转为json
使用步骤
导入Jackson的相关jar 包
创建Jackson的核心对象 objectMapper
调用objectMapper的相关方法进行转化
转化方法
- write(参数1,obj) 参数重载流对象
- writeValueAsString(obj)
注解 在private Date 属性那里写
- @ JsonIgnore:排除属性
- @JsonFormat:属性值格式化
响应数据
1
2response.setContentType("application/json;charset=utf-8");
response.getWriter().write(s);
redis
nosql非关系型数据库
命令操作
- redis的数据结构
- redis存储的是:key:value格式的数据,其中key都是字符串,value有5种2不同的数据格式
- 字符串类型 String
- 哈希类型 hash: map格式
- 列表类型 list: linkList 格式
- 集合类型 set
- 有序集合类型 sortedset
- redis存储的是:key:value格式的数据,其中key都是字符串,value有5种2不同的数据格式
- 字符串类型 String
- 存储 set key value
- 获取 get key
- 删除 del key
- hash类型
- 存储:hset key field value
- 获取 hget key filed 获取指定filed hgetall key
- 删除 hdel key field
- 列表类型 可以添加一个元素到列表的头部(左边)或者尾部(右边)。
- 添加
- lpush key value 将元素加入列表左边
- rpush key value 将元素加入列表右边
- 获取
- lrange key start end:范围获取
- 删除
- lpop key 删除列表最左边的元素,并将元素返回r
- rpop key 删除列表最右边的元素,并将元素返回
- 添加
- 集合类型set 不允许重复元素
- 存储:sadd key value
- 获取 smembers key:获取set集合所有元素
- 删除 srem key value 删除某个元素
- 有序集合类型 sortedset 不允许重复元素,且元素有顺序
- 存储:zadd key score value 将来会对分数进行排序
- 获取 zrange key start end
- 删除 zrem key value
- 通用命令
- keys * 查询所有键
- type key 获取键对应的value类型
- del key 删除指定的key value
- redis的数据结构
持久化
redis是一个内存数据库 当redis服务器重启,获取电脑重启,数据会丢失,可以将数据写入硬盘
redis持久化机制
RDB:默认方式,不需要进行配置,默认使用这种机制
- 在一定的间隔时间种,检测key的变化情况,然后持久化数据
编辑redis.windows.conf文件
save 900 1
after 900 sec (15 min) if at least 1 key changed
save 300 10
after 300 sec (5 min) if at least 10 keys changed
save 60 10000
after 60 sec if at least 10000 keys changed
重启服务器,并配置文件名称
在cmd下redis-server.exe redis.windows.conf
AOF:日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后,持久化数据
编辑redis.windows.conf文件
appendonly no 关闭aof yes开启
#appendfsync always 每一次操作都进行持久化
appendfsync everysec 每隔一秒进行一次持久化
#appendfsync no 不进行持久化
Java客户端jedis
jedis 一款java操作redis数据库工具
jedis操作数据结构
字符串类型
set get
hash类型
hset hget
列表类型
lpush /rpush
lpop/rpop
ltange start end 范围获取
集合类型
sadd
smemmber获取所有元素
有序集合类型
zadd
jedis连接池 jedisPool
- 使用
- 创建jedispool连接池对象
- 调用getResource()方法获取jedis连接
- 使用
maven
maven的概念 maven可以用在java项目的各个阶段,最主要的就是maven可以集中的管理jar包,提高代码重用,减少项目对jar包的依赖
maven仓库的种类和依赖关系
maven默认的仓库位置在 想要修改默认的本地仓库地址,只需要修改
1 | <!-- localRepository |
maven的目录结构
- src/main/java目录 核心代码部分
- src/main/resource 配置文件部分
- src/test/java 测试代码部分
- src/test/resoource 测试配置文件
- src/main/webapp 页面资源 js css 图片等
maven常用命令
mvn clean 清空当前编译的信息 target文件夹
mvn compile 编译核心代码
mvn test 编译测试代码 同时也编译了核心代码
mvn package 打包 同时编译了核心 测试代码
mvn install 完成上面操作以后 将项目打包到了本地仓库
mvn deploy 部署
这六个过程又叫maven的生命周期 叫默认生命周期
maven概念模型图
在pom.xml里面可以写<depends》依赖项导入需要的jar包
项目
旅游项目的总结
在使用ajax+json进行数据交互,and 在JDBCUTIL写druid 的配置文件时 不需要加 /
在跳转页面的时候 例如href=’http://localhost:8080/travel/activeUserServlet?code=a 相当于将code存入request域对象,可以在servlet中使用request.getParameter(“code”)方法获取值a
使用JDBCtemplate做查找没找到会抛异常
baseServlet的写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class baseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uri=req.getRequestURI();
String methonName=uri.substring(uri.lastIndexOf('/')+1);
try {
Method method = this.getClass().getDeclaredMethod(methonName, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}在继承类里 写@WebServlet(“/usr/*”) 然后直接写方法 前端Ajax请求的时候写 /usr/方法名
旅游项目的实现细节
技术选型
- web层
- service层
- dao层
基础的注册工序
linux
chomd 改变权限 4表示r 2表示x 1表示w 相加
如果要持久化修改主机名 修改/etc/sysconfig/network 将HOSTNAME=zmm
Linux安装软件的方式
二进制发布包
软件已经针对具体平台编译打包,只要解压修改配置即可
RPM包
获得响应的软件包 没有对应的依赖包
yum在线安装
需要网络支撑,的Rpm包
yum install 包名
源码编译安装
rpm -qa |grep mysql 查看有没有mysql的安装
rpm -e –nodeps mysql 卸载mysql
rpm -ivh 包名 安装软件
systemctl stop firewalld 关闭防火墙
访问端口时 去看看阿里云安全组把 哪里有答案
netstat -anp |grep 端口号看进程
ps -ef |grep tomca
当启动tomcat时应该有三个端口被打开 8080 8009 8005 如果8005没打开首先看是不是有端口号冲突 没有冲突的话看 /usr/local/jdk/jdk1.7.0_75/security.policy文件 将 securerandom.source=file:/dev/random 修改为: securerandom.source=file:/dev/urandom(网上查询的结果,我改完这个就可以了,下面的未测试) 如果,仍然不生效,则修改为: file:/dev/./urandom
nginx
在/usr/local/nginx/sbin/下操作
./nginx -s stop 关闭nginx
./nginx -s reload 重新加载配置文件