文章目录
1.入门
- Spring Boot : 快速方便地构建出一个Spring程序
- Spring Framework :Spring框架,最底层最基础的框架
- Spring Data : 封装了一系列访问数据库的技术
- Spring Cloud : 用来构建微服务项目
- Spring Security : 安全框架
2.创建项目
- 1.

- 2


- 3.创建好后,有些文件可以删除

3.HTTP
- http协议概述
- 响应协议
-

-

-

-
web服务器

-

-
Tomcat介绍
-

-

-
启动

-
打开tomcat出现的问题:

-


-

-

-


-
-
4.请求响应


- 工具:postman

- 安装步骤:可按照该步骤进行
- 创建项目:





- 创建项目:
- 更改别名,文件夹设置

5.简单参数的接收

- 简单参数

- springboot方式



package com.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 "success";
// }
//#################################################
//springboot方式
// @RequestMapping("simpleParam")
// public String simpleParam(String name, Integer age){
//
// System.out.println(name + " " + age);
// return "success";
// }
//#################################################
//当方法形参名称和请求参数名称不匹配的时候,使用@RequestParam注解
@RequestMapping("simpleParam")
public String simpleParam(@RequestParam(name="name") String username, Integer age){
System.out.println(username + " " + age);
return "success";
}
}
6.实体参数的接收
- 规则:请求参数名和形参对象属性名相同
- 简单实体参数

package com.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 com.example.springboot_web_start.controller;
import com.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 "success";
}
}
- 复杂实体参数
package com.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 com.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 com.example.springboot_web_start.controller;
import com.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("complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "success";
}
}
7.数组集合参数
- 数组:请求参数名和形参中的数组变量名相同,可以直接使用数组封装
- 请求参数名和形参中集合变量名相同,通过@RequestParam绑定参数关系


//3.数组参数
@RequestMapping("arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "success";
}
//集合参数
@RequestMapping("listParam")
public String listParam(@RequestParam(name="hobby") List<String> hobby){
System.out.println(hobby);
return "success";
}
8.日期参数

//4.日期时间参数
@RequestMapping("dateParam")//指定请求路径
public String dateParam(@DateTimeFormat(pattern ="yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "success";
}
9.JSON参数

//JSON参数
@RequestMapping("jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "success";
}
10.路径参数
- 一个参数

- 多个参数

//6.路径参数
@RequestMapping("pathVariable/{id}")//指定请求路径
public String pathVariable(@PathVariable Integer id){
System.out.println(id);
return "success";
}
//多个参数
@RequestMapping("pathVariable/{id}/{name}")//指定请求路径
public String pathVariable(@PathVariable Integer id, @PathVariable String name){
System.out.println(id + " " + name);
return "success";
}
- 总结

11.响应
- @ResponseBody
- 位置:Controller类上/方法上
- 作用:将方法返回值直接响应,若返回值类型是 实体对象/集合 转JSON格式

- 响应回去的数据没有规范:不方便管理
package com.example.springboot_web_start.controller;
import com.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 com.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 success(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,"success","hello");
return Result.success("hello");
}
//返回对象
@RequestMapping("/getAddr")
public Result getAddr(){
Address address = new Address();
address.setCity("北京");
address.setAddress("长安街");
return Result.success(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.success(addressList);
}
- 统一响应案例


12.分层解耦


- 分层后代码

- 内聚:软件中各个功能模块内部的功能联系
- 耦合:衡量软件中各个层/模块之间的依赖,关联的程度
- 软件设计原则:高内聚低耦合
- 高内聚:模块内部的功能联系越紧密越好(在一个模块中只存放与该模块有关的相关处理)
- 低耦合: 降低层与层之间/模块与模块之间的依赖关联

- IOC 与 DI入门

- 解耦例子
- @Component(控制反转) //将当前类交给IOC容器管理,成为IOC容器中的 bean
- @Autowired(依赖注入) //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量



- IOC详解
- 指将对象的控制权交给IOC容器,由IOC容器来创建及管理这些对象,ioc中的对象也称为bean对象,@component可以用来声明一个bean对象

- @Controller,@Service,@Repository 分别对应Controller,Service,Dao层的注解;@Component用于不属于这三个在内的


- 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定义方法中设置形参即可,容器会根据类型自动匹配
-
另一种配置注入
-

-
- @Component 及衍生注解与@Bean注解使用场景
- 项目中自己定义的使用@Component及其衍生注解
- 项目中引入第三方的,使用@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











被折叠的 条评论
为什么被折叠?



