JavaWeb合集05-SpringBoot基础知识

embedded/2024/10/18 22:01:09/

五、SpringBoot基础知识

0、实用方法

0.1 动态获取某个文件路径
java">//getResource( name:" emp.txt") 更具名称获取资源链接;getFile() 获取文件对象
String filePath=this.getClass().getClassLoader().getResource( name:" emp.txt").getFile();

1、Controller层

1.1 Controller请求
1.1.1 简单请求

发送简单请求给Springboot项目时,只需要通过声明数据类型和对应的形参名就能接收到请求过来的数据。

在这里插入图片描述

简单参数:如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射。

@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false。

在这里插入图片描述

1.1.2 实体参数

简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可

在这里插入图片描述

复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。

在这里插入图片描述

1.1.3 数组集合参数

数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数。

场景:多选框选择的参数,装到数组中。

在这里插入图片描述

集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam 绑定参数关系。

在这里插入图片描述

1.1.4 日期类型参数

日期参数:使用@DateTimeFormat注解完成日期参数格式转换。

在这里插入图片描述

1.1.5 JSON数据类型

JSON参数: JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识。

在这里插入图片描述

1.1.6 路径参数

路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数

在这里插入图片描述

在这里插入图片描述

1.2 Controller响应

@ResponseBody注解

类型:方法注解、类注解。

位置:Controller方法上 / 类.上

作用:将方法返回值直接响应,如果返回值类型是实体对象/集合,将会转换为JSON格式响应

说明:@RestController = @Controller + @ResponseBody ;

在这里插入图片描述

1.2.1 响应字符串

会直接以字符串的形式返回。

1.2.2 响应对象

@ResponseBody会将对象转换为JSON返回。

1.2.3 响应集合

@ResponseBody会将集合转换为JSON并装到数组里面进行返回。

1.2.4 统一响应规范

响应数据时,由于有3种类型,如果直接响应数据给前端,不易管理和维护,这时就可以定义一个工具类(通常命名为:Result)作为对象进行响应结果。

java">@Data
public class Result {//响应码 true 代表成功,false 代表失败private  boolean  flag;//提示信息private String  msg;//返回的数据private  Object  data;//空构造器public Result() {}//有参构造器public Result(boolean flag, String msg, Object data) {this.flag = flag;this.msg = msg;this.data = data;}//成功的静态方法(也可以直接new一个对象,通过有参构造器进行传值)public  static Result success(String msg,Object data){return   new Result(true,msg,data);}}
java">@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate IUserService iUserService; @PostMapping("/register")//返回值为Resul对象,请求的数据为JSON类型要加@RequestBodypublic Result registerSelect(@RequestBody User user) {//将前端发送过来的密码通过MD5进行加密String pwd =DigestUtils.md5DigestAsHex(user.getPassword().getBytes());//将加密的密码放会用户对象中user.setPassword(pwd);//创建一个返回结果对象,iUserService.userRegister(user)返回的是boolean类型的数据,为flagreturn new Result(iUserService.userRegister(user),"创建用户",null);}}

2、三层架构

controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。

service:业务逻辑层,处理具体的业务逻辑。

dao:数据访问层(Data Access Object) (持久层) ,负责数据访问操作,包括数据的增、删、改、查。

在这里插入图片描述

3、分层解耦

内聚:软件中各个功能模块内部的功能联系。

耦合:衡量软件中各个层/模块之间的依赖、关联的程度。

软件设计原则:高内聚低耦合。

问题:

由于三层架构中,每一层都需要下次成来提供对应的方法,所有要new 下一次的对象,如果上一层的类名发送改变,那么上一层就需要修改对应的类名,如下。

在这里插入图片描述

解决方案:

控制反转:Inversion Of Control,简称I0C。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

依赖注入:Dependency Injection,简称DI。 容器为应用程序提供运行时,所依赖的资源(对象),称之为依赖注入。

Bean对象:I0C容器中创建、管理的对象,称之为bean。

在这里插入图片描述

4、IOC与DI

①控制反转:Service层及Dao层的实现类,交给I0C容器管理。通过在这两个实现类上加上@Component注解,实现将当前类交给IOC容器管理,成为IOC容器中的bean。

②依赖注入:为Controller及Service注入运行时,依赖的对象。通在对应的成员变量上加上 @Autowiret注解,就可以获取到对应的对象。

java">@Component //将当前类交给IOC容器管理,成为IOC容器中的bean
public class User implements UserDao {
@Override
public List<User> listUser() {
return listUser;  
}
java">@RestController
public class UserController {
@Autowired //运行时,IOC容 器会提供该类型的bean对象,并赋值给该变量-依赖注入
private UserService userService;
@RequestMapping ("/listUser")
public Result list() {
//1. 调用service, 获取数据
List<Emp> empList = userService.listUser() ;
//3.响应数据
return Result. success(empList) ;
}
4.1 IOC详解

对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转(IOC)。

Bean的声明:要把某个对象交给I0C容器管理,需要在对应的类上加上如下注解之一

注解说明位置
@Component声明bean的基础注解不属于以下三类时,用此注解(如一些工具类)
@Controller@Component的衍生注解标注在控制器类上
@Service@Component的衍生注解标注在业务类上面
@Repository@Component的衍生注解标注在数据访问类上(由于与mybatis整合,用的少)

注意:

声明bean的时候,可以通过value属性指定bean的名字, 如果没有指定,默认为类名首字母小写。

使用以上四个注解都可以声明bean,但是在springboot集成web开发中, 声明控制器bean只能用@Controller。

4.1.1 Bean组件扫描
  1. 前面声 明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
  2. @ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。
4.2 DI详解

依赖注入是指,ICO容器要为应用程序提供应运行时,所依赖的资源(对象)

@Autowrite :自动装配,通过声明的数据类型来装配对应的bean对象。缺点,只能获取到一个相同类型的bean对象,如果有IOC容器里面有2个Bean对象,使用@Autowrite依赖注入就好报错。解决方案如下:

1、@Primary注解:使用它可以改变Bean对象的优先级(高优先级),使用方式:直接在控制反转注解上加上@Primary注解即可。

java">@Primary   //使被注解的Bean对象的优先级最高
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User>  implements IUserService {@Autowiredprivate UserDao userDao;
}

2、@Qualifier注解:通过它在依赖注入前(@Autowrite)声明要注入的Bean对象。

java">@RestController
public class UserController {@Qualifier("userServiceImpl")//参数为要注入的Bean对象名。Bean对象默认是注解时类名第一个字母小写。@Autowiredprivate IUserService iUserService;
}

3、@Resource注解:通过它来代替@Autowrite注解,直接指定要注入的Bean对象,参数name的值就是要注入的Bean对象。

java">@RestController
public class UserController {@Resource(name="userServiceImpl")
@Qualifier("userServiceImpl")//参数为要注入的Bean对象名。Bean对象默认是注解时类名第一个字母小写。private IUserService iUserService;
}

http://www.ppmy.cn/embedded/128565.html

相关文章

OPENSSL-2023/11/10学习记录-C/C++对称分组加密DES

对称分组加密常用算法&#xff1a; DES 3DES AES 国密SM4 对称分组加密应用场景&#xff1a; 文件或者视频加密 加密比特币私钥 消息或者配置项加密 SSL通信加密 对称分组加密 使用异或实现一个简易的对称加密算法 A明文 B秘钥 AB密文AB (AB)B A 密码补全和初始化 数…

猫鼠游戏: KaijiK病毒入侵溯源分析

1. 事件背景 近期&#xff0c;网宿平台某客户在使用云主机工作的时候突然出现主机卡顿&#xff0c;连接不稳定&#xff0c;网络断开的情况&#xff0c;并且收到了网宿主机入侵检测产品的告警信息。由于客户没有专职的安全人员&#xff0c;由运维人员兼任安全运营工作&#xff…

WebGoat SQL Injection (intro) 源码分析

首先了解 java 中 mysql 的连接&#xff1a;java连接Mysql WebGoat SQL Injection (intro) 10 根据提示&#xff1a;下面两个输入框只有一个受到 sql 注入攻击。题目要求是检索到所有数据 发现请求路径为 SqlInjection/assignment5b 定位到所在文件如下&#xff0c;根据代码…

【CTF Web】Pikachu getimagesize() Writeup(文件上传+PHP+文件包含漏洞+JPEG图片马+getimagesize绕过)

不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等&#xff0c;然后将其按照设计的格式进行重…

TCAD仿真中解析函数的应用

目录 使用解析函数进行精细化 I-Using Analytic Functions for Refinement I定义 (Definitions)细化 "Region_1" (Refinement "Region_1")解析轮廓 "Profile_1" (AnalyticalProfile "Profile_1") 放置 (Placements)细化 "Region_…

MySQL面试专题-索引

一、MySQL为什么要选择B树来存储索引&#xff1f; MySQL的索引选择B树作为数据结构来进行存储&#xff0c;其本质原因在于可以减少IO次数&#xff0c;提高查询效率&#xff0c;简单来说就是保证在树的高度不变的情况下可以存储更多的数据。 &#xff08;一&#xff09;IO角度 在…

计算机网络—静态路由

1.0 网络拓扑结构 星型拓扑结构是一个中心&#xff0c;多个分节点。它结构简单&#xff0c;连接方便&#xff0c;管理和维护都相对容易&#xff0c;而且扩展性强。网络延迟时间较小&#xff0c;传输误差低。中心无故障&#xff0c;一般网络没问题。中心故障&#xff0c;网络就出…

[Python基础](1) 输入与输出的实现

作者制作不易&#xff0c;关注、点赞、收藏一下吧! 1.输入 一般的&#xff0c;输入使用Python内置函数 input(): 变量名 input() 变量存储输入的数据&#xff0c;括号中可以加提示语&#xff0c;也可以不加。 a input("你叫什么?") # 输入 print(a) # 输出&a…