SpringBoot简单入门

news2024/11/17 23:52:57

在这里插入图片描述
                       星光下的赶路人star的个人主页

                      充满希望的旅途,胜过终点的到达

文章目录

  • 1、Spring简介
    • 2、SpringBoot简介
  • 3、SpringBoot下的配置文件
  • 4、HelloWorld
    • 4.1 工程搭建
    • 4.2 编写访问页面
    • 4.3 编写后台程序处理请求
    • 4.4 测试
  • 5、Web基础常识
    • 5.1 Web请求三要素
    • 5.2 常见的html标签
    • 5.3 请求方式
  • 6 、接受参数
    • 6.1 接受普通请求参数
    • 6.2 接受Json格式的请求参数
    • 6.3 接受路径参数
  • 7、 返回数据
  • 8 、限定请求方式
  • 9、 常见错误状态码
  • 10 、容器使用
    • 10.1 在容器中初始化对象
    • 10.2 从容器中获取指定类型的对象
    • 10.3 读取配置注入属性
  • 11 、定时调度
    • 11.1 如何启用
    • 11.2 如何配置

1、Spring简介

Spring是JavaEE开发中最常用的基础框架,它基于IOC(inverse of control)理念和容器思想,让javaEE开发更简洁。开发人员只需要专注于自己的业务逻辑,而其他的底层基础设施则由Spring进行管理,在程序需要的地方进行自动注入。
Spring让开发更加简洁,代码的可读性和可维护性更强,更加优雅。
不使用Spring开发:
在这里插入图片描述
使用Spring开发:
在这里插入图片描述

在这里插入图片描述

2、SpringBoot简介

SpringBoot的作用是为了在使用Spring的应用进行开发的时候,简化配置。并且以最简单的方式来整合第三方应用,例如Redis,MyBatis,SpringBoot。
SpringBoot顺应了可插拔的插件式开发思想,需要集成什么框架,只需要引入此框架提供的SpringBoot-starter即可。
在这里插入图片描述

3、SpringBoot下的配置文件

SpringBoot环境下常用的配置文件有两种,一种是properties属性文件,一种是yml文件。二者仅仅是语法不通,但是最终效果一致。yml适合配置多嵌套层级关系的属性,而properties则更为直观。如果两个配置文件中有同名的属性,那么是以properties为准的。

4、HelloWorld

4.1 工程搭建

在project上选择new—>module
在这里插入图片描述
选择SpringBoot主版本和项目需要的组件,其中SpringWeb组件是开发一个web项目必须选择的模块。
由于SpringBoot3.x强制要求JDK17,因此如果你的jdk是8的话一定要选择2.x的系列
在这里插入图片描述

创建后的结构如下图:

在这里插入图片描述
注意:像.mvn、HELP.md、mvnw、mvnw,cmd这种用不着的可以直接删掉

4.2 编写访问页面

在static目录下创建index.html,向其中添加如下内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
        <a href="hello">发送hello请求</a>
</body>
</html>

添加处理成功的页面success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎</title>
</head>
<body>
    <h1>碰到好的欢喜的东西,总是要留得一份清淡余地,才会有中正的缘分</h1>
</body>
</html>

4.3 编写后台程序处理请求

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController
{
    /*
        主机名和端口号是不写的!
     */
    @RequestMapping(value = "/hello")
    public String hello(){
        System.out.println("欢迎最帅||最美的你来看我的博客");
        return "/success.html";
    }
}

4.4 测试

启动程序后,打开浏览器访问localhost:8080,点击连接发送请求,效果如下:
在这里插入图片描述
在这里插入图片描述

5、Web基础常识

在这里插入图片描述

5.1 Web请求三要素

术语解释类比生活
Request客户端发起的一个请求想求人办事
Request Url请求路径找到求助目标
Request Method请求方式求人的方式
Request Param请求参数携带的东西

示例: http://localhost:8080/getRequest?name=jack&age=20
解释:
http:// 是使用的协议
localhost:8080:指的是当前的url要发送的主机名和端口,其中localhost会被域名解析为真实的ip地址。
getRequest:代表请求的路径名。
name=jack&age=20 :代表此次请求携带了两个参数。其中参数的格式为k=v格式,多个参数之间用&进行间隔。参数和url路径之间会使用?进行间隔。

5.2 常见的html标签

标签属性作用
a超链接标签,点击后可以发送url请求
href发送请求的url路径
form表单标签,类似生活中填写的表格单据
action表单提交的url
method请求方式
input嵌套在form中,代表一个输入框
name参数名
value参数值
type输入框类型,默认是text,即文本输入框。submit为提交按钮,radio为单选按钮
br换行

5.3 请求方式

在Http协议中,一共定义了9种请求方式,但是常用的GET和POST。
GET请求方式在发送请求时,会把参数附加在url后面。例如:
http://localhost:8080/hello?name=jack&age=20

POST请求方式在发送请求时,会把参数附加在请求体中,例如:
http://localhost:8080/hello
请求体:
name=jack
age=20

浏览器的地址栏和标签只能发送GET请求,POST请求的请求体可以在浏览器的F12选项中查看。

6 、接受参数

6.1 接受普通请求参数

方式一:前端发送的请求参数为name=value格式,在后端处理时,只需要在处理方法的参数列表中声明和请求参数名name一样的参数名,就可以收到。
方式二:如果前端发送的请求参数过多,也可以在处理方法的参数位置声明一个Bean来接受。其中和Bean的属性同名的参数会直接赋值给Bean的属性。

6.2 接受Json格式的请求参数

前端发送的请求参数如果为json格式,那么就可以在请求方法的参数位置声明Map或Bean类型接受,在Bean或Map前面标注#RequestBody注解,可以直接将json中的属性解析后赋值给Map或Bean。
在这里插入图片描述

@PostMapping(value = "/testJson" )
 public Object handle5(@RequestBody Employee employee){

        System.out.println(employee);

        return "success";

 }

6.3 接受路径参数

如果希望接受某一层路径上的变量,可以在@RequestMapping中使用{xxx}进行占位,之后使用@PathVariable注解修饰方法的形参来接受路径参数

/*
        url格式:  /emp/1/a
*/
@ResponseBody
@RequestMapping(value = "/emp/{haha}/a")
public Object handle6(@PathVariable("haha") Integer id){
 //1
 System.out.println(id);
 return "ok";
}

7、 返回数据

在处理请求的方法上标注@RequestBody注解,可以把处理方法的返回值作为响应体返回给前端。
如果返回值是字面量,则直接返回。如果返回值是非字面量,则将返回值转换为json后再返回。

	@ResponseBody
    @RequestMapping(value = "/getData1")
    public Object handle2(){

        System.out.println("处理了getData1请求,即将返回字面量");

        return "success";

    }

    @ResponseBody
    @RequestMapping(value = "/getData2")
    public Object handle3(){

        System.out.println("处理了getData2请求,即将返回非字面量");

        Employee employee = new Employee(1, "Tom", "male", "abc");

        return employee;

    }

如果一个Controller中的方法都是返回数据的,而不是返回页面的,那么就可以直接在控制器类上使用@RestController注解,该注解已经具有@Controller注解的功能,还可以为当前控制器的所有方法都默认添加@ResponseBody注解

8 、限定请求方式

使用@PostMapping会限定只处理指定url发生的post方式的请求。
使用@GettingMapping会限定只处理指定url发送的get方式的请求。
如果请求的方式错误,此时客户端会报错405。

9、 常见错误状态码

状态码含义
1xx请求正在进行
2xx响应成功
3xx请求重定向
4xx客户端错误。404:请求的资源不存在、405:请求方式错误、400:请求参数不符合要求、403:访问被禁止
5xx服务器端错误
6xx自定义状态码

10 、容器使用

10.1 在容器中初始化对象

如果希望容器在启动时,自动创建指定类型的对象,可以在当前类上标注@Component注解。此时容器启动后,会自动创建一个指定类型的单例对象。

@Data
@AllArgsConstructor
@Component
public class Dog
{
    private String name = "旺财";
    private Integer age = 5;

    public Dog(){
        System.err.println(name +"被创建了");
    }
}

如果没有要创建类对象的源码,可以在@Configuration标注的类中,使用@Bean标注的方法,将方法的返回值自动放入容器中。例如以下案例将在容器启动时,向容器中自动创建一个指定日期的LocalDate对象。

@Configuration
public class MyConfig
{
    @Bean
    public LocalDate getTs(){
        return LocalDate.parse("2023-05-10");
    }
}

10.2 从容器中获取指定类型的对象

方式一:使用自动注入的方式获取指定类型的对象
可以在指定类型的属性上标注注解@AutoWired,此时将从容器中获取指定类型的对象,复制给变量。

@SpringBootTest
class SpringbootdemoApplicationTests
{

    @Autowired
    Dog dog;
    @Autowired
    LocalDate date;
    @Test
    void contextLoads() {
        System.out.println(dog);
        System.out.println(date);
    }
}

如果容器中有两个同一类型的对象,例如:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
public class TuDog extends Dog
{
    private String name = "TuDog";
    
}
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class YangDog extends Dog
{
    private String name = "YangDog";
}

此时再使用@AutoWired注入时候,容器中会检测到两个相同类型的Dog,产生歧义。
在这里插入图片描述
此时可以在@Component注解上,为每个Bean配置id。例如:

@Component("yangDog")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class YangDog extends Dog
{
    private String name = "YangDog";
}

之后,可以使用@Qualifier注解指定要注入的指定id的Bean

@Autowired
@Qualifier("yangDog")
Dog dog;

方式二:获取容器对象手动获取

@SpringBootTest
class SpringbootdemoApplicationTests
{

    @Autowired
    ApplicationContext context;
    @Test
    void contextLoads() {

        LocalDate localDate = context.getBean(LocalDate.class);
        System.out.println(localDate);
        Dog dog = context.getBean("yangDog", Dog.class);
        System.out.println(dog);

    }

}

以上方式首先获取了容器对象,之后调用容器的getBean()主动获取容器中指定类型或指定类型和id的对象。

10.3 读取配置注入属性

在配置文件中定义的属性,可以通过@Value注解读取,它会在容器启动的时候,自动注入相关参数的值到指定的属性中,例如:

@Value("${hive.metastore.uris}")
public String metastoreUri;

metastoreUri属性将在容器启动时,自动读取配置文件中名为hive.metastore.uris的属性值。

11 、定时调度

springTask是SpringBoot框架中自带的时间调度程序。
优点:简单易用配置少
缺点:不能做分布式调度

11.1 如何启用

在SpringBoot启动程序上增加注解@EnableScheduling

@SpringBootApplication
@EnableScheduling
public class SpringbootdemoApplication

建立一个任务类,类上面增加@Component,在方法上增加表达式

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class TestTask {

    @Scheduled(cron = "0/10 * * * * *")
    public void text1(){
        System.out.println("text1 测试"+System.currentTimeMillis());
    }
}

11.2 如何配置

@Scheduled可用的参数

  • cron 表达式 表示" 秒 分 时 天 月 星期几"
  • fixeDelay标识每次触发的固定间隔毫秒数,注意间隔为是前一次的结束时间到后一次的开始时间点的间隔。
  • fixeRate标识每次触发的固定间隔毫秒数,注意间隔为是前一次的开始时间到后一次的开始时间点的间隔。如果后一次开始时前一次的任务还没做完,则后一次的处理会被阻塞,直到前一任务完成。
  • initialDelay标识每次启动时初始的延迟,可以配合fixedDelay或者fixedRate使用
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class DemoTask {

    @Scheduled(cron = "0/10 * * * * *")
    public void text1(){
        System.out.println("text1 测试"+DateFormatUtils.format(new Date(),"mm:ss"));
    }

    @Scheduled(fixedDelay = 5000)
    public void text2(){
        System.out.println("text2 测试"+ DateFormatUtils.format(new Date(),"mm:ss"));
    }
    @Scheduled(fixedRate = 5000)
    public void text3(){
        System.out.println("text3 测试"+DateFormatUtils.format(new Date(),"mm:ss"));
    }
    @Scheduled(initialDelay =3000,  fixedRate = 5000)
    public void text4(){
        System.out.println("text4 测试"+DateFormatUtils.format(new Date(),"mm:ss"));
    }
}

在这里插入图片描述
                      您的支持是我创作的无限动力

在这里插入图片描述
                      希望我能为您的未来尽绵薄之力

在这里插入图片描述
                      如有错误,谢谢指正;若有收获,谢谢赞美

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

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

相关文章

IDEA常用插件之代码规范检查

Alibaba Java Coding Guidelines 安装 使用 手动扫描 这里扫描可以扫描某一个类、某一个包、整个项目都支持 扫描结果 实时扫描 开启实时扫描在代码编写过程中也会实时提醒

蓝牙耳机语音信号处理之ENC算法

+他V hezkz17进数字音频系统研究开发交流答疑群(课题组) 1 什么是单麦谱减法降噪? 单麦谱减法降噪是一种音频信号处理技术,用于在单声道录音中减少噪音的方法。它基于频域分析和减法混叠原理。首先,通过将音频信号转换为频域表示(如快速傅立叶变换),可以将音频信号分解…

基于微信小程序+Springboot校园二手商城系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、目前专注于大学生项目实战开发,讲解,毕业答疑辅导✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3…

C#_委托详解

委托是什么&#xff1f; 字面理解&#xff1a;例如A要建一栋别墅&#xff0c;找到B建筑施工队&#xff0c;请B来建筑别墅。 委托类型规定方法的签名&#xff08;方法类型&#xff09;&#xff1a;返回值类型、参数类型、个数、顺序。 委托变量可以用来存储方法的引用&#x…

Pytorch06-复杂模型构建

https://github.com/ExpressGit/Pytorch_Study_Demo 1、PyTorch 复杂模型构建 1、模型截图2、模型部件实现3、模型组装 2、模型定义 2.1、Sequential 1、当模型的前向计算为简单串联各个层的计算时&#xff0c; Sequential 类可以通过更加简单的方式定义模型。2、可以接收…

win10搭建testNG测试环境详解

一、安装jdk-8u191-windows-x64.exe 新建系统环境变量JAVA_HOME并配置Java搜索路径位置 二、安装IntelliJ IDEA 三、用New Project按钮创建工程&#xff08;TestNG_Example) 四、安装TestNG和Create TestNG XML插件 五、如图创建一个Java类HelloWorld import org.testng.…

林业气象站——林业种植气象观测

林业气象站是一种用于观测林区气象环境的仪器&#xff0c;能够观测林区天气、土壤等自然环境参数&#xff08;温度、湿度、风速、风向、降雨量、气压、放射线、土壤湿度等&#xff09;&#xff0c;为开展环境观测、天气预报、灾害预警、林区虫害防治起到综合指导作用。 林业气…

第四章 Restful-CRUD

1.默认首页 访问项目时如何去访问Templates中的index.html文件&#xff1f; 默认的是去静态资源文件夹下&#xff0c;加载index.html页面&#xff0c;那么需要在创建一个方法借助Thymeleaf去跳转到我们Templates文件夹下的index.html页面。 RequestMapping({"/&q…

开源跨境电商ERP中的7个重要功能点分析

作为开源跨境电商ERP领域的专家&#xff0c;我将为你详细分析关键的功能点&#xff0c;帮助你理解和应用开源跨境电商ERP系统&#xff0c;为你的业务带来突破性的变革。无论你是个体创业者、中小企业主&#xff0c;还是跨国电商巨头&#xff0c;这些功能点将为你的业务流程优化…

十八、深度学习模型30年演化史

1、模型分类 深度学习是解决问题的一系列模型与方法,但深度学习模型不是深度学习领域中唯一的研究方向,且不一定是最重要的研究方向。除了模型之外,比较重要的还有优化算法、损失函数、采样方法等。 1.1 DNN 深度神经网络(Deep Neural Networks, 以下简称DNN)是…

K8s中的Namespace是什么?

如何理解Namespace默认的Namespace使用Namespace的好处创建和使用Namespace使用命令行创建使用YAML文件创建Namespace 用例切换Namespace删除Namespace 感谢 &#x1f496; hello大家好&#x1f60a; 由于能够无缝管理和扩展工作负载&#xff0c;Kubernetes &#xff08;简称K8…

KUKA机器人零点标定的具体方法

KUKA机器人零点标定的具体方法 在进行机器人校正时,先将各轴置于一个定义好的机械位置,即所谓的机械零点。这个机械零点位置表明了同轴的驱动角度之间的对应关系,它用一个测量刻槽表示。 为了精确地确定机器人某根轴的机械零点位置,一般应先找到其预校正位置,然后去掉测量…

C++day3(类、this指针、类中的特殊成员函数)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.类的应用实例 #include <iostream> using namespace std;class Person { private:string name; public:int age;int high;void set_name(string n); //在类内声明函数void show(){cout << "na…

Docker搭建并配置Prometheus

首先确保Linux已安装Docker&#xff0c;如未安装请先参考&#xff1a;Linux安装Docker 1.安装准备 创建挂载目录 /opt/prometheus/data目录&#xff0c;准备用来挂载放置prometheus的数据 /opt/prometheus/config目录&#xff0c;准备用来放置prometheus的配置文件 /opt/pro…

SQL中ON筛选和Where筛选的区别

转载&#xff1a;sql连接查询中on筛选与where筛选的区别https://zhuanlan.zhihu.com/p/26420938 结论:on后面接上连接条件&#xff0c;where后面接上过滤条件

【golang】go语句执行规则(goroutine)(上)

Don’t communicate by sharing memory;share memory by communicating. 从Go语言编程的角度解释&#xff0c;这句话的意思就是&#xff1a;不要通过共享数据来通讯&#xff0c;恰恰相反&#xff0c;要以通讯的方式共享数据。 进程和线程 进程&#xff0c;描述的就是程序的执…

如何使用CSS实现一个无限循环滚动的图片轮播效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐HTML 结构⭐ CSS 样式⭐ JavaScript 控制⭐ 注意事项&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff0…

ModaHub魔搭社区:AI Agent在数字卡牌游戏场景下的AgentBench基准测试

近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现,顶级商业LLM在复杂环境中表现出…

IO多路转接 ——— select、poll、epoll

select初识 select是系统提供的一个多路转接接口。 select系统调用可以让我们的程序同时监视多个文件描述符的上的事件是否就绪。 select的核心工作就是等&#xff0c;当监视的多个文件描述符中有一个或多个事件就绪时&#xff0c;select才会成功返回并将对应文件描述符的就绪…

kingbase(人大金仓)数据库的常用知识点与简单巡检

查看服务是否已设为开机自启 systemctl list-dependencies |grep kingbasehttps://blog.csdn.net/gyqailxj/article/details/127290687