1.入门
-
- Spring Boot : 快速方便地构建出一个Spring程序
- Spring Framework :Spring框架,最底层最基础的框架
- Spring Data : 封装了一系列访问数据库的技术
- Spring Cloud : 用来构建微服务项目
- Spring Security : 安全框架
2.创建项目
- 1.
- 2
- 3.创建好后,有些文件可以删除
3.HTTP
- http协议概述
-
- 响应协议
-
web服务器
-
-
Tomcat介绍
-
启动
-
打开tomcat出现的问题:
-
双击startup.bat闪退的解决方法
-
4.请求响应
- 工具:postman
- 安装步骤:可按照该步骤进行
- 创建项目:
- 创建项目:
- 更改别名,文件夹设置
5.简单参数的接收
- 简单参数
- springboot方式
package ***.example.springboot_web_start.controller;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestController {
//springmvc方式
// @RequestMapping("simpleParam")
// public String simpleParam(HttpServletRequest request){
// String name = request.getParameter("name");
// String ageStr = request.getParameter("name");
// int age = Integer.parseInt(ageStr);
// System.out.println(name + " " + age);
// return "su***ess";
// }
//#################################################
//springboot方式
// @RequestMapping("simpleParam")
// public String simpleParam(String name, Integer age){
//
// System.out.println(name + " " + age);
// return "su***ess";
// }
//#################################################
//当方法形参名称和请求参数名称不匹配的时候,使用@RequestParam注解
@RequestMapping("simpleParam")
public String simpleParam(@RequestParam(name="name") String username, Integer age){
System.out.println(username + " " + age);
return "su***ess";
}
}
6.实体参数的接收
- 规则:请求参数名和形参对象属性名相同
- 简单实体参数
package ***.example.springboot_web_start.pojo;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
///////////////////////////////////////////////////////////////////////////////////////////
package ***.example.springboot_web_start.controller;
import ***.example.springboot_web_start.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestController {
//2.实体参数
@RequestMapping("simplePojo")
public String simplePojo(User user){
System.out.println(user);
return "su***ess";
}
}
- 复杂实体参数
package ***.example.springboot_web_start.pojo;
public class Address {
private String address;
private String city;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"address='" + address + '\'' +
", city='" + city + '\'' +
'}';
}
}
//////////////////////////////////////////////////////////////////////////////////////////
package ***.example.springboot_web_start.pojo;
public class User {
private String name;
private int age;
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package ***.example.springboot_web_start.controller;
import ***.example.springboot_web_start.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestController {
//复杂实体参数
@RequestMapping("***plexPojo")
public String ***plexPojo(User user){
System.out.println(user);
return "su***ess";
}
}
7.数组集合参数
- 数组:请求参数名和形参中的数组变量名相同,可以直接使用数组封装
- 请求参数名和形参中集合变量名相同,通过@RequestParam绑定参数关系
//3.数组参数
@RequestMapping("arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "su***ess";
}
//集合参数
@RequestMapping("listParam")
public String listParam(@RequestParam(name="hobby") List<String> hobby){
System.out.println(hobby);
return "su***ess";
}
8.日期参数
//4.日期时间参数
@RequestMapping("dateParam")//指定请求路径
public String dateParam(@DateTimeFormat(pattern ="yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "su***ess";
}
9.JSON参数
//JSON参数
@RequestMapping("jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "su***ess";
}
10.路径参数
- 一个参数
- 多个参数
//6.路径参数
@RequestMapping("pathVariable/{id}")//指定请求路径
public String pathVariable(@PathVariable Integer id){
System.out.println(id);
return "su***ess";
}
//多个参数
@RequestMapping("pathVariable/{id}/{name}")//指定请求路径
public String pathVariable(@PathVariable Integer id, @PathVariable String name){
System.out.println(id + " " + name);
return "su***ess";
}
- 总结
11.响应
- @ResponseBody
- 位置:Controller类上/方法上
- 作用:将方法返回值直接响应,若返回值类型是 实体对象/集合 转JSON格式
- 响应回去的数据没有规范:不方便管理
package ***.example.springboot_web_start.controller;
import ***.example.springboot_web_start.pojo.Address;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class ResponseController {
//返回字符串
@RequestMapping("/hello")
public String hello(){
System.out.println("hell");
return "hello";
}
//返回对象
@RequestMapping("/getAddr")
public Address getAddr(){
Address address = new Address();
address.setCity("北京");
address.setAddress("长安街");
return address;
}
//返回list集合
@RequestMapping("/getAddrList")
public List<Address> getAddrList(){
List<Address> addressList = new ArrayList<>();
Address address1 = new Address();
address1.setCity("北京");
address1.setAddress("长安街");
addressList.add(address1);
Address address2 = new Address();
address2.setCity("上海");
address2.setAddress("南京路");
addressList.add(address2);
return addressList;
}
}
- 方法:同一响应结果
- Result(code ,msg ,data)
package ***.example.springboot_web_start.pojo;
/*
统一响应结果封装类
*/
public class Result {
private Integer code;//1 成功 0 失败
private String msg;//提示信息
private Object data;//返回数据
public Result() {
}
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static Result su***ess(Object data){
return new Result(1,"操作成功",data);
}
public static Result error(Object data){
return new Result(0,"操作失败",null);
}
public static Result error(String msg,Object data){
return new Result(0,msg,null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//返回字符串
@RequestMapping("/hello")
public Result hello(){
System.out.println("hell");
// return new Result(1,"su***ess","hello");
return Result.su***ess("hello");
}
//返回对象
@RequestMapping("/getAddr")
public Result getAddr(){
Address address = new Address();
address.setCity("北京");
address.setAddress("长安街");
return Result.su***ess(address);
}
//返回list集合
@RequestMapping("/getAddrList")
public Result getAddrList(){
List<Address> addressList = new ArrayList<>();
Address address1 = new Address();
address1.setCity("北京");
address1.setAddress("长安街");
addressList.add(address1);
Address address2 = new Address();
address2.setCity("上海");
address2.setAddress("南京路");
addressList.add(address2);
return Result.su***ess(addressList);
}
- 统一响应案例
12.分层解耦
- 分层后代码
- 内聚:软件中各个功能模块内部的功能联系
- 耦合:衡量软件中各个层/模块之间的依赖,关联的程度
- 软件设计原则:高内聚低耦合
- 高内聚:模块内部的功能联系越紧密越好(在一个模块中只存放与该模块有关的相关处理)
- 低耦合: 降低层与层之间/模块与模块之间的依赖关联
- IOC 与 DI入门
- 解耦例子
- @***ponent(控制反转) //将当前类交给IOC容器管理,成为IOC容器中的 bean
- @Autowired(依赖注入) //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量
- IOC详解
- 指将对象的控制权交给IOC容器,由IOC容器来创建及管理这些对象,ioc中的对象也称为bean对象,@***ponent可以用来声明一个bean对象
- @Controller,@Service,@Repository 分别对应Controller,Service,Dao层的注解;@***ponent用于不属于这三个在内的
- DI详解
-
13.配置优先级
命令行参数 > java系统属性 > application.properties > application.yml > application.yaml
- 在项目打包后如何制定java属性和命令行参数(优先级高于java属性参数)
-
- 在右侧Maven中 --> 点击Lifecycle --> package双击 – > 左侧target目录下-- > Open in – > Explorer – > 在文件中找到jar包 – > 在路径输入cmd,进入命令行–> (设置java属性,命令行参数在args里设置)java[options] - jar<jar 文件名>[args]
14.Bean管理
- 获取bean
- 会把其中的bean创建好,会受到作用域及延迟初始化影响,这里主要针对于默认的单例非延迟加载的bean而言
- bean作用域
-
- 案例
- 单例
- 非单例
-
- 第三方bean
-
启动类里的声明注释掉
-
配置类
-
-AliasFor是别名
-
可以通过注解的name/value属性指定bean的名称,未指定的话还是使用默认方法名saxReader
-
- 如果第三方bean需要依赖其他bean对象,直接zaibean定义方法中设置形参即可,容器会根据类型自动匹配
-
另一种配置注入
- @***ponent 及衍生注解与@Bean注解使用场景
- 项目中自己定义的使用@***ponent及其衍生注解
- 项目中引入第三方的,使用@Bean注解
15.Springboot原理
- 前提:引入依赖,版本必须匹配
- 自动配置
-
Springboot只能扫描启动类所在包及其子包
-
原理
-
方案一缺点:使用繁琐,性能低
-
案例:扫描两个包
-
二
-
1.普通类
-
2.配置类
-
3.ImportSelector
-
4.@EnableXxx注解
-
//ctrl+f 搜索,两次shift看原码
-
-
- 自动配置原理
-
(@EnableAutoConfiguration)AutoConfigureImportSelector里面实现了selectImports这个方法,String数组封装的是要导入spring ioc容器的类的全类名
-
注意是按条件装配(@ConditionalMissBean)
-
1.
-
2.
//该类型指的是声明的类型,没有这个bean才会声明这个类型
-
-
- 自动配置原理
-
//在该文件中存在name的值才会将bean加入ioc容器中
-
-
-
- 案例
-
- 步骤:
-
1.创建两个模块(starter依赖管理;autoconfigure自动配置):autoconfigure修改版本为2.7.5,依赖只剩下spring-boot-starter,只留下src与.iml文件,src文件里启动类和.properties还有测试类都删掉,作为第三方模块
-
2.在starter文件中添加autoconfigure依赖
-
3.在autoconfigure里定义AliOSSProperties工具类
-
添加依赖
-
阿里云工具类
-
4.创建配置类
-
5.创建resources下的文件
-
6.创建测试类
-
添加starter依赖
-
配置.yml文件
-
测试方法
-
-
- 步骤:
-
-
16.总结
-
web开发基于三层架构
- Controller层负责接收请求
- Service层具体业务逻辑处理
- Dao层(数据访问层也叫持久层)用来处理数据访问操作 ,对数据库的数据进行增删改查
- 流程:前端发出请求,Controller调用service进行逻辑处理,service调用daoceng完成数据访问操作
- 执行具体业务处理之前的一些通用操作,需要借助java -web中三大组件之一的过滤器filter/或者拦截器intercepter
- 实现三层架构之间的解耦,需要使用IOC(控制反转:将对象创建的控制权由应用程序自身交给外部容器’ioc容器 / spring容器’ ,声明为spring容器中的bean对象) 和 DI(依赖注入 : 指容器为程序提供运行时所需的资源)
-
拦截器和全局异常处理属于Spring framework-web ,springMVC属于Spring framework