“探索Java Web开发:深入SSM框架,记录实战笔记。”

JavaWeb

利用java技术开发网站,解决web互联网领域的技术栈

web互联网系统三部分:网页(前端)、数据库通过JavaWeb程序连接(后端)

image-20231122173513702

image-20231122173555128

1. 数据库

MySql(DBMS),SQL语言

数据库DB、数据库管理系统DBMS(管理数据库的大型软件)、SQL(结构化查型语言,关系型数据库统一标准)

关系型数据库管理系统:Oracle(收费大型)、MySQL(免费开源中小型)、SQL Server(C# 、.net)、PostgreSQL

1.1 安装MySQL

下载官网(稳定版本5.7.24)

bin(可执行文件)、include(C语言头目录)

配置环境、打开MySQL服务service.mscnet start mysql

MySQL服务器(安装了MySQL的计算机)

设置账号密码mysqladmin -u root password 123456、登录mysqlmysql -uroot -p123456,连接mysqlmysql -uroot -p123456 -h127.0.0.1 -P3306,停止net stop mysql,卸载mysql -remove mysql

1.2 MySQL数据模型

关系型数据库(二维表):表结构、SQL语言方便可复杂查询、数据持久化在磁盘

image-20231122180140197

数据库就是一个文件夹,然后是表文件frm、数据文件MVD

1.3 SQL语言

结构化查询语言,关系型数据库的统一标准,存在方言

单行或多行(分号;结尾),不区分大小写,注释(单行— 或 #,多行 / /)

DDL数据定义语言:数据库、表

DML数据操作语言:数据增删改

DQL数据查询语言:数据查询

DCL数据控制语言:数据库权限控制

1.3.1 DDL操作数据库

自带四个数据库

查询show databases;

创建create database if not exists db1;

删除drop database if not exists db2;

使用use db1;

查看当前使用的数据库select database();

1.3.2 DDL操作表、数据

CRUD

查询表show tables

查看结构desc t1;

创建表create table t1(id int, username varchar(20), password varchar(32));

数据类型(数值、日期和时间、字符串)

image-20231122181756158

设计学生表(注意数据类型)

image-20231122182219431

1
2
3
4
5
6
7
8
9
10
create table student(
id int,
name varchar(10),
gender char(1),
birthday data,
score double(5,2),
email varchar(64),
tel varchar(15),
status tinyint
);

删除表drop table if exit t2;

修改alter tabel student rename to stu;

添加一列alter table stu add address varchar(64);

修改数据类型alter table stu address char(50);

修改列名和数据类型alter table stu change address addr varchar(30);

删除列alter table stu drop addr;

1.3.3 Navicat

图形化用户工具(提高sql编写效率),美化sql加注释

官网下载

1.3.4 DML增删改数据

查询所有select * form stu;

添加指定列insert into stu(id,name) value(1,'张三');

添加所有列insert into stu(id,name,sex,birthday,score,email,tel) values(2,'李四','男','1999-11-11',88.88,'list@itcast.com','13888888888',1);

批量添加insert into stu values(1),values(2),values(3);

修改update stu set sex='女', score=99.99 where name ='张三';

删除delete from stu where name='张三';

1.3.5 DQL单表查询

主要业务

select字段列表from表名where条件group by分组having分组后条件order by排序limit分页限定

查询指定列select name,age from stu;

查询所有select * form stu;

查询指定列去重select distinct address from stu;

查询取别名select name,math as 数学成绩,english as 英语成绩 from stu;

(1)条件查询

  1. 查询年龄大于20岁学生信息

select * from stu where age > 20;

  1. 查询年龄打印等于20,并且小于等于三十学院生信息

select * from stu where age >= 20 and age <= 30;

select * from stu where age between 20 and 30;

  1. 查询入学日期在’1998-09-01’到’1999-09-01’之间的学生信息

select * from stu where hire_date between '1998-09-01' and '1999-09-01'

  1. 查询年龄等于18岁学生

select * from stu where age = 18;

  1. 查询年龄不等于18岁学生

select * from stu where age != 18

select * from stu where age <> 18

  1. 查询年龄等于18或者年龄等于20或者年龄等于22岁的学生

select * from stu where age in (18,20,22)

  1. 查询英语成绩为null 的学生

select * from stu where english is null — 不用=

模糊查询like(通配符_单个,%任意个)

  1. 查询姓’马’的学生

select * from stu where name like '马%';

  1. 查询第二个字是’花’的学生

select * from stu where name like '_花%';

  1. 查询姓名包含’德’的学生

select * from stu where like '%德%';

(2)排序查询

order by(asc升序默认,desc降序)

  1. 学生年龄升序

select * from stu order by asc;

  1. 数学成绩降序排列

select * from stu order by math desc;

  1. 查询信息,按数学降序排列,数学成绩一样英语按升序排序

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

(3)聚合函数

聚合函数(一列作为整体,纵向计算,null不参与):数量count最大值max最小值min求和sum平均值avg

  1. 统计班级多少学生

select count(id) from stu; — 不统计null

select count(*) from stu; — 一般用count(*)统计数量

  1. 查询数学成绩的最高分

select max(math) from stu;

  1. 查询数学成绩总分

select sum(math) from stu;

  1. 查询数学成绩平均分

select avg(math) from stu;

(4)分组查询

group by(查询分组字段或聚合函数)

where(分组前限定)>聚合函数>having(分组后过滤,可判断聚合函数)

  1. 查询男、女同学各自数学平均分

select sex, avg(math) from stu group by sex;

  1. 查询男、女同学各自数学平均分、及人数

select sex, avg(math), count(*) from stu group by sex;

  1. 查询男、女同学各自数学平均分、及人数,要求:分数低于70不参与分组

select sex, avg(math), count(*) from stu where math>70 group by sex;

  1. 查询男、女同学各自数学平均分、及人数,要求:分数低于70不参与分组,分组后人数大于2个的

select sex, avg(math), count(*) from stu where math>70 group by sex having count(*)>2;

(5)分页查询

limit(mysql 方言),rownumber(oracle), top(SQL Server)

select 字段列表 from 表名 limit 起始索引(0开始),查询条数

起始索引 = (当前页码 - 1) * 每页显示的条数

  1. 从0开始查询,查询3条

select * from stu limit 0,3;

  1. 每页显示3条,查询第1页数据

select * from stu limit 0,3;

  1. 每页显示3条,查询第2页数据

select * from stu limit 3,3;

  1. 每页查询3条,查询第3也数据

select * from stu limit 6,3; — 不够3条也可以

1.3.5 约束

列上规则,限制接入表的数据,保证正确性、有效性、完整性。

非空not null 唯一约束unique 主键约束primary key(非空唯一) 检查约束check(mysql不支持) 默认default 外键foreign key

自增长(数字类型,唯一约束)

1
2
3
4
5
6
7
8
-- 员工表
create table emp(
id int primary key auto_increment, -- 员工id主键且自增长
ename varchar(59) not null unique,
joindata data not null,
salary double(7,2) not null,
bonus double(7,2) default 0
);

外键约束

两个表建立链接,保证一致性和完整性

创建表添加、建完表添加

image-20231122201608702

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 员工表
create table emp(
id int prmary key auto_increment,
name varchar(20),
age int,
dep_id int,

-- 添加外键dep_id,关联dept表的主键id,先创建部门表并添加数据(主表)
constraint fk_emp_dept foreign key(dep_id) references dept(id)
);

-- 部门表
create table dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);

删除外键alter table emp drop foreign key fk_emp_dept;

添加外键alter table emp add constraint fk_emp_dept key(dep_id) references dept(id);

1.3.6 数据库设计

1.3.7 多表查询

1.4 JDBC

Java数据库连接(使用Java操作关系型数据库的一套API)

同一套Java代码操作不同关系数据库

各个数据库厂商实现这台哦接口,提供该数据库驱动jar包

可随时替换底层数据库,访问数据库代码基本不变

image-20231122202619010

  1. 创建工程,导入驱动jar包

mysql-connector-java-5.1.48.jar

  1. 注册驱动

Class.forName("com.mysql.jdbc.Drive");

  1. 获取连接

Connection conn = DriverManager.getConnection(url, username, password);

  1. 定义SQL语句

String sql ="update…";

  1. 获取执行SQL对象

Statement stmt = conn.createStatement();

  1. 执行SQL

int count = stmt.executeUpdate(sql);

  1. 处理返回结果

System.out.println(count);

  1. 释放资源

stmt.close();

conn.close();

image-20231122203158174

1.4.1 DriverManeger

工具类

image-20231122211620066

image-20231122211750558

1.4.2 Connection

image-20231122212445850

image-20231122212459160

image-20231122212535558

1.4.3 Stagtement

执行sql语句

image-20231122213627322

1.4.5 ResultSet

image-20231122214753236

image-20231122215142253

image-20231122221426150

1.4.6 PreparedStatement

好处:预编译SQL,性能更高;防止SQL注入:将敏感字符进行转义。

image-20231122223501252

image-20231122230046013

image-20231122231355430

1.4.7 数据库连接池

容器,负责分配、管理数据库连接

允许应用程序重复使用一个现有的数据库连接成,

image-20231123101333526

标准接口DataSource

DBCP、C3P0、Druid(阿里)

  1. 导入jar包 druid-1.1.12.jar
  2. 定义配置文件
  3. 加载配置文件
  4. 获取数据库连接池对象
  5. 获取连接

image-20231123101617660

image-20231123101706333

1.4.8 JDBC练习

完成商品品牌数据的增删改查数据

image-20231123104715193

image-20231123104733374

image-20231123110817235

image-20231123114822167

image-20231123120519913

image-20231123121518917

1.5 Maven

管理和构建Java项目的工具

标准化项目结构、标准化构建流程(编译测试打包发布)、依赖管理机制

依赖管理:第三方资源(jar包、插件)

maven64% ,gradle 32%

image-20231123122320064

image-20231123122428445

image-20231123122726612

1.5.1 Maven简介

Apache Maven,基于项目对象模型(POM),一小段秒速信息管理项目构建、报告、文档

唯一标识、坐标

maven的仓库存放了jar包,当前项目引用jar包

本地仓库、中央仓库(maven全球唯一)、远程仓库(私服)

image-20231123122954788

image-20231123123518259

1.5.2 Maven配置

解压,环境变量(bin),配置本地仓库(conf-settings.xml-localRepositer,当前目录),修改私服仓库(阿里云,conf-settings.xml-mirrors)

image-20231123123616620

(1)常用命令

compile编译clean清理test测试package打包install安装

pom.xml目录执行命令提示符

会先自动下载一些jar包

编译mvn compile target(存放编译后字节码文件class)

清理mvn compile删除target目录

打包mvn package 打包成jar包,存放字节码文件class

测试mvn test 执行test文件 buld success

安装mvn install当前项目安装到本地jar

(2)生命周期

一次构建过程执行多少事件

三套命令clean,default,site

image-20231123124637560

1.5.3 IDEA配置Maven

下载,修改(自己的maven路径)

maven坐标(资源唯一标识)

groupid组织,artifactid项目名称,version项目版本号

创建Maven项目(新建项目,modules,加号,修改信息,添加test-resources)

导入Maven项目(右侧maven,加号,选择导入)

Maven 插件(maven helper)

image-20231123124928492

image-20231123124954113

image-20231123125121290

image-20231123125448021

1.5.4 依赖管理

导入msql 驱动jar包

maven修改自动生效(file-settings-build-maven-anyway)

本地仓库有(alt + insert)

scope编译环境(java),测试环境(test),运行环境(最终运行),默认(compile最大)

image-20231123131658529

image-20231123131714371

image-20231123131858469

1.6 MyBatis

官网Mabatis 70% MyBAtis-Plus 35%

优秀持久成框架,简化JDBC开发(硬编码(重新编译打包,sql语句)、操作繁琐(手动参数、手动封装结果集))

免除JDBC设置参数和获取结果集的工作

持久成(数据保存在数据库)、表现层、业务层

框架(半成品软件,可重用、通用、软件基础代码模型;框架基础构建软件更高效、规范、通用、可扩展)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//1. 获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//2. 获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();

//3. 获取Mapper接口的对象
MovieHallMapper movieHallMapper = sqlSession.getMapper(MovieHallMapper.class);

//4. 执行方法
List<MovieHall> movieHalls = movieHallMapper.selectAll();
System.out.println(movieHalls);

//5. 释放资源
sqlSession.close();
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!-- UserMapper.xml -->

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace:名称空间
id:sql语句唯一标识
resultType:返回结果类型
-->
<mapper namespace="com.zk.mapper.UserMapper">
<!--
数据库表的字段名称 和 实体类的属性名称 不一样,则不能自动封装数据
* 起别名,对不一致的列名去别名,让别名和实体类的属性名一样
* 缺点:每次查询都要定义一次别名
* sql片段
* 缺点:不灵活
* resultMap:
1. 定义<resultMap>标签
2. 在<select>标签中,使用resultMap属性替换 resultType属性
<!--
id:唯一标识
type:映射的类型,支持别名
-->
<resultMap id="userResultMap" type="user">
<!--
id:完成主键字段的映射
column:表的列名
property:实体类的属性名
result:完成一般字段的映射
column:表的列名
property:实体类的属性名
-->
<result column="user_name" property="userName" />
</resultMap>

<select id="selectAll" resultMap="userResultMap">
select
*
from t_userinfo;
</select>

<!--
sql片段
-->
<!--
<sql id="user_colunm">
user_name as userName,password,userPhoto,userType,regTime
</sql>
<select id="selectAll" resultType="user">
select
<include refid="user_colunm"></include>
from t_userinfo;
</select>
-->
<!-- <select id="selectAll" resultType="user">-->
<!-- select * from t_userinfo;-->
<!-- </select>-->
</mapper>

image-20231123193901543

image-20231123194053650

idea配置连接数据库

image-20231123210436358

mapper代理开发

image-20231123212232436

image-20231123212911523

mybatis.xml核心配置文件(数据库信息,mapper(sql语句))

enviroments(配置多个环境)mapper(配置sql语句)typeAliases(别名,通过扫描pojo包,不区分大小写)

image-20231123214630163

配置文件完成增删改查

安装MyBatisX插件(快速开发,效率,一键跳转接口,自动生成statement的id,需要改别名)

image-20231123215305121

image-20231123215448492

image-20231123215247413

1.6.1 查询所有数据

image-20231123220322433

image-20231123221525995

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
><?xml version="1.0" encoding="UTF-8" ?>
><!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
><!--
>namespace:名称空间
>id:sql语句唯一标识
>resultType:返回结果类型
>-->
><mapper namespace="com.zk.mapper.UserMapper">
><!--
数据库表的字段名称 和 实体类的属性名称 不一样,则不能自动封装数据
* 起别名,对不一致的列名去别名,让别名和实体类的属性名一样
* 缺点:每次查询都要定义一次别名
* sql片段
* 缺点:不灵活
* resultMap:
1. 定义<resultMap>标签
2. 在<select>标签中,使用resultMap属性替换 resultType属性
-->
<!--
id:唯一标识
type:映射的类型,支持别名
-->
<resultMap id="userResultMap" type="user">
<!--
id:完成主键字段的映射
column:表的列名
property:实体类的属性名
result:完成一般字段的映射
column:表的列名
property:实体类的属性名
-->
<result column="user_name" property="userName"/>
</resultMap>

<select id="selectAll" resultMap="userResultMap">
select
*
from t_userinfo;
</select>

<!--
sql片段
-->
<!--
<sql id="user_colunm">
user_name as userName,password,userPhoto,userType,regTime
</sql>
<select id="selectAll" resultType="user">
select
<include refid="user_colunm"></include>
from t_userinfo;
</select>
-->
<!-- <select id="selectAll" resultType="user">-->
<!-- select * from t_userinfo;-->
<!-- </select>-->
></mapper>
1.6.2 查看详情

image-20231123225541881

image-20231123230333186

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
35
36
37
38
39
40
41
42
><?xml version="1.0" encoding="UTF-8" ?>
><!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
><!--
namespace:名称空间
id:sql语句唯一标识
resultType:返回结果类型
>-->
><mapper namespace="com.zk.mapper.MovieHallMapper">
<select id="selectAll" resultType="movieHall">
select * from t_moviehall;
</select>


><!--
* 参数占位符:
1. #{}:会将其替换为 ?, 为了防止SQL注入
2. ${}:拼sql,会存在SQL注入问题
3. 使用时机:
* 参数传递的时候:#{}
* 表名或者列名不固定的情况下:${} 会存在SQL注入问题

* 参数类型:parameterType: 可以省略
* 特殊字符处理:
1. 转义字符:
2. CDATA区:
>-->
<select id="selectById" resultType="movieHall">
select *
from t_moviehall where movieHallId = #{id};

</select>

<!--<select id="selectById" resultType="movieHall">
select *
from t_moviehall where movieHallId = <![CDATA[
<
]]>{id};

</select>-->
></mapper>
1.6.3 多条件查询

参数占位符、封装对象直接传递(属性名和占位符对应)、map集合(键名称对应)

image-20231123232608585

image-20231123233538108

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
>package com.zk.mapper;

>import com.zk.pojo.Movie;
>import org.apache.ibatis.annotations.Param;

>import java.util.List;
>import java.util.Map;

>public interface MovieMapper {

List<Movie> selectAll();

/**
* 条件查询
* * 参数接收
* 1. 散装参数:如果方法中有多个参数,需要使用@Param(“SQL参数占位符名称”)
* 2. 对象参数
* 3. map集合参数
*
* @Param movieName
* @Param mainPerformer
* @Param opera
* @return
*/
//List<Movie> selectByCondition(@Param("movieName") String movieName, @Param("mainPerformer") String mainPerformer, @Param("opera") String opera);


//List<Movie> selectByCondition(Movie movie);

List<Movie> selectByCondition(Map map);

>}
>----------------------------------
// 接收参数
String movieName = "";
String mainPerformer = "沈";
String opera = "";

// 处理参数
movieName = "%" + movieName + "%";
mainPerformer = "%" + mainPerformer + "%";
opera = "%" + opera + "%";

// 封装对象
/*Movie movie = new Movie();
movie.setMovieName(movieName);
movie.setMainPerformer(mainPerformer);
movie.setOpera(opera);*/

Map map = new HashMap();
map.put("movieName", movieName);
map.put("mainPerformer", mainPerformer);
map.put("opera", opera);

//4. 执行方法
//List<Movie> movies = movieHallMapper.selectByCondition(movieName,mainPerformer,opera);
//List<Movie> movies = movieHallMapper.selectByCondition(movie);
List<Movie> movies = movieHallMapper.selectByCondition(map);
1.6.4 动态条件查询

if标签(条件判断,test属性逻辑表达式),缓存恒等式

where标签(替换关键字,动态判断是否加逻辑运算符)

image-20231124100143443

image-20231124100734154

1.6.5 动态单条件查询

choose(when, otherwise(类似switch、case),otherwise)

image-20231124100923084

1.6.6 添加和修改

image-20231124105159505

image-20231124105603566

image-20231124111441050

image-20231124111519563image-20231124111835514

1.6.7 删除

image-20231124114447449image-20231124120556392

1.6.8 MyBatis 参数传递

image-20231124120527445

image-20231124122131721

image-20231124122232770

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
35
>List<User> selectAll();

/**

MyBatis 参数封装:
* 单个参数:
1. POJO类:直接使用。属性名 和 参数占位符名称 一致
2. Map集合:直接使用。键名 和参数占位符名称 一致
3. Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",collection集合);
map.put("collection",collection集合);
4.List:封装为Map集合,可以使用@Param朱姐,替换Map集合中默认的arg键名
map.put("arg0",list集合);
map.put("argcollection",list集合);
map.put("list",list集合);
5.Array:封装为Map集合,可以使用@Param朱姐,替换Map集合中默认的arg键名
map.put("arg0",数组);
map.put("array",数组);
6.其他类型:封装为Map集合
map.put("arg0",数组);
map.put("array",数组);
* 多个参数:封装为Map集合,可以使用@Param朱姐,替换Map集合中默认的arg键名
map.put("arg0",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值1)
map.put("arg1",参数值1)
-----------------@Param("username")
map.put("userName",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值1)
map.put("userType",参数值1)

*/
User select(@Param("userName") String userName, @Param("userType") String userType);

1.6.9 注解开发

将sql语句写在注解里

注解(完成简单功能,力不从心)、配置(完成复杂功能,动态sql)

image-20231124124441762

2. Web核心

B/S架构,客户端(只需要浏览器),服务器(应用程序、数据),易于维护升级

静态资源(前端三剑客,页面呈现)

动态资源(jsp逻辑处理,servlet)

数据库(数据存储)

HTTP协议(通信规则)

Web服务器(HTTP协议解析,解析请求、发送相应)

image-20231124153558986

image-20231124153744578

2.1 HTTP

超文本传输协议(浏览器和服务器数据传输规则,请求和响应)

基于TCP协议(面向连接、安全),基于请求-响应、无状态协议(每次请求-响应独立,不共享数据(回话技术cookie,session),更快)

image-20231124154145575

2.1.1 HTTP-请求数据格式

请求行(第一行,请求方式,资源路径、http协议版本)

请求头(key-value)

请求体(post请求最后部分,存放参数)

GET(请求行获取参数)

POST(请求体获取参数)

image-20231124154455276

2.1.2HTTP-响应数据格式

响应行(协议版本,响应状态码,状态码描述)

响应头(key-value)

响应体(存放响应数据)

1xx(响应中)2xx(成功)3xx(重定向)4xx(客户端错误)5xx(服务器错误)

200(ok)302(found)304(not modiried)400(bad request)403(forbidden)404(not found) 500(internal server error)503(service unavailable)

image-20231124154929109

web服务器软件:Apache Tomcat(HTTP协议处理)

2.2 Web 服务器

应用程序(软件),对HTTP协议封装,web项目部署服务器(提供网上信息浏览服务)

Tomcat开源免费、支撑Servlet/JSP和少量JavaEE规范(JDBC、XML)

也称Web容器、Servlet容器。Servlet需要依赖Tomcat运行

官网

bin/startup.bat(启动)

bin/shutdown.bat(关闭)

webapps(项目)

image-20231124160850826

配置(默认端口号(http默认80),con/server.xml)

部署(项目放到webapps下,打包war传输更快(自动解压缩))

image-20231124161200571

image-20231124161409851

web项目(开发者,开发完成可部署(webapp下的项目,打包war))

image-20231124161721644

IDEA创建Maven Web项目

骨架(create from archetype)

image-20231124161952658

image-20231124162134928

IDEA使用tomcat

集成本地tomcat

maven插件(21年只支持到tomcat7)

image-20231124173905346

image-20231124174633344

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
<plugins>
<!--Tomcat 插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port><!--访问端口号-->
<path>/</path><!--项目访问路径-->
</configuration>
</plugin>
</plugins>
</build>

2.3 Servlet

动态web开发

定义Servlet类实现Servlet接口,由web服务器运行

image-20231124190951666

image-20231124191054067

provided(运行时不用)

执行流程

image-20231124195309174

生命周期(创建到销毁)

加载实例化(第一次访问,由容器创建)

初始化(init(),默认第一次访问调用,执行一次,loudOnStartup=1创建时调用)

请求处理(service(),每次请求servlet执行)

服务终止(destroy(),销毁内存释放或服务器关闭,执行一次)

image-20231124200005968

Servlet 方法

getServletInfo()

getServletConfig()

image-20231124201210660

2.3.1 Servlet体系结构

image-20231124202636032

image-20231124203339571

2.3.4 urlPattern配置

一个Servlet可以配置多个访问路径

精确匹配(可多个,访问路径相同,最常用)

目录匹配(带通配符,/user/*,优先级(精确>目录))

扩展名匹配(*.do,不以/开头)

任意匹配(/或/ ,优先级(/> /), 会覆盖tomcat默认servlet(无法访问静态资源))

image-20231124205345316

image-20231124210102088

2.3.5 XML配置方式表写Servlet

3.0版本后支持注解配置

image-20231124211117150

2.4 request和response

image-20231124211633454

2.4.1 request

image-20231124212123895

查阅文档:HttpServletRequest

request获取请求方式

字节输入流(字符串),字节输入流(文件)

user-agent(浏览器版本)

image-20231124213237549

request通用方式获取请求参数

image-20231124224118935

image-20231124224402449

image-20231124235458064

解决参数中文乱码

image-20231125112549576

image-20231125112651793

get方法(utf-8用url编码,tomcat用ISO-8859-1解码(tomcat 8之后用utf-8解码))

二进制编码(一个汉字3个字节,每个字节转换为2个16进制)

请求转发

服务器内资源跳转方式

image-20231125114151928

2.4.2 response

image-20231125114920213

response重定向

资源跳转方式(302, location:)

image-20231125115516724

路径问题

image-20231125120406438

动态获取虚拟路径

响应数据

字符、流数据

image-20231125121043275

image-20231125121518122

2.4.3 登录注册

image-20231125122751571

image-20231125154241530

代码优化

image-20231125161843376

3 JSP

java服务端页面,动态的网页技术,JSP= HTML+Java

JSP本质上是一个Servlet(tomcat自动完成,java文件,编译成字节码文件)

image-20231125201741612

image-20231125201958238

image-20231125203557869

>
>

image-20231125203853746

JSP缺点

image-20231125210935136

EL表达式(替换获取数据代码) 数据存在域对象里

${expression}

image-20231125211304459

JSTL标签(用标签取代JSP中Java代码)

el和jstl结合使用

image-20231125212213079

image-20231125213034305

3.1.1MVC模型和三层架构

分层开发模型(模型、视图、控制器)

image-20231125214537590

三层架构

表现层(请求接受、封装、响应)、业务逻辑层(业务逻辑,数据访问)、数据访问层(数据库CRUD)

三层框架(SpringMvc, spring,MyBatis)

image-20231125215028930

image-20231125215112881

>
>

image-20231125215138913

image-20231125221204383

image-20231125231347089

image-20231126094456570

回话跟踪技术

回话跟踪(同一浏览器,同一次回话的多次请求共享数据,验证码、购物车、用户名)

解决http无状态

客户端(cookie)每次请求携带Cookie进行访问,cookie在浏览器中可以长期存在

服务端(session,实现基于cookie)服务器重启cookie不能消失(钝化,tomcat将session写入硬盘,活化,session重新加载,默认30分钟(登录时间太长,重新登录)),浏览器关闭session不是同一个

image-20231126104747866

image-20231126105145947

image-20231126110524617

image-20231126110934558

image-20231126111250933

image-20231126111820856

image-20231126111953980

偏好设置(cookie长期)用户名(Session安全)购物车(cookie)用户名密码(cookie长期,但是不安全)验证码(session安全,防止暴力注册)用户登录之后的数据(session)

>
>

image-20231126112340973

image-20231126112710826image-20231126113652439

image-20231126114319645

image-20231126114501989

image-20231126115134393

image-20231126115430454

image-20231126115823452

3. Filter 和 Listener

三大组件之一(Serlvlet,Filter,Listener)

权限控制(登录后操作)

类似servlet开发(定义类,实现接口重写方法,拦截路径注解,拦截放行)

image-20231126130628429

image-20231126130811751

image-20231126141857643

image-20231126142059923

3.1Filter 拦截路径设置

image-20231126142157793

image-20231126142551779

>
>

image-20231126143128709

判断session对象有无user(登录相关的资源提前放行)

3.2 Listener

在application,session,request三个对象监听

并不常用

image-20231126143545683

image-20231126143705885

4 JSON

JavaScript对象表示法(数据载体)

image-20231126144633086

image-20231126144732495

image-20231126144935418

image-20231126144947068

5 Vue

前端框架,免除JavaScript里DOM操作

基于MMVC思想

image-20231126145435709

image-20231126145524191

image-20231126145631374

5.1 Element

饿了么公司,快速开发网页前台

image-20231126150217425

image-20231126150538525

6 servlet优化

image-20231126151255401

7. 综合案例

>
>

image-20231126153809246

image-20231126153815737

image-20231126153930822

动态获取实现类,service impl

image-20231126155035879

image-20231126152729806

分页查询

image-20231126160454667

image-20231126160709714

image-20231126160919456

image-20231126162528755

条件查询

image-20231126164435204

总结

各位B站的朋友,大家好,我是本套课程的制作人黑马Java陈老师,来到这套课程中学习,首先恭喜大家,顺利的学习完JavaSE的相关内容,你已经算入门Java了。接下来就要进入JavaWeb开发的学习了。这个阶段也是很有意思的一个阶段,你会学习到如何制作出一个属于自己的web站点中所有技术,当然对于要完成毕设的同学,这个阶段学完,做个毕设那是轻松拿捏的。
对于这套课程的学习我有以下几个点想和大家说明下:
\1. 不要光听不练:该阶段知识虽然难度不大,但是存在很多小的细节,这些细节在听课过程中,你是体会不到的,因为我在操作的时候不会出问题(我已经操作N遍了),只有你动手练习后,才会注意到。
\2. 遇到问题不要怕:首先,说明一个观点,优秀的程序员就是在不停的调错过程中成长起来的,你调试的错误越多,你的经验,能力才能得到提升。然后,遇到错误后,分三步走:
(1) 自己根据错误提示分析:分析的手段无非就是看异常信息,然后定位问题,然后通过经验进行分析(经验考积累)
(2) 搜索引擎:遇到自己搞不定的异常提示,直接把错误提示粘贴到搜索引擎中,前三页基本都能找到答案。
(3) 请教他人:当然,搜索引擎不是万能的,有些问题,很多同学不知道怎么描述,也搜索不出来,这时可以请教他人,如果你找不到别人,可以私信给我留言,大部分的问题,我应该都能搞定。
所以,核心点在于别怕问题。
\3. 持之以恒:对于大多数人来说,学习是一件枯燥且乏味的事情。但这件事情是最正确,也是回报最大的事。然而,这需要一个相对长的周期,学不到一定程度是没有意义的,还会让你陷入自我否定和怀疑中。所以,朋友们,请坚持住!
最后祝大家学习顺利,能在这一行越走越远。
PS:如果你觉得课程还不错的话,记得点赞投币转发哦,你的肯定,是我们做课最大的动力!

1. Spring

分词的java se/ee 的full-stack(各个层都能处理)轻量级开源框架

以IoC(反转控制)和AOP(面向切面编程,事务处理)为核心

提供展现层(Spring MVC)和持久层(Spring JDBCTemplate)和业务层事务管理

框架整合(高校整合其他技术(MyBatis,MyBatis-plus,Struts),提高企业级应用开发效率)

官网:spring.io

Spring全家桶(若干项目,开发的生态圈)

Spring Framework(底层框架,其他所有框架基础)

Spring Boot(简化开发)

Spring Cloud(分布式开发)

纯配置->注解->不适用注解->jdk 8以上(2017 Spring 5.0)

image-20231126172320837

1.1 Spring Framework系统架构

核心容器(Core Container, 管理对象)

AOP(面向切面编程) Aspects(AOP思想实现)

Date Access(数据访问) Date Integration(数据集成)

Web(开发)

Test(单元、集成测试)

image-20231126172724357

1.2 IoC

new对象转换为外部提供,控制器转移到外部(不用自己new)

IoC容器提供对象(管理的对象叫Bean)

DI(依赖注入,service和dao两个bean之间依赖)

image-20231126173353536

管理Service和Dao,配置、接口、接口方法、导坐标

applicationContext.xml(resource下,先导坐标)创建bean

获取IoC容器->获取bean

image-20231126175530743

image-20231126175542091

image-20231126175625550

image-20231126175611105

DI

image-20231126180618688

image-20231126180831438

image-20231126180843516

image-20231126180850962

bean配置

image-20231126181601774

image-20231126181802028

spring默认bean是单例(效率更高,造一次反复用)

image-20231126181904568

image-20231126182005274

bean实例化

spring调用bean调用无参构造方法

image-20231126182712748

image-20231126183009158

image-20231126183339037

bean 生命周期

image-20231126195247059

image-20231126195327101

image-20231126195335126

image-20231126201217184

自动装配

bean依赖的资源在容器中自动查找注入

autowire主要用byType

image-20231126201730844

自动装配用于引用类型依赖注入,不能对简单类型操作

image-20231126201806560

加载properties文件
  1. 开启context命名空间

  2. 用context明快空间加载properties文件

  3. 使用${}读取文件中的属性

image-20231126203935230

image-20231126204222056

创建容器

image-20231126204617147

image-20231126204957852

image-20231126212055908

image-20231126212156721

注解开发定义bean

image-20231126212625284

image-20231126212646989

纯注解开发

Spring3.0开启纯注解开发

将applicationContext.xml写入到config的SpringConfig.class里

image-20231126213206075

image-20231126213245643

image-20231126213357827

Spring 整合 MyBatis

SqlSessionFactoryBean

MapperScannerConfigurer

image-20231126211816069

image-20231126211825228

image-20231126211831801

1.3 AOP

面向切面编程,组织程序结构

不惊动原始设计的基础上,进行功能增强

Spring理念(无入侵式编程)

image-20231126214300037

执行通知的切入点,设置通知方法,连接切入点(一个或多个方法)和通知

通知(共性功能),切入点(匹配连接点的式子),连接点(程序中的任意位置)切面(描述通知和切入点对应关系)

image-20231126214535166

匹配成功(创建原始对象的代理对象,增强)

获取bean(执行代理对象)

image-20231126215345668

image-20231126215506240

image-20231126215918422

描述到接口,描述到实现类(不允许,紧耦合了)

image-20231126221036955

原始操作可隔离(权限配置)

image-20231126221051948

>
>

image-20231126221749993

image-20231126223026701

image-20231126223913173

1.4 Spring 事务

数据库操作同时成功或失败

image-20231126224252611

>
>

image-20231126224500857

image-20231126224734310

image-20231126224809782

与jdbc同一个datasource

image-20231126224955195

1.5 SpringMVC

和Servlet功能相同,web表现层开发

基于Java实现MVC模型的轻量级web框架

数据层:JDBC->MyBatis

业务层:

数据层:Servlet->SpringMVC

image-20231126233055200

image-20231127100137623

image-20231127100147807

image-20231127100414827

image-20231127100351531

image-20231127101213988

image-20231127101223454

image-20231127101236094

image-20231127101325188

工作流程

image-20231127110321573

加载spring的bean时(controller),排除springMvc要加载的bean

image-20231127110512726

image-20231127111209531

image-20231127111235343

image-20231127111301892

image-20231127111432360

Postman工具

测试controller接口

模拟HTTP请求的chrome插件

请求映射路径

image-20231127114828348

image-20231127120305550

image-20231127121304810

请求传参

(1)普通参数

image-20231127123156968

image-20231127123206863

(2)POJO 参数

image-20231127123233086

(3)嵌套POJO

image-20231127123239301

(4)数组传参

image-20231127123300875

(5)集合传参

image-20231127123310230

(6)json传参

image-20231127155404182

image-20231127155413779

image-20231127155426207

image-20231127155437204

image-20231127155457423

image-20231127155446528

image-20231127155635382

(7)日期类型

image-20231127161852276

image-20231127161859909

image-20231127161957095

响应

页面,数据(文本,json)

@ResponseBody

image-20231127163038915

image-20231127163008275

image-20231127163058420

image-20231127163109830

image-20231127163116607

1.6 SSM 整合

image-20231126233310885

image-20231127001418318

image-20231127001426213

REST 风格

image-20231127165556957

image-20231127165838838

不是规范,但是和规范差不多(后期REST风格)

3. Spring Security

认证(authentication,前提)和授权(authorization, 常态)

对已有项目添加认证功能

Spring全栈

对标Shiro(apache的,更改,但是Security基于java应用广)