课程设计
- Maven
- SpringBoot Web
- MySQL
- SpringBoot Mybatis
- SpringBoot Web开发篇
- SpringBoot Web进阶篇
maven(没学懂...跳过了...)
介绍:一款用于管理和构建java项目的工具,是Apache
软件基金会的项目
- 作用
- 依赖管理
- 同一项目结构
- 项目构建
- 项目结构
main
(实际项目资源)java
(源代码)resources
配置文件目录
test
java
resources
pom.xml
(项目配置文件)
仓库:用于存储资源,管理各种jar包
- 本地仓库:自己计算机上的一个目录
- 中央仓库:由maven团队维护的全球唯一的
- 远程仓库:一般由公式团队搭建的私有仓库
安装
- 解压压缩包
- 配置本地仓库
- 配置阿里云私服
- 配置环境变量
在IDEA集成中配置Maven

注:这个是单项目的配置,也可以在配置全局maven环境
创建maven项目
Maven坐标:
- 是资源的唯一标识,通过该坐标可以唯一定位资源位置
- 使用坐标来定义项目或引入项目中需要的依赖
Maven坐标组成
- groupid:定义当前Maven项目隶属组织名称(通常是域名反写)
- artifactid:定义当前Maven项目名称(通常是模块名称,例如order-service,goods-service)
- version:定义当前版本号
Web入门
Spring Boot: 可以帮助我们非常快速的构建应用程序,简化开发,提高效率
- 创建一个Spring Boot工程
- 勾选web开发相关的依赖项
- 定义HelloController类,并添加hello方法
- 运行测试
#小知识 连接VPN不如 用国内镜像快
java
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
System.out.println("hello");
return "hello";
}
}
HTTP协议
- HTTP 概述
- HTTP 请求协议
- HTTP 响应协议
- HTTP 协议解析
概念: Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
特点:
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型:一次请求对应一次响应
- HTTP协议是无状态的协议:对于事物处理没有记忆能力,即每次请求-响应都是独立的
- 缺点:多次请求间不能共享数据
- 优点:速度快
请求数据格式
请求行: 请求方式,资源路径,协议
请求头:
- Host:请求的主机名
- User - Agent:浏览器版本,例如 Chrome 浏览器的标识类似 Mozilla/5.0 ... Chrome/79,IE 浏览器的标识类似 Mozilla/5.0 (Windows NT ...) like Gecko
- Accept:表示浏览器能接收的资源类型,如 text/*,image/或者/* 表示所有;
- Accept - Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
- Accept - Encoding:表示浏览器可以支持的压缩类型,例如 gzip,deflate 等。
- Content - Type:请求主体的数据类型。
- Content - Length:请求主体的大小(单位:字节)。
请求体:
注:
- GET 请求参数在请求行中,没有请求体
- POST:请求参数在请求体中,请求大小没有限制
响应数据
响应行:(协议,状态码,描述)
响应头:
响应体:存放响应数据
状态码
- 1xx:响应中 - 临时状态码,表示请求已经接收,告诉客户端应该继续请求或者如果它已经完成则忽略它。
- 2xx:成功 - 表示请求已经被成功接收,处理已完成。
- 3xx:重定向 - 重定向到其他地方;让客户端再发起一次请求以完成整个处理。
- 4xx:客户端错误 - 处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等。
- 5xx:服务器错误 - 处理发生错误,责任在服务端。如:程序抛出异常等。
响应头
- Content-Type:表示该响应内容的类型,例如 text/html,application/json。
- Content-Length:表示该响应内容的长度(字节数)。
- Content-Encoding:表示该响应压缩算法,例如 gzip。
- Cache-Control:指示客户端应如何缓存,例如 max-age=300 表示可以最多缓存 300 秒。
- Set-Cookie:告诉浏览器为当前页面所在的域设置 cookie。
Tomcat
概念:Tomcat是Apache 软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范
目录结构说明
- bin 可执行文件
- conf 配置文件
- lib Tomcat依赖的jar包
- logs 日志文件
- temp 临时文件
- webapps 应用发布目录
- work 工作目录
运行:双击 startup.bat
乱码问题:在conf/logging.properties
中log配置改为GBK
#问题 :本地服务器启动后,浏览器中访问不到,端口也改了,没用
小结
- 起步依赖
- 内嵌Tomcat服务器
请求响应
- 请求(HttpServletRequest):获取请求数据
- 响应(HttpServletResponse):设置响应数据
- BS架构:Browser/Server:浏览器/服务器架构模式,应用程序的逻辑和数据都存储在服务端
- CS架构:Client/Server,客户端/服务器架构模式
请求
- apifox
- 简单参数
- 请求参数和形参名一致
- 如果不一致用 @RequestParam 手动映射
- 实体参数
- 数组集合参数
- 集合需要用 @RequestParam 绑定关系
- 日期参数
- Json参数 @RequestBody
- 路径参数 @PathVariable
简单参数
只需要保证参数名和url中的参数名保持一致就可以得到数据
java
//前端请求"http://localhost:8080/hello?name=changxin&age=25"
//前端发送的是post请求,后端向下面这样写也可以
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(@RequestParam(name = "name") String username,Integer age) {
System.out.println(username + ":" +age);
return "hello";
}
}
小结
- SpingBoot中接收简单参数
- 请求参数名于方法形参变量名相同
- 会自动进行类型转换
- @RequestParam注解
- 方法形参名称与请求参数名称不匹配,通过改注解完成映射
- 该注解的required 属性默认是true,代表请求参数必须传递
实体参数
规则:请求参数名与形参对象属性名相同,然后就可以直接接收了
java
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
@GetMapping("/hello2")
public String hello2(User user) {
System.out.println(user.getName() + ":" +user.getAge());
return "hello2";
}
数组集合参数
注:和上面那种情况类似,但是一个参数名接收多个参数
java
// http://localhost:8080/hello3?arr=changxin&arr=20
// 数组案例
@GetMapping("/hello3")
public String hello3(String[] arr) {
for(String item : arr){
System.out.println(item);
}
return "hello3";
}
@GetMapping("/hello4")
public String hello4(@RequestParam List<String> arr) {
for(String item : arr){
System.out.println(item);
}
return "hello4";
}
小结:
- 数组:请求参数名与形参中数组变量名相同,可以直接使用数组封装
- 集合:请求参数中集合变量名相同,通过@RequsetParam绑定参数关系
日期时间参数
java
@GetMapping("/hello5")
public String hello5(@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDateTime localDateTime) {
System.out.println(localDateTime);
return "hello5";
}
Json参数
@RequestMapping
更通用,可以处理多种 HTTP 方法(GET、POST、PUT、DELETE 等)@GetMapping
是专门为 GET 请求设计的,使代码更简洁明了
java
@RequestMapping("/hello6")
public String hello6(@RequestBody User user) {
System.out.println(user);
return "hello6";
}
注:注意上面的注解和get请求不一样
路径参数
java
//http://localhost:8080/hello7/1
@RequestMapping("/hello7/{id}")
public String hello7(@PathVariable Integer id) {
System.out.println(id);
return "hello7";
}
注:路径参数可以有多个,在后面加括号就好
响应数据
@ResponseBody
- 类型:方法注解,类注解
- 位置:Controller方法上/类上
- 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为iJSON格式响应
- 说明:@RestController = @Controller + @ResponseBody
响应结果的同一性:将响应数据封装到一个对象中,然后然会该对象
该对象
- 统一的字段,来向前端人员描述一些信息
- code:0/1 描述失败或者成功
- message: 补充说明
- data字段,可以将返回的数据封装在这里
该对象,对外提供很多静态方法
- succesd ---> 里面提供构造方法
- failed
补充:SpringBoot项目的静态资源(html,css,js)默认存放目录为:static ,public , resources
分层解耦
- 三层框架
- 分层解耦
- IOC & DI 入门
- IOC详解
- DI 详解
三层架构
优点:复用性强,便于维护,利于扩展
- controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据
- service:业务逻辑层,处理具体的业务逻辑
- dao : 数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的CRUD
分层解耦
-
内聚:软件中各个功能模块内部的功能联系
-
耦合:衡量软件中各个层/模块之间的依赖,关联的程度
-
软件设计原则:高内聚低耦合
-
控制反转:Inversion Of Control,简称
IOC
,对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转 -
依赖注入:Dependency Injection,简称
DI
,容器为应用程序提供运行时,所依赖的资源,称之为依赖注入 -
Bean对象:IOC容器中创建,管理的对象,称之为bean
IOC 和 DI 的入门
- @Component 将当前类交给IOC容器,成为IOC容器中的bean
- @Autowired 运行时,IOC容器会提供该类型的bean对象,并赋值给该变量 --> 依赖注入
注解 | 说明 | 位置 |
---|---|---|
@Component | 声明 bean 的基础注解 | 不属于以下三类时,用此注解 |
@Controller | @Component 的衍生注解 | 标注在控制器类上 |
@Service | @Component 的衍生注解 | 标注在业务类上 |
@Repository | @Component 的衍生注解 | 标注在数据访问类上(由于与 mybatis 整合,用的少) |
注:
- 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写
- 使用以上四个注解都可以声明bean,但是在soringboot集成web开发中,声明控制器bean只能用@Controller
Bean组件扫描
- 声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描
- @ComponentScan注解虽然没有显示配置,但是实际上已经包含在了类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包
依赖注入
如果同类型的bean存在多个:
- @Primary
- @Autowired + Qualifier("bean的名称")
- @Resource(name="bean的名称")
@Resource 与 @Autowired区别
- @Autowired 是spring框架提供的注解,而@Resource 是JDK提供的注解
- @Autowired 默认是安装类型注入,而@Resource默认是按照名称注入