javaweb学习
“探索Java Web开发:深入SSM框架,记录实战笔记。”
JavaWeb
利用java技术开发网站,解决web互联网领域的技术栈
web互联网系统三部分:网页(前端)、数据库通过JavaWeb程序连接(后端)
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.msc
、net 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语言方便可复杂查询、数据持久化在磁盘
数据库就是一个文件夹,然后是表文件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));
数据类型(数值、日期和时间、字符串)
设计学生表(注意数据类型)
1 | create table student( |
删除表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)条件查询
- 查询年龄大于20岁学生信息
select * from stu where age > 20;
- 查询年龄打印等于20,并且小于等于三十学院生信息
select * from stu where age >= 20 and age <= 30;
select * from stu where age between 20 and 30;
- 查询入学日期在’1998-09-01’到’1999-09-01’之间的学生信息
select * from stu where hire_date between '1998-09-01' and '1999-09-01'
- 查询年龄等于18岁学生
select * from stu where age = 18;
- 查询年龄不等于18岁学生
select * from stu where age != 18
select * from stu where age <> 18
- 查询年龄等于18或者年龄等于20或者年龄等于22岁的学生
select * from stu where age in (18,20,22)
- 查询英语成绩为null 的学生
select * from stu where english is null
— 不用=
模糊查询like(通配符_单个,%任意个)
- 查询姓’马’的学生
select * from stu where name like '马%';
- 查询第二个字是’花’的学生
select * from stu where name like '_花%';
- 查询姓名包含’德’的学生
select * from stu where like '%德%';
(2)排序查询
order by(asc升序默认,desc降序)
- 学生年龄升序
select * from stu order by asc;
- 数学成绩降序排列
select * from stu order by math desc;
- 查询信息,按数学降序排列,数学成绩一样英语按升序排序
select * from stu order by math desc, english asc;
(3)聚合函数
聚合函数(一列作为整体,纵向计算,null不参与):数量count最大值max最小值min求和sum平均值avg
- 统计班级多少学生
select count(id) from stu;
— 不统计null
select count(*) from stu;
— 一般用count(*)统计数量
- 查询数学成绩的最高分
select max(math) from stu;
- 查询数学成绩总分
select sum(math) from stu;
- 查询数学成绩平均分
select avg(math) from stu;
(4)分组查询
group by(查询分组字段或聚合函数)
where(分组前限定)>聚合函数>having(分组后过滤,可判断聚合函数)
- 查询男、女同学各自数学平均分
select sex, avg(math) from stu group by sex;
- 查询男、女同学各自数学平均分、及人数
select sex, avg(math), count(*) from stu group by sex;
- 查询男、女同学各自数学平均分、及人数,要求:分数低于70不参与分组
select sex, avg(math), count(*) from stu where math>70 group by sex;
- 查询男、女同学各自数学平均分、及人数,要求:分数低于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) * 每页显示的条数
- 从0开始查询,查询3条
select * from stu limit 0,3;
- 每页显示3条,查询第1页数据
select * from stu limit 0,3;
- 每页显示3条,查询第2页数据
select * from stu limit 3,3;
- 每页查询3条,查询第3也数据
select * from stu limit 6,3;
— 不够3条也可以
1.3.5 约束
列上规则,限制接入表的数据,保证正确性、有效性、完整性。
非空not null 唯一约束unique 主键约束primary key(非空唯一) 检查约束check(mysql不支持) 默认default 外键foreign key
自增长(数字类型,唯一约束)
1 | -- 员工表 |
外键约束
两个表建立链接,保证一致性和完整性
创建表添加、建完表添加
1 | -- 员工表 |
删除外键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包
可随时替换底层数据库,访问数据库代码基本不变
- 创建工程,导入驱动jar包
mysql-connector-java-5.1.48.jar
- 注册驱动
Class.forName("com.mysql.jdbc.Drive");
- 获取连接
Connection conn = DriverManager.getConnection(url, username, password);
- 定义SQL语句
String sql ="update…";
- 获取执行SQL对象
Statement stmt = conn.createStatement();
- 执行SQL
int count = stmt.executeUpdate(sql);
- 处理返回结果
System.out.println(count);
- 释放资源
stmt.close();
conn.close();
1.4.1 DriverManeger
工具类
1.4.2 Connection
1.4.3 Stagtement
执行sql语句
1.4.5 ResultSet
1.4.6 PreparedStatement
好处:预编译SQL,性能更高;防止SQL注入:将敏感字符进行转义。
1.4.7 数据库连接池
容器,负责分配、管理数据库连接
允许应用程序重复使用一个现有的数据库连接成,
标准接口DataSource
DBCP、C3P0、Druid(阿里)
- 导入jar包 druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接
1.4.8 JDBC练习
完成商品品牌数据的增删改查数据
1.5 Maven
管理和构建Java项目的工具
标准化项目结构、标准化构建流程(编译测试打包发布)、依赖管理机制
依赖管理:第三方资源(jar包、插件)
maven64% ,gradle 32%
1.5.1 Maven简介
Apache Maven,基于项目对象模型(POM),一小段秒速信息管理项目构建、报告、文档
唯一标识、坐标
maven的仓库存放了jar包,当前项目引用jar包
本地仓库、中央仓库(maven全球唯一)、远程仓库(私服)
1.5.2 Maven配置
解压,环境变量(bin),配置本地仓库(conf-settings.xml-localRepositer,当前目录),修改私服仓库(阿里云,conf-settings.xml-mirrors)
(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
1.5.3 IDEA配置Maven
下载,修改(自己的maven路径)
maven坐标(资源唯一标识)
groupid组织,artifactid项目名称,version项目版本号
创建Maven项目(新建项目,modules,加号,修改信息,添加test-resources)
导入Maven项目(右侧maven,加号,选择导入)
Maven 插件(maven helper)
1.5.4 依赖管理
导入msql 驱动jar包
maven修改自动生效(file-settings-build-maven-anyway)
本地仓库有(alt + insert)
scope编译环境(java),测试环境(test),运行环境(最终运行),默认(compile最大)
1.6 MyBatis
官网Mabatis 70% MyBAtis-Plus 35%
优秀持久成框架,简化JDBC开发(硬编码(重新编译打包,sql语句)、操作繁琐(手动参数、手动封装结果集))
免除JDBC设置参数和获取结果集的工作
持久成(数据保存在数据库)、表现层、业务层
框架(半成品软件,可重用、通用、软件基础代码模型;框架基础构建软件更高效、规范、通用、可扩展)
示例
1 | //1. 获取SqlSessionFactory |
1 | <!-- UserMapper.xml --> |
idea配置连接数据库
mapper代理开发
mybatis.xml核心配置文件(数据库信息,mapper(sql语句))
enviroments(配置多个环境)mapper(配置sql语句)typeAliases(别名,通过扫描pojo包,不区分大小写)
配置文件完成增删改查
安装MyBatisX插件(快速开发,效率,一键跳转接口,自动生成statement的id,需要改别名)
1.6.1 查询所有数据
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 查看详情
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集合(键名称对应)
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标签(替换关键字,动态判断是否加逻辑运算符)
1.6.5 动态单条件查询
choose(when, otherwise(类似switch、case),otherwise)
1.6.6 添加和修改
1.6.7 删除
1.6.8 MyBatis 参数传递
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( String userName, String userType);1.6.9 注解开发
将sql语句写在注解里
注解(完成简单功能,力不从心)、配置(完成复杂功能,动态sql)
2. Web核心
B/S架构,客户端(只需要浏览器),服务器(应用程序、数据),易于维护升级
静态资源(前端三剑客,页面呈现)
动态资源(jsp逻辑处理,servlet)
数据库(数据存储)
HTTP协议(通信规则)
Web服务器(HTTP协议解析,解析请求、发送相应)
2.1 HTTP
超文本传输协议(浏览器和服务器数据传输规则,请求和响应)
基于TCP协议(面向连接、安全),基于请求-响应、无状态协议(每次请求-响应独立,不共享数据(回话技术cookie,session),更快)
2.1.1 HTTP-请求数据格式
请求行(第一行,请求方式,资源路径、http协议版本)
请求头(key-value)
请求体(post请求最后部分,存放参数)
GET(请求行获取参数)
POST(请求体获取参数)
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)
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(项目)
配置(默认端口号(http默认80),con/server.xml)
部署(项目放到webapps下,打包war传输更快(自动解压缩))
web项目(开发者,开发完成可部署(webapp下的项目,打包war))
IDEA创建Maven Web项目
骨架(create from archetype)
IDEA使用tomcat
集成本地tomcat
maven插件(21年只支持到tomcat7)
1 | <build> |
2.3 Servlet
动态web开发
定义Servlet类实现Servlet接口,由web服务器运行
provided(运行时不用)
执行流程
生命周期(创建到销毁)
加载实例化(第一次访问,由容器创建)
初始化(init(),默认第一次访问调用,执行一次,loudOnStartup=1创建时调用)
请求处理(service(),每次请求servlet执行)
服务终止(destroy(),销毁内存释放或服务器关闭,执行一次)
Servlet 方法
getServletInfo()
getServletConfig()
2.3.1 Servlet体系结构
2.3.4 urlPattern配置
一个Servlet可以配置多个访问路径
精确匹配(可多个,访问路径相同,最常用)
目录匹配(带通配符,/user/*,优先级(精确>目录))
扩展名匹配(*.do,不以/开头)
任意匹配(/或/ ,优先级(/> /), 会覆盖tomcat默认servlet(无法访问静态资源))
2.3.5 XML配置方式表写Servlet
3.0版本后支持注解配置
2.4 request和response
2.4.1 request
查阅文档:HttpServletRequest
request获取请求方式
字节输入流(字符串),字节输入流(文件)
user-agent(浏览器版本)
request通用方式获取请求参数
解决参数中文乱码
get方法(utf-8用url编码,tomcat用ISO-8859-1解码(tomcat 8之后用utf-8解码))
二进制编码(一个汉字3个字节,每个字节转换为2个16进制)
请求转发
服务器内资源跳转方式
2.4.2 response
response重定向
资源跳转方式(302, location:)
路径问题
动态获取虚拟路径
响应数据
字符、流数据
2.4.3 登录注册
代码优化
3 JSP
java服务端页面,动态的网页技术,JSP= HTML+Java
JSP本质上是一个Servlet(tomcat自动完成,java文件,编译成字节码文件)
>
>
JSP缺点
EL表达式(替换获取数据代码) 数据存在域对象里
${expression}
JSTL标签(用标签取代JSP中Java代码)
el和jstl结合使用
3.1.1MVC模型和三层架构
分层开发模型(模型、视图、控制器)
三层架构
表现层(请求接受、封装、响应)、业务逻辑层(业务逻辑,数据访问)、数据访问层(数据库CRUD)
三层框架(SpringMvc, spring,MyBatis)
>
>
回话跟踪技术
回话跟踪(同一浏览器,同一次回话的多次请求共享数据,验证码、购物车、用户名)
解决http无状态
客户端(cookie)每次请求携带Cookie进行访问,cookie在浏览器中可以长期存在
服务端(session,实现基于cookie)服务器重启cookie不能消失(钝化,tomcat将session写入硬盘,活化,session重新加载,默认30分钟(登录时间太长,重新登录)),浏览器关闭session不是同一个
偏好设置(cookie长期)用户名(Session安全)购物车(cookie)用户名密码(cookie长期,但是不安全)验证码(session安全,防止暴力注册)用户登录之后的数据(session)
>
>
3. Filter 和 Listener
三大组件之一(Serlvlet,Filter,Listener)
权限控制(登录后操作)
类似servlet开发(定义类,实现接口重写方法,拦截路径注解,拦截放行)
3.1Filter 拦截路径设置
>
>
判断session对象有无user(登录相关的资源提前放行)
3.2 Listener
在application,session,request三个对象监听
并不常用
4 JSON
JavaScript对象表示法(数据载体)
5 Vue
前端框架,免除JavaScript里DOM操作
基于MMVC思想
5.1 Element
饿了么公司,快速开发网页前台
6 servlet优化
7. 综合案例
>
>
动态获取实现类,service impl
分页查询
条件查询
总结
各位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)
1.1 Spring Framework系统架构
核心容器(Core Container, 管理对象)
AOP(面向切面编程) Aspects(AOP思想实现)
Date Access(数据访问) Date Integration(数据集成)
Web(开发)
Test(单元、集成测试)
1.2 IoC
new对象转换为外部提供,控制器转移到外部(不用自己new)
IoC容器提供对象(管理的对象叫Bean)
DI(依赖注入,service和dao两个bean之间依赖)
管理Service和Dao,配置、接口、接口方法、导坐标
applicationContext.xml(resource下,先导坐标)创建bean
获取IoC容器->获取bean
DI
bean配置
spring默认bean是单例(效率更高,造一次反复用)
bean实例化
spring调用bean调用无参构造方法
bean 生命周期
自动装配
bean依赖的资源在容器中自动查找注入
autowire
主要用byType
自动装配用于引用类型依赖注入,不能对简单类型操作
加载properties文件
开启context命名空间
用context明快空间加载properties文件
使用${}读取文件中的属性
创建容器
注解开发定义bean
纯注解开发
Spring3.0开启纯注解开发
将applicationContext.xml写入到config的SpringConfig.class里
Spring 整合 MyBatis
SqlSessionFactoryBean
MapperScannerConfigurer
1.3 AOP
面向切面编程,组织程序结构
不惊动原始设计的基础上,进行功能增强
Spring理念(无入侵式编程)
执行通知的切入点,设置通知方法,连接切入点(一个或多个方法)和通知
通知(共性功能),切入点(匹配连接点的式子),连接点(程序中的任意位置)切面(描述通知和切入点对应关系)
匹配成功(创建原始对象的代理对象,增强)
获取bean(执行代理对象)
描述到接口,描述到实现类(不允许,紧耦合了)
原始操作可隔离(权限配置)
>
>
1.4 Spring 事务
数据库操作同时成功或失败
>
>
与jdbc同一个datasource
1.5 SpringMVC
和Servlet功能相同,web表现层开发
基于Java实现MVC模型的轻量级web框架
数据层:JDBC->MyBatis
业务层:
数据层:Servlet->SpringMVC
工作流程
加载spring的bean时(controller),排除springMvc要加载的bean
Postman工具
测试controller接口
模拟HTTP请求的chrome插件
请求映射路径
请求传参
(1)普通参数
(2)POJO 参数
(3)嵌套POJO
(4)数组传参
(5)集合传参
(6)json传参
(7)日期类型
响应
页面,数据(文本,json)
@ResponseBody
1.6 SSM 整合
REST 风格
不是规范,但是和规范差不多(后期REST风格)
3. Spring Security
认证(authentication,前提)和授权(authorization, 常态)
对已有项目添加认证功能
Spring全栈
对标Shiro(apache的,更改,但是Security基于java应用广)