【javaWeb 第七篇】后端-Spring

news2024/11/28 18:56:36

Spring

  • Spring
  • springBoot
  • 请求
    • 简单参数
    • 实体参数
    • 数组集合参数
    • 日期参数
    • JSON参数
    • 路径参数
  • 响应数据
  • 分层解耦
    • 三层架构
    • 解耦操作
    • Bean的声明
    • Bean组件扫描问题
    • DI详解

Spring

详细介绍结合官网查看:https://spring.io/why-spring
Spring发展到今天已经形成一种开发生态圈,spring提供了若干子项目,每个项目用于完成特定的功能
在这里插入图片描述
现在大多数技术大多是用spring全家桶来进行开发并整合,最底层的是spring framework(是一个基础的底层框架)
但是spring Framework配置繁琐,入门难度大,推出的springBoot可以快速的开发一个应用程序更加便捷(简化配置)

springBoot

springBoot 可以帮助我们非常快速的构建应用程序,简化开发,提高效率

首先创建一个springBoot工程,勾选web开发相关依赖

选择spring initiallizr构建spring工程
勾选web开发的依赖
在这里插入图片描述
创建完毕之后,打开pom.xml文件
在这里插入图片描述
该标签表示当前SpringBoot工程的父工程的坐标,所有的spring工程都需要继承该工程

 <groupId>com.example</groupId>
    <artifactId>heima</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>heima</name>
    <description>heima</description>
    <properties>
        <java.version>17</java.version>

描述的是项目工程的坐标信息以及一些描述信息,以及jdk的使用版本

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

该工程中添加的依赖,包括web开发依赖以及测试依赖

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

还定义了一个springboot的maven项目构建插件
SpringBoot工程自定义创建了一个工程启动类

@SpringBootApplication
public class projectApplication {

    public static void main(String[] args) {
        SpringApplication.run(projectApplication.class, args);
    }

}

用于启动spring工程
创建一个请求处理类,输出hello-world

//需要通过注解表示这是一个请求处理类,加上注解之后表示当前是一个请求处理类
@RestController
public class HelloController {
    //通过注解表示需要处理的请求路径
    @RequestMapping("/hello")  //表示当进行请求的时候会调用以下方法
    public String Hello(){
        System.out.println("Hello-world");
        return "Hello-world";
    }
}

编辑好之后进行运行工程,控制台中显示日志:
在这里插入图片描述
上边的图像表示spring的标志,下边是它的版本
在这里插入图片描述
里面显示当程序运行起来之后会自动占用一个端口:8080
所以要访问当前程序,需要访问端口号8080

起步依赖:

  • Spring-boot-starter-web:包含了web应用开发所需要的常见依赖
  • spring-boot-starter-test:包含了单元测试所需要的常见依赖

在配置好web起步依赖后,其中就包括tomcat的依赖,相当于在tomcat中内置了tomcat服务器,在一般的开发当中通常用的都是内置的tomcat服务器

上述编写的请求处理类是一个简单的java类不能被tomcat识别,tomcat可以识别servlet程序,springboot中提供了一个底层核心的dispatcherServlet

Tomcat并不直接识别Spring类,而是通过整合Spring框架来实现对Spring类的调用和管理。这种整合使得在基于Spring框架的Web应用中,Tomcat能够识别和调用被Spring框架管理的类和方法。
dispatcherServlet的继承体系:
在这里插入图片描述
工作流程:
在这里插入图片描述
tomcat服务器对请求信息进行解析,并将所有解析后的请求信息封装到httpSerletRequest对象当中,服务器中的应用程序在该对象当中获取请求数据进行处理,然后在对象httpserletResponse中设置响应的数据,Tomcat根据该对象中的信息响应数据给浏览信息
请求对象:(httpSerletRequest)获取请求数据
响应对象:(httpserletResponse)设置响应数据
上述工作流程称为BS架构:Browser/Server,浏览器/服务器架构模式,客户端只需浏览器,应用程序的逻辑和数据都存储在服务端
除此之外还有CS架构:client/Server,客户端/服务器架构模式(软件的开发,维护繁琐,用户体验感强)

请求

在前后端分离体系下,后端的开发独立,当每次编写完一个功能模块时,需要对该功能进行测试,但是此时前端界面没有
注意:地址栏直接搜索地址发送的请求都是get请求
这是需要借助接口测试工具postman(一款网页调试与发送网页HTTP请求的Chrome插件)常用于进行接口测试,具体情况可以参考第七篇附篇

创建测试地址:http://localhost:8080/hello

  • 获取地址参数

获取地址栏后方的参数

简单参数

在原始的web程序中,获取get请求参数,需要通过HttpServletRequest对象手动获取,该对象中拥有所有的请求数据

@RestController
public class HelloController {
    //通过注解表示需要处理的请求路径
    @RequestMapping("/hello")  //表示当进行请求的时候会调用以下方法
    public String Hello(HttpServletRequest request){
        //获取请求参数
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        int ageint = Integer.parseInt(age);
        System.out.println(name+":"+ageint);
        return "OK";
    }
}

运行工程,在postman中创建测试得出结果:
在这里插入图片描述
在SpringBoot中有更加简便的方法用来简化操作:

@RestController
public class HelloController {
    //通过注解表示需要处理的请求路径
    @RequestMapping("/hello")  //表示当进行请求的时候会调用以下方法
    public String Hello(String name,Integer age){
        //获取请求参数
        System.out.println(name+":"+age);
        return "OK";
    }
}

只需要在参数中添加对应的形参,形参类型与传递参数一致,形参名称也要与传递参数名称一致,会自动转化类型
post请求参数获取方式与上述的springBoot参数获取方式相同

当参数名称不相同的时候会显示为null,如果方法形参名称与请求参数名称不相符,可以使用 @RequestParam完成映射

@RestController
public class HelloController {
    //通过注解表示需要处理的请求路径
    @RequestMapping("/hello")  //表示当进行请求的时候会调用以下方法
    public String Hello(@RequestParam(name = "name") String username, Integer age){
        //获取请求参数
        System.out.println(username+":"+age);
        return "OK";
    }
}

其中“name”表示请求参数中的名称,将该名称映射到username
注意:@RequestParam中的required属性默认为true,代表请求参数必须传递,如果不传递将会报错,如果要不传递该参数可以将required的值设置为false

public String Hello(@RequestParam(name = "name",required = false) String username, Integer age)

实体参数

当请求参数的数量较多时,简单参数已经不合时宜了,我们可以将参数封装到一个实体类当中
原则:实体类的属性名必须与请求的参数名称一样

    @RequestMapping("/dara")
    public String dara(User user){
        System.out.println(user);
        return "OK";
    }

当请求参数与实体类属性名称不相符的时候,会显示null
当出现复杂类的情况时:

public class user{
private String name;
private Student student;
}
public class Student{
private Integer age;
private String mingcheng;
}

请求参数应该为:http://localhost:8080/dara?name=han&student.age=22&student.minghceng=han

数组集合参数

如果时form表单中的数据传递请求参数就会出现同样名称多个值的情况,这个时候使用数组集合参数来获取请求参数

  • 使用数组

请求地址:http://localhost:8080/nihao?hobby=han&hobby=2

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

数组名称需要与请求参数的名称一致

  • 使用集合

请求地址:http://localhost:8080/buhao?hobby=han&hobby=2

    @RequestMapping("/buhao")
    public String buhao(List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }

同样集合名称需要与请求参数名称一致

日期参数

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

请求地址:http://localhost:8080/hello?updatetime=2024-12-12 12:12:12

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

JSON参数

JSON参数:json数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要用 @RequestBody标识
请求应该设置成post形式,json数据必须放在请求体当中
在这里插入图片描述
在服务器端通过实体对象的形式来接受json数据,实体对象的属性名必须与json的数据键名称一致

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

路径参数

通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用 @PathVariable获取路径参数
通俗来讲就是请求的参数是路径的一部分
例如:http://localhost:8080/path/1

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

路径是可变的,使用@PathVariable注解表示将路径中的id赋值给id
两个路径参数:

    @RequestMapping("/path/{id}/{name}")
    public String pathParam1(@PathVariable Integer id,@PathVariable String name){
        System.out.println(id);
        System.out.println(name);
        return "OK";
    }

其中的每一个方法都是一个功能接口

响应数据

@ResponseBody注解响应数据
类型:方法注解,类注解
位置:Controller方法上/类上
作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为json数据
说明:@RestController= @controller+@ResponseBody

可以通过统一的响应结果,做到通用便捷

public class Result{
//响应码,1代表成功,0表示失败
private Integer code;
//提示信息
private String msg;
//返回的数据
private Object data;
}

每一个方法都返回一个统一的result类方便管理
Result(code,msg,data)

加载并解析emp.xml文件中的数据,完成数据处理,并在页面展示
在pom.xml文件中引入dom4j的依赖,用于解析xml文件
SpringBoot项目的静态资源(html,css,js等前端资源)默认存放的目录为:classpath:/static,classpath:/public,classpath:/resources

分层解耦

三层架构

在之前写的controller类中,请求解析,逻辑处理,接受请求响应数据在同一个类中,不利于拓展和维护,所以在Web开发中推出了三层架构
Controller:控制层,接受前端发送的请求,对请求进行处理,并相应数据
service:业务逻辑层,处理具体的业务逻辑
dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增删改查
处理流程
前端浏览器首先访问controller,controller在调用业务层进行处理,业务层首先调用数据获取数据再进行业务处理,处理结束返回数据到controller再进行数据响应
优点:复用性强,便于维护,利于拓展

解耦操作

内聚:软件中各个功能模块内部的功能关系
耦合:衡量软件中各个层次/模块之间的依赖,关联的程度
如何理解内聚:

假如在处理类中有有一个处理数据的类,处理数据的方法只存在于这个类之中,说明这个类的内聚程度越高

如何理解耦合:

Controller层调用service层处理数据就会创建service层对象进行逻辑处理,这样就相当于你中有我,我中有你

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

那么如何才能做到高内聚低耦合呢?
如果在类之间不必直接创建对象,而是通过一个容器将对象都保存进去,让其他类随取所用,这样就不会被其他的对象所牵制,而如何实现将对象放入容器,以及从容器中取出对象呢? 就要用到控制反转以及依赖注入

  • 控制反转与依赖注入
    控制反转:简称IOC,对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转(这是Spring框架的第一大核心)
    依赖注入:简称DI,容器为应用程序提供运行时,所依赖的资源,称之为依赖注入
    Bean对象:IOC容器中创建,管理的对象,称之为Bean
  • IOC&DI入门
  1. Service层及Dao层的实现类,交给IOC容器管理
  2. 为Controller及Service注入运行时依赖的对象

实现控制反转就是对Service与Controller进行控制权的转移,在Service类以及Controller类上添加注解 @Component 就能够实现控制权限的反转

依赖注入的实现在声明对象的上方通过注解 @Autowired 就实现了依赖注入

Bean的声明

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:
控制反转注解
常见的三层框架都在使用下面三个注解,一般如果出现不属于三个的类时,如果需要控制反转,需要使用 @Component 注解

如何查看bean对象:
Bean
运行之后进行Bean对象的查看,如果没有在注解之后加入Bean对象的名字,则默认将类名进行小写当作Bean对象的名字
如何命名:
在注解后添加名称参数: @Repository(“nihao”)

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

Bean组件扫描问题

前面声明bean的四大注解,要想生效,还需被组件扫描注解@ComponentScan扫描

@ComponentScan注解虽然没有显示配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在的包及其子包

如果出现上述问题需要手动进行扫描:@ComponentScan({“包名”,“包名”})

DI详解

在Bean注入中:
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的Bean,将会报出如下错误:
在这里插入图片描述
通过几个注解来解决问题:

  • @Primary
    设置相同Bean的优先级,如果想让那个类的Bean级别更高,在前方加入@Primary注解
  • @Qualifier(“Bean名称”)
    通过该注解直接进行设置Bean的对应对象,写在@Autowired后面
  • @Resourse(name=“”)
    取消@Autowired注解采用Resourse注解进行注解,不以类型进行按照名称继续注入,name直接写入Bean的名字

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

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

相关文章

KNIME 国际化支持投票

你的投票也许能让 KNIME 中文化快一点点。 i18n 是个很搞笑的单词&#xff0c;它是英文 internationalization 国际化的缩写。18 指的是首字母i和末字母n中间有18个字母。另外还有什么 K8s 也是一样&#xff0c;中间省去了8个字母 ... 真是懒的可以。指北君还想起一个类似的笑话…

微信小程序全局配置

全局配置文件及常用的配置项 小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下&#xff1a; ① pages 记录当前小程序所有页面的存放路径 ② window 全局设置小程序窗口的外观 ③ tabBar 设置小程序底部的 tabBar 效果 ④ style 是否启用新版的组件样…

vue3+ts中判断输入的值是不是经纬度格式

vue3ts中判断输入的值是不是经纬度格式 vue代码&#xff1a; <template #bdjhwz"{ record }"><a-row :gutter"8" v-show"!record.editable"><a-col :span"12"><a-input placeholder"经度" v-model:v…

CookieSession

目录 什么是会话 一.Cookie 1.Cookie介绍 2.Cookie的作用 3.Cookie的基本使用 4.Cookie生命周期 5.Cookie有效路径 6.注意事项 二.Session 1.Session基本原理 2 Session的作用 3.Session的基本使用 4.Session底层实现机制 5.Session生命周期 什么是会话 Cookie和S…

C++从入门到精通——类的6个默认成员函数之赋值运算符重载

赋值运算符重载 前言一、运算符重载定义实例注意要点 二、赋值运算符重载赋值运算符重载格式赋值运算符重载要点重载要点传值返回和传址返回要点 三、前置和后置重载 前言 类的6个默认成员函数&#xff1a;如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么…

Cloudflare Workers 付费文档

定价 默认情况下&#xff0c;用户可以访问Workers免费计划。Workers免费计划包括对Workers、Pages Functions和Workers KV的有限使用。了解更多关于免费计划限制的信息。 Workers付费计划包括Workers、Pages Functions、Workers KV和Durable Objects的使用&#xff0c;每个账…

移植speexdsp到OpenHarmony标准系统②

在linux上生成speexdsp的so动态链接库和.a静态链接库 make和make install后会生成speexdsp的.so动态链接库和.a静态链接库 make make install其中build/lib目录下&#xff1a; ├── libspeexdsp.a /*静态库*/ ├── libspeexdsp.la …

基于Springboot+Vue的Java项目-免税商品优选购物商城系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

MySQL 列数据跨表拷贝,一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段(A、B表通过ID对应)

文章目录 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段&#xff08;A、B表通过ID对应&#xff09;背景定义表填充测试数据跨表一 一对应拷贝列数据SQL参考资料 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条记录的…

创建影子用户

文章目录 1.认识影子用户2.创建隐藏账户并加入管理员组3.修改注册表3.删除用户4.添加管理员权限 1.认识影子用户 影子用户通常指的是那些在系统用户列表中不可见&#xff0c;但在某些情况下可以进行操作的用户。在内网渗透过程中&#xff0c;当我们拿到shell时&#xff0c;肯定…

某小学AK,SK泄露导致横向到云主机控制台

目录 前言 免责声明 分享声明 个人介绍 某小学AK&#xff0c;SK泄露导致横向到云主机控制台 一、 资产证明 资产证明(1) 资产证明(2) 二、漏洞利用过程 三、漏洞危害 四、修复建议 五、预防措施 前言 免责声明 以下漏洞均已经上报漏洞平台。请勿利用文章内的相关…

Android Jetpack学习系列——Room

关于Room&#xff1a; Room是Android Jetpack组件之一&#xff0c;旨在为Android应用程序提供一种简单、强大且易于使用的本地数据库访问解决方案。 关键特性&#xff1a; 1.基于SQLite封装&#xff1a;Room是基于SQLite数据库引擎构建的&#xff0c;提供了面向对象的API来与…

拉普拉斯金字塔的频谱分析

1. 基本分析 拉普拉斯金字塔分解&#xff0c;主要由以下步骤组成&#xff1a; 对输入图像 L0 进行低通滤波&#xff0c;其中常采用高斯滤波&#xff1b;对低通滤波后的图像进行 1/2 倍率的下采样&#xff0c;这里的下采样通常是指直接取偶行且偶列&#xff08;以 0 开始计&am…

Linux安装部署Tomcat

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Linux安装部署Tomcat //将tomcat压缩包解压到对…

【计算机网络】常用编码方式+例题(曼彻斯特编码、差分曼彻斯特编码...)

常用编码方式例题 常用编码方式练习画出四种编码20221题342015题342013题34 常用编码方式 练习 画出四种编码 20221题34 这个题目的考察是差分曼彻斯特编码。 差分曼彻斯特编码在每个码元的中间时刻电平都会发生跳变。与曼彻斯特编码不同的是&#xff1a;电平的跳变仅代表时钟…

4G/5G布控球/移动执法仪/智能单兵电力巡检远程视频智能监控方案

一、背景与需求 随着科技的不断进步&#xff0c;视频监控技术已成为电力行业不可或缺的一环。电力行业的巡检及建设工作&#xff0c;因施工现场在人迹罕见的野外或山区&#xff0c;地形复杂多变&#xff0c;安全更是重中之重&#xff0c;现场工作的视频图像需实时传回监管中心…

SpringCloud、SpringBoot、JDK版本对应关系

SpringCloud与SpringBoot 版本 官网说明&#xff1a;https://spring.io/projects/spring-cloud#overview SpringBoot 与 JDK版本关系 发布说明&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes SpringBoot 3.x不再支持JDK1.…

[leetcode] 54. 螺旋矩阵

文章目录 题目描述解题方法模拟java代码复杂度分析 相似题目 题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;…

每日两题 / 15. 三数之和 73. 矩阵置零(LeetCode热题100)

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 先确定一个数t&#xff0c;对于剩下的两个数&#xff0c;要求两数之和为t的负数 三数之和就退化成了两数之和&#xff0c;两数之和可以用双指针 先排序&#xff0c;左右两个指针&#xff0c;指向的数之和大于目标值&…

PCB裸板如何测试?当然是这些....

在印刷电路板制造中&#xff0c;可能会遇见裸板测试&#xff08;主要用于监测PCB在生产过程中可能出现的缺陷&#xff0c;如开路、短路、错位等&#xff0c;以此确保后续装配和使用的顺利进行&#xff09;。本文将介绍几种常用的PCB裸板测试方案&#xff0c;希望对小伙伴们有所…