【JavaWeb-Spring boot】学习笔记

目录

  • <<回到导览
    • Spring boot
      • 1. http协议
        • 1.1.请求协议
        • 1.2.响应协议
      • 2.Tomcat
        • 2.1.请求
          • 2.1.1.apifox
          • 2.1.2.简单参数
          • 2.1.3.实体参数
          • 2.1.4.数组集合参数
          • 2.1.5.日期参数
          • 2.1.6.(重点)JSON参数
          • 2.1.7.路径参数
        • 2.2.响应
        • 2.3.综合练习
      • 3.三层架构
        • 3.1.三层拆分
        • 3.2.分层解耦
        • 3.3.补充

<<回到导览

Spring boot

Spring boot官网

简介:Spring Boot 基于Spring,简化了配置,降低的入门难度,可以帮助我们非常快速的构建应用程序、简化开发、提高效率

需求:使用 SpringBoot 开发一个web应用,浏览器发起请求 /hello后,给浏览器返回字符串 “Hello World ~”

  1. 创建spring boot项目(保证网络间接正常)

    在这里插入图片描述

    在这里插入图片描述

  2. 删除一些暂时不用的文件

    在这里插入图片描述

  3. 在包下创建文件

    在这里插入图片描述

  4. 编写这个文件

    // 请求处理类
    @RestController
    public class HelloController {// 表名这个请求处理类,处理的是“/hello”@RequestMapping("/hello")public String Hello() {System.out.println("Hello World");return "Hello World!!!";}
    }
    

    运行启动类(SpringDemoApplication)

    在这里插入图片描述

  5. 访问服务

    访问http://localhost:8080/hello或者http://127.0.0.1:8080/hello

    在这里插入图片描述

每访问一次这个服务,控制台还会打印一次Hello World

1. http协议

概念:Hyper Text Transfer Protocol, 超文本传输协议,规定了浏览器和服务器之间数据传输的规则。

特点:

  1. 基于TCP协议:面向连接,安全
  2. 基于请求-响应模型的:一次请求对应一次响应
  3. HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
    • 缺点:多次请求间不能共享数据。
    • 优点:速度快
1.1.请求协议
请求方式请求参数位置请求大小
GET在请求行(没有请求体)有大小限制
POST在请求体没有大小限制
  • GET请求

    在这里插入图片描述

  • POST请求

    在这里插入图片描述

1.2.响应协议

响应协议和POST请求有些相似,分为响应行、响应头、响应体,响应数据放在响应体里面

在这里插入图片描述

状态码说明
1xx临时状态码,表示请求已经接收,应该继续请求或者如果它已经完成则忽略它。
2xx成功接收,处理已完成。
3xx重定向到其他地方;让客户端再发起一次请求以完成整个处理。
4xx客户端错误,责任在客户端。(如:请求了不存在的资源、客户端未被授权、禁止访问等。)
5xx服务器错误,责任在服务端。(如:程序抛出异常等)。
常用状态码解释
200处理成功
302/304location重定向/隐式重定向
400客户端语法错误
403服务器拒绝提供服务(没有权限)
404请求资源不存在(url错误)
405请求方式有误
500服务器发生不可预期的错误
503服务器尚未准备好处理请求

2.Tomcat

Web服务器是一个软件程序,对HTTP协议的操作进行封装,简化web服务器开发

作用:部署web项目,对外提供网上信息浏览服务

Tomcat:一个轻量级的web服务器,支持servlet、jsp等少量avaEE规范。也被称为web容器、servlet容器。

起步依赖:利用maven中依赖传递的特性,把开发某一个功能常见的依赖整合在一起(如web)

在这里插入图片描述

在spring boot web开发环境中,已经集成了Tomcat

在这里插入图片描述

2.1.请求
2.1.1.apifox

apifox官网:https://app.apifox.com/

apifox使用教程:https://www.bilibili.com/video/BV1Jc41147xC

在使用apifox之前要安装插件Apifox Browser Extension

在这里插入图片描述

尝试用apifox测试接口

在这里插入图片描述

2.1.2.简单参数

简单参数:参数名和变量名相同,定义形参即可接收参数

@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(String name, int age) {System.out.println(name + ":" + age);return "OK";}
}

在这里插入图片描述

如果方法形参名称与请求参数名称不匹配,不能接收值,但是不会报错

这时,可以使用@RequestParam完成映射,但是该注解的required属性默认是true,代表请求参数必须传递

@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name = "name") String username, int age) {System.out.println(username + ":" + age);return "OK";}
}
2.1.3.实体参数

实体参数:多个参数名和形参变量名相同,定义POJO接收即可

@RestController
public class RequestController {@RequestMapping("/simplePojo")public String simpleParam(User user) {System.out.println(user);return "OK";}
}
public class User{private String name;private int age;// Getter、Setter、toString
}

在这里插入图片描述

  • 示例

    为上面用户添加地址信息(包含省份和城市)

    @RestController
    public class RequestController {@RequestMapping("/complexPojo")public String complexPojo(User user) {System.out.println(user);return "OK";}
    }
    
    public class User{private String name;private int age;private Address address;// Getter、Setter、toString
    }
    
    public class Address {private String province;private String city;// Getter、Setter、toString
    }
    

    在这里插入图片描述

2.1.4.数组集合参数
  • 数组参数:请求参数名与形参数组名称相同,定义数组类型形参即可接收参数

    @RestController
    public class RequestController {@RequestMapping("/arrayParam")public String arrayParam(String[] hobby) {System.out.println(Arrays.toString(hobby));return "OK";}
    }
    

    在这里插入图片描述

  • 集合参数:请求参数名与形参集合名称相同,通过@RequestParam绑定参数关系

    @RestController
    public class RequestController {@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby) {System.out.println(hobby);return "OK";}
    }
    

    在这里插入图片描述

2.1.5.日期参数

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

@RestController
public class RequestController {@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime updateTime) {System.out.println(updateTime);return "OK";}
}

在这里插入图片描述

2.1.6.(重点)JSON参数

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

在上面的请求中,都是用的GET请求方式,请求参数在请求行,但利用json字符串传参要用POST请求方式,请求参数在请求体

  • 例如:

    {"name":"Tom","age":18,"address":{"province":"四川","city":"成都"}
    }
    
  • json参数传递

    @RestController
    public class RequestController {@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user);return "OK";}
    }
    

    在这里插入图片描述

2.1.7.路径参数

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

@RestController
public class RequestController {@RequestMapping("/pathParam/{id}")public String pathParam(@PathVariable Integer id) {System.out.println(id);return "OK";}
}

在这里插入图片描述

  • 传递多个路径参数

    @RestController
    public class RequestController {@RequestMapping("/pathParam/{id}/{uid}")public String pathParam(@PathVariable Integer id, @PathVariable Integer uid) {System.out.println(id + "," + uid);return "OK";}
    }
    

    在这里插入图片描述

2.2.响应

@RestController注解包含了@ResponseBody注解@Controller注解

  • 统一响应结果:

    1. 响应码
    2. 提示信息
    3. 返回的数据
    // Result
    public class Result {private Integer code ;//1 成功 , 0 失败private String msg; //提示信息private Object data; //数据 datapublic 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, "success", data);}public static Result success(){return new Result(1, "success", null);}public static Result error(String msg){return new Result(0, msg, null);}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
    }
    
  • 改写请求

    @RequestMapping("/simpleParam")
    public Result simpleParam(String name, int age) {System.out.println(name + ":" + age);return Result.success("Hello World");
    }
    

    在这里插入图片描述

2.3.综合练习

获取员工数据,返回统一响应结果,在页面中渲染(相关资料可以在黑马官方公众号下载)

  1. 在pom.xml文件中引入dom4j的依赖,用于解析XML文件

    <!-- 解析xml -->
    <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version>
    </dependency>
    
  2. 引入资料中提供的解析XML的工具类XMLParserUtils、对应的实体类Emp、XML文件 emp.xml

  3. 引入资料中提供的静态页面文件,放在resources下的static目录下

    在这里插入图片描述

  4. 编写Controller程序,处理请求,响应数据

    @RestController
    public class EmpController {@RequestMapping("/listEmp")public Result list() {// 1. 加载解析xmlString file = "D:\\桌面\\Java\\Java(下)\\spring_demo\\src\\main\\resources\\emp.xml";List<Emp> empList = XmlParserUtils.parse(file, Emp.class);// 2. 对数据进行转换处理empList.forEach(emp -> {String gender = emp.getGender();if("1".equals(gender)) {emp.setGender("男");}else if("2".equals(gender)) {emp.setGender("女");}String job = emp.getJob();if("1".equals(job)) {emp.setJob("教师");}else if("2".equals(job)) {emp.setGender("学生");}});// 3. 响应数据return Result.success(empList);}
    }
    
  • 尝试发送请求

    在这里插入图片描述

  • 通过浏览器访问前端页面

    在这里插入图片描述

3.三层架构

在上一节的综合练习中,代码的不同的业务逻辑写在了一起,导致代码复用性差,难以维护

在这里插入图片描述

为此设计了三层架构来优化

功能分类对应层说明
数据访问controller(控制层)接收前端发送的请求,对请求进行处理,并响应数据
逻辑处理service(业务逻辑层)处理具体的业务逻辑
接收请求、响应数据dao(数据访问层,Data Access Object)数据访问操作(包括增、删、改、查)

controller => service => dao (=>表示调用关系)

3.1.三层拆分

我们将上面三部分的代码分别写到对应层,每个对应层有一个接口(要做的事情),每个接口可以有若干个实现方案(实现类)

在这里插入图片描述

  1. 数据访问层(dao)

    // 接口
    public interface Empdao {// 获取员工列表public List<Emp> empList();
    }
    
    // 实现类
    public class EmpDaoA implements Empdao {@Overridepublic List<Emp> empList() {// 1. 加载解析xmlString file = "D:\\桌面\\Java\\Java(下)\\spring_demo\\src\\main\\resources\\emp.xml";List<Emp> empList = XmlParserUtils.parse(file, Emp.class);return empList;}
    }
    
  2. 业务逻辑层(service)

    // 接口
    public interface EmpService {public List<Emp> empList();
    }
    
    // 实现类
    public class EmpServiceA implements EmpService {private Empdao empdao = new EmpDaoA();@Overridepublic List<Emp> empList() {// 调用dao层接口List<Emp> empList = empdao.empList();// 2. 对数据进行转换处理empList.forEach(emp -> {String gender = emp.getGender();if("1".equals(gender)) {emp.setGender("男");}else if("2".equals(gender)) {emp.setGender("女");}String job = emp.getJob();if("1".equals(job)) {emp.setJob("教师");}else if("2".equals(job)) {emp.setGender("学生");}});return empList;}
    }
    
  3. 控制层(controller)

    @RestController
    public class EmpController {private EmpService empService = new EmpServiceA();@RequestMapping("/listEmp")public Result list() {// 3. 响应数据return Result.success(empService.empList());}
    }
    
3.2.分层解耦
  • 内聚:软件中各个功能模块内部的功能联系。
  • 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
  • 软件设计原则:高内聚低耦合

在上节的三层拆分中,三个层级耦合性比较高,我们要降低耦合性

控制反转(IOC):对象的创建控制器由程序自身转移到外部(容器),通过@Component注解实现

依赖注入(DI):容器为应用程序提供运行时所依赖的资源,通过@Autowired注解实现

  1. Service层、Dao层的实现类,交给IOC容器管理(控制反转)

    // Service层
    @Component
    public class EmpServiceA implements EmpService {private Empdao empdao;// ...
    }
    
    // Dao层
    @Component
    public class EmpDaoA implements Empdao {// ...
    }
    
  2. 为Controller层、Service层注入运行时依赖的对象(依赖注入)

    @RestController
    public class EmpController {@Autowiredprivate EmpService empService;// ...
    }
    
    // Service层
    @Component
    public class EmpServiceA implements EmpService {@Autowired  // 程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量private Empdao empdao;// ...
    }
    
3.3.补充
注解声明位置
@Componentbean的基础注解不属于以下三类时,用此注解(eg:工具类)
@Controller@Component的衍生注解标注在控制器类上(@RestController注解已包括,一般不写)
@Service@Component的衍生注解标注在业务逻辑类上
@Repository@Component的衍生注解标注在数据访问类上(由于与mybatis整合,用的少)

了解:

  • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
  • @ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++的多态-上

目录 多态的概念 多态的定义及实现 1.虚函数 2. 多态的实现 2.1.多态构成条件 2.2.虚函数重写的两个例外 (1)协变(基类与派生类虚函数返回值类型不同) (2)析构函数的重写(基类与派生类析构函数的名字不同) 2.3.多态的实现 2.4.多态在析构函数中的应用 2.5.多态构成条…

网络安全的重要性与防护措施

随着信息技术的飞速发展&#xff0c;互联网已经成为我们日常生活、工作和学习的必需品。无论是通过社交媒体与朋友互动&#xff0c;还是在网上进行银行交易&#xff0c;网络已经渗透到我们生活的方方面面。然而&#xff0c;随之而来的是各种网络安全问题&#xff0c;包括数据泄…

CMake学习--Window下VSCode 中 CMake C++ 代码调试操作方法

目录 一、背景知识二、使用方法&#xff08;一&#xff09;安装扩展&#xff08;二&#xff09;创建 CMake 项目&#xff08;三&#xff09;编写代码&#xff08;四&#xff09;配置 CMakeLists.txt&#xff08;五&#xff09;生成构建文件&#xff08;六&#xff09;开始调试 …

访问数组元素(四十四)

1. 数组下标与类型 数组的索引从 0 开始。例如&#xff0c;一个包含 10 个元素的数组&#xff0c;其合法下标范围为 0 到 9&#xff0c;而不是 1 到 10。为了表示下标&#xff0c;通常使用 size_t 类型&#xff0c;它是一种与机器相关的无符号整型&#xff0c;足够大以存放内存…

计算机网络 3-1 数据链路层(功能+组帧+差错控制)

【考纲内容】 &#xff08;一&#xff09;数据链路层的功能 &#xff08;二&#xff09;组帧 &#xff08;三&#xff09;差错控制 检错编码&#xff1b;纠错编码 &#xff08;四&#xff09;流量控制与可靠传输机制 流量控制、可靠传输与滑动窗口机制&#xff1b;停止-等…

Django中使用不同种类缓存的完整案例

Django中使用不同种类缓存的完整案例 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 Django中使用不同种类缓存的完整案例步骤1:设置Django项目步骤2:设置URL路由步骤3:视图级别…

Spring Boot 集成Redis 的Lua脚本详解

1. 对比Lua脚本方案与Redis自身事务 对比表格 对比维度Redis事务&#xff08;MULTI/EXEC&#xff09;Lua脚本方案原子性事务命令序列化执行&#xff0c;但中间可被其他命令打断&#xff0c;不保证原子性Lua脚本在Redis单线程中原子执行&#xff0c;不可中断计算能力仅支持Red…

【大模型】DeepSeek + 蓝耕MaaS平台 + 海螺AI生成高质量视频操作详解

目录 一、前言 二、蓝耘智能云MaaS平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 平台核心能力 三、海螺AI视频介绍 3.1 海螺AI视频是什么 3.2 海螺AI视频主要功能 3.3 海螺AI视频应用场景 3.4 海螺AI视频核心优势 3.5 项目git地址 四、蓝耘MaaS平台DeepSeek海…

12-产品经理-维护模块

需求模块是帮助产品经理进行需求的分类和维护。 1. 维护模块 在具体产品的“研发需求”页面左侧&#xff0c;点击“维护模块”。也可以在具体产品的“设置”-“模块”下进行维护。 点击保存后&#xff0c;返回模块页面。还可以点击“子模块”对已有模块进行子模块的维护。 点击…

考研单词笔记 2025.04.06

area n领域&#xff0c;范围&#xff0c;方面&#xff0c;地区&#xff0c;地方&#xff0c;场地&#xff0c;面积 aspect n方面&#xff0c;层面&#xff0c;外表&#xff0c;外观 boundary n限度&#xff0c;界限&#xff0c;分界线&#xff0c;边界 cap n最高限额&#x…

护网蓝初面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

玄机-apache日志分析

靶场任务 1、提交当天访问次数最多的IP&#xff0c;即黑客IP&#xff1a; 查看apache日志 apache访问日志的位置是&#xff1a;/var/log/apache2/access.log.1 匹配正则算法 首先先cat看看 发现地址都在第一行&#xff0c;直接匹配计算输出 cat access.log.1 |grep -Eo &…

C++ I/O 流通俗指南

1. std::ostream 是什么&#xff1f; 定义&#xff1a;std::ostream 是 C 标准库中的输出流类&#xff0c;负责将数据输出到各种目标&#xff08;如屏幕、文件、网络等&#xff09;。你可以把 std::ostream 想象成一根“数据水管”&#xff1a; 数据从 C 代码流进 std::ostrea…

Systemd 使用教程(二):Unit 的概念

目录 【二】 Systemd 单元&#xff08;Unit&#xff09;的概念 本教程将由浅入深的介绍 linux 中 Systemd 的知识和相关使用&#xff08;同时也方便自己后续查阅&#xff09; 【二】 Systemd 单元&#xff08;Unit&#xff09;的概念 虽然我想介绍的比较偏实际操作&#xff0…

树莓派PICO 设备烧录成cmsis dap

文章目录 1. 实际操作2. IO连接 1. 实际操作 2. IO连接

IntelliJ IDEA中Spring Boot 3.4.x+集成Redis 7.x:最新配置与实战指南

‌前言 Spring Boot 3.4.x作为当前‌最新稳定版本‌&#xff0c;全面支持Java 17与Jakarta EE 10规范。本文以‌Spring Boot 3.4.1‌和‌Redis 7.x‌为例&#xff0c;详解如何在IDEA中快速接入Redis&#xff0c;涵盖‌最新依赖配置‌、‌数据序列化优化‌、‌缓存注解‌及‌高…

VectorBT:使用PyTorch+Transformer训练和回测股票模型 进阶五

VectorBT&#xff1a;使用PyTorchTransformer训练和回测股票模型 进阶五 本方案基于PyTorch框架与Transformer模型&#xff0c;结合VectorBT回测引擎构建多股票量化交易系统&#xff0c;采用滑动窗口技术构建时序特征&#xff0c;通过自注意力机制捕捉市场规律预测收益率&#…

4.3-4.6学习总结 Java:Set系列集合+双列集合+Map

Set系列集合&#xff1a; 元素是唯一的。 HashSet&#xff1a; 哈希值&#xff1a; 如果没有重写hashcode方法和equals方法&#xff0c;那么哈希值是根据地址值计算的。 LinkedHashSet&#xff1a; TreeSet底层为红黑树。 红黑树&#xff1a;两个红色节点不能相连。 双列集合&…

unreal engine5开发仿鬼泣5的游戏,把敌人击飞到空中4连击

UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、具体蓝图 前言 unreal engine5开发仿鬼泣5的游戏&#xff0c;把敌人击飞到空中4连击&#xff0c;先看下效果 一、实现思路 unreal engine5开发仿鬼泣5的游戏&#xff0c;把敌人击飞到空中4连击 在Unreal Engi…

功耗日志抓取需求

最近罗列了一些功耗分析需要的常见日志&#xff1a; 测试功耗前&#xff1a; adb shell dumpsys batterystats --reset adb shell dumpsys batterystats --enable full-wake-history 测试功耗后&#xff0c;使用脚本导出如下功耗日志&#xff1a; 脚本 chmod x collect_logs.s…