Spring Boot

目录

在介绍SpringBoot之前,先介绍一下Maven~

1. Maven

Maven的介绍

Maven 是一个项目管理和构建自动化工具,主要服务于基于 Java 的项目。它由 Apache 软件基金会维护。Maven 主要用于项目的依赖管理、构建过程的自动化、项目信息管理等。

什么是依赖?:"依赖"通常指的是一个软件组件(如库、框架、模块等)在运行或构建过程中需要的其他组件

Maven的核心功能:

  1. 依赖管理:Maven 能够自动下载项目所需的所有依赖,并管理这些依赖的版本,确保项目中使用的库是最新且兼容的。
  2. 项目构建:Maven 定义了一系列生命周期(如编译、测试、打包、部署等),通过简单的命令可以自动执行这些构建步骤。
  3. 项目管理 :Maven 通过 pom.xml 文件(Project Object Model)来定义项目的构建过程、依赖关系、插件配置等,使得项目管理更加标准化和自动化。

创建Maven项目:

IDEA帮我们集成了Maven,所以我们不需要自己再去下载安装了~

创建项目之前,先设置好本地仓库以及镜像源:

在IDEA中,打开设置settings,搜索框中输入Maven,下面的设置尽量和我的一样

大家可以自己创建一个目录作为本地仓库,结构如下

在settings.xml文件添加下面的内容:

xml 复制代码
<mirrors>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
</mirrors>

如果大家没有这个文件,可以去我的仓库中下载[仓库链接](https://gitee.com/vampire-wpre/learning-resource/tree/master/配置文件/Maven 配置文件)

接下来就可以创建项目了

选择项目路径,点击finish

点开pom.xml文件,添加下面的代码

xml 复制代码
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>
</dependencies>

之前我们编写JDBC程序时需要自己下载导入jar包,非常麻烦,现在我们只需要在pom.xml文件中添加下面的内容,然后点击刷新,就可以完成jar包的加载。

如果找不到刷新按钮,点击右上角的Maven

有一个刷新按钮

刷新之后我们可以找到Maven帮我们加载的jar包

如果我们需要下载其他的jar包,直接去Maven中央仓库https://mvnrepository.com/搜索

选择我们想要的jar包以及版本,直接把这段代码复制到pom.xml文件中就可以了

2. Spring Boot

Spring Boot的介绍

Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它简化了基于Spring的应用开发,通过"约定大于配置"的原则,让开发者可以轻松地创建独立运行的、生产级别的Spring应用。

创建项目

安装插件(专业版可跳过)

IDEA社区版需要下载Spring Boot Helper 插件才能创建SpringBoot项目(专业版不需要),Spring Boot Helper插件下载链接

有一个免费版本,其他是收费的,并且这个免费版本的插件要求我们的IDEA是2021.1~2022.1.4这个范围内才能使用

下载好之后是个压缩包,不需要压缩,我们打开IDEA,

选择我们下载好的压缩包

这样插件就安装好了

创建第一个Spring Boot项目

打开IDEA,选择new Project

项目类型选择Maven

选择web->Spring Web

Spring Boot版本选择3.3.4或者3.2.10

接下来选择项目路径,然后点击finish

这样我们的项目就创建好了,创建好之后,右下角的Load Maven Project一定要点~

点开pom.xml文件,

修改之后刷新Maven

实现SpringBoot的helloworld

创建一个新的类ParamController,代码如下

java 复制代码
@RestController
public class ParamController {
    @RequestMapping("/p1")
    public String p1() {
        return "Hello World";
    }
}

启动程序,

接着在浏览器中输入

http 复制代码
http://127.0.0.1:8080/p1

http:请求的协议

127.0.0.1:IP地址,127.0.0.1表示本机(自己的电脑)

8080:端口号,8080是Tomcat(一个Web服务器)的端口号

p1:资源路径

3. Spring MVC

关于Spring MVC:

  • Spring MVC 是 Spring 框架中的一个模块,专门用于构建 Web 应用程序。
  • 它实现了 MVC(Model-View-Controller)设计模式,帮助开发者将应用程序分为模型、视图和控制器,以实现关注点分离。
  • Spring MVC 提供了强大的数据绑定、验证、选择视图和处理异常等功能。
  • 它通常与 Spring 框架的其他模块一起使用,以构建完整的 Web 应用程序。

学习Spring MVC,主要学习以下几个方面:

1、建立连接: 将用户(浏览器)和Java程序连接,使得访问一个地址就能调用我们写的Spring程序

2、请求: 用户发送请求时会携带一下参数,我们要获取到这些参数

3、响应: 执行一些业务逻辑后,把结果返回给用户

创建Spring MVC项目

创建的方式和Spring Boot项目创建方式一模一样

建立连接

首先介绍一个工具Postman的使用:

Postman可以帮我们快速建立http请求


后续我们进行测试的时候就可以直接使用Postman帮我们构造http请求,发送给服务器,而不是自己写前端代码。

@RequestController注解

表明该类是一个控制器,用于处理 HTTP 请求。

@RequestMapping 注解

可以将一个或多个 HTTP 请求映射到一个控制器的方法上。这意味着当一个匹配的请求到达时,Spring MVC 将调用相应的方法来处理这个请求,建立连接通过RequestMapping。RequestMapping可以修饰类(类路径),也可以修饰方法(方法路径),访问时是类路径+方法路径。例如

java 复制代码
@RestController
@RequestMapping("/param")//类路径是/param
public class ParamController {
    @RequestMapping("/p1")//方法路径是/p1
    public String p1(String name) {
        return name;
    }
}

上述代码中既有类路径又有方法路径,所以我们在访问某个方法时,必须是类路径+方法路径

http 复制代码
http://127.0.0.1:8080/param/p1

RequestMapping既支持get请求,又支持post请求,但是我们通过可以设置参数来规定只支持get或者post,

java 复制代码
//设置参数method = RequestMethod.GET,表示只接收get请求
@RequestMapping(value = "/p4", method = RequestMethod.GET)
public String p4() {
    return "p4";
}

//设置参数method = RequestMethod.POST,表示只接收post请求
@RequestMapping(value = "/p5", method = RequestMethod.POST)
public String p5() {
    return "p5";
}

@GetMapping注解

表示只接收get请求

java 复制代码
//GetMapping,只接收get请求
@GetMapping("/p6")
public String p6() {
    return "p6";
}

@PostMapping注解

表示只接收post请求

java 复制代码
//PostMapping,只接收post请求
@PostMapping("/p7")
public String p7() {
    return "p7";
}

请求

我们需要从请求中接收、获取到某些信息

接收一个参数

请求参数要和url中查询字符串中的参数名一致才能接收

方法中的参数名要和url中查询字符串中的参数名一致才能接收

java 复制代码
//1个参数
@RequestMapping("/p8")
public String p8(String name) {
    return "name: " + name;
}

接收多个参数

java 复制代码
//多个参数
@RequestMapping("/p9")
public String p9(String name, Integer age) {
    //尽量使用包装类,因为前端传递的普通参数默认是String类型,后端接收时,使用包装类可以进行类型转换
    return "name: " + name + ", age: " + age;
}

使用对象接收多个参数

我们可以自定义一个类

java 复制代码
public class User {
    private int age;
    private String name;
    private String gender;
}
java 复制代码
//使用对象接收,多个参数
@RequestMapping("/p11")
public String p11(User user) {
    return "user: " + user;
}

Spring会根据参数名自动绑定到对象的各个属性上,如果某个参数没有传递,会赋值为默认值。

参数重命名

如果对前端传递过来的参数名字不习惯,我们可以对参数重命名,通过使用@RequestParam注解来完成。

java 复制代码
//给前端的传递过来的参数重命名
@RequestMapping("/p12")
public String p12(@RequestParam("username") String name) {
    //前端的参数名字是username,我们后端定义的是name,@RequestParam的作用就是参数绑定
    //如果加上了这个注解,前端的参数名字必须和@RequestParam()括号内的名字一样,否则会报错
    return "name:" + name;
}

@RequestMapping("/p13")
public String p13(@RequestParam(value = "username", required = false) String name) {
    //@RequestParam的required默认是true,表示必传参数,前端没有传这个参数会报错,
    //设置为false后,即使前端的参数为name,也不会报错
    return "name:" + name;
}

使用数组接收多个参数

当前端传递的参数像 name=张三&name=李四 这样重复的参数,会把它们封装成一个数组,我们后端可以使用数组接收

java 复制代码
@RequestMapping("/p14")
public String p14(String[] arr) {
    return "arr: " + List.of(arr);
}

如果前端传的参数像 name=张三,李四,王五 此时数组的长度应该是3(会自动切割)

使用集合接收

前端封装好的数组,我们同样可以使用集合来接收,只不过需要加上@RequestParam来将数组绑定成对应的集合类型

java 复制代码
//使用集合接收
@RequestMapping("/p15")
public String p15(@RequestParam List<String> list) {
    //前端传递的同样是数组,我们后端需要加上@RequestParam把前端传递的数组绑定成List
    //所以说,RequestParam既可以绑定参数名,也可以绑定类型
    return "list: " + list;
}

接收json数据

使用对象接收,并且加上@RequestBody注解

java 复制代码
@RequestMapping("/p16")
public String p16(@RequestBody User user) {
    //RequestBody,表示从请求正文中拿到数据
    return "user: " + user;
}

获取url中路径参数

上述说的参数都是查询字符串中的参数,这里说的是路径上的参数,例如

url为

http 复制代码
http://127.0.0.1:8080/param/p17/article/articleId

如果想要获取参数articleId,可以使用@PathVariable注解,例如:

java 复制代码
@RequestMapping("/article/{articleId}")
public String p17(@PathVariable String articleId) {
    return "article" + articleId;
}

如果参数不止一个

java 复制代码
//2个参数
@RequestMapping("/article/{articleId}/{name}")
public String p18(@PathVariable String articleId, @PathVariable String name) {
    return "article" + articleId + ",   name" + name;
}

"/article/{articleId}/{name}"中,{articleId}和{name}是占位符,如果只有name没有articleId则访问失败。

获取上传的文件

使用注解@RequestPart,MultipartFile类型的参数接收

java 复制代码
//获取上传的文件
@RequestMapping("/p19")
public String p19(@RequestPart("fileName") MultipartFile file) {
    String name = file.getOriginalFilename();
    return "file: " + name;
}

获取Cookie和Session

获取Cookie:利用HttpServletRequest

java 复制代码
//获取Cookie:传统方式,利用HttpServletRequest
@RequestMapping("/p20")
public String p20(HttpServletRequest request) {
    Cookie[] cookies = request.getCookies();
    if (cookies == null) {
        //Cookie可能为空
        return "Cookie为空";
    }
    for (Cookie cookie : cookies) {
        System.out.println("name: " + cookie.getName() + " value: " + cookie.getValue());
    }
    return "获取到Cookie";
}

获取Cookie:使用注解

java 复制代码
//注解的方式获取Cookie
@RequestMapping("/p21")
public String p21(@CookieValue("Vampire") String Vampire) {
    //@CookieValue(),括号中填写想要获取的key,获取到的key的value会给方法中的参数Vampire
    return "获取到Cookie,Vampire的值为 " + Vampire;
}

设置Session:Session是存储在内存中的,重启服务器会丢失Session,所以要设置Session

java 复制代码
//设置Session
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {
    HttpSession session = request.getSession();//先获取到Session,如果没有会创建一个
    session.setAttribute("username", "张三");//设置session,key-value
    session.setAttribute("age", 18);//设置session,key-value
    return "设置Session成功";
}

获取Session:使用HttpServletRequest

getSession有参数版本:true->如果Session对象为空会创建一个Session对象;false->如果Session对象为空,不会创建Session对象,getSession默认为true

java 复制代码
//获取Session
@RequestMapping("/p22")
public String p22(HttpServletRequest request) {
    //原理: 从Cookie中找到SessionID,根据SessionID拿到Session
    HttpSession session = request.getSession();
    Object username = session.getAttribute("username");//可以理解为根据key获取value
    Object age = session.getAttribute("age");

    if (username == null || age == null) {
        return "null";
    }
    return "name: " + username + ", age: " + age;
}

获取Session:使用HttpSession

java 复制代码
@RequestMapping("/p23")
public String p23(HttpSession session) {

    Object username = session.getAttribute("username");
    Object age = session.getAttribute("age");

    if (username == null || age == null) {
        return "null";
    }
    return "name: " + username + ", age: " + age;
}

获取Session:使用注解@SessionAttribute

java 复制代码
//第三种获取Session:使用注解
@RequestMapping("/p24")
public String p24(@SessionAttribute String username) {

    return "获取Session信息,username: " + username;
}

获取Header

使用HttpServletRequest

java 复制代码
//获取Header:使用HttpServletRequest
@RequestMapping("/p25")
public String p25(HttpServletRequest request) {
    String UserAgent = request.getHeader("User-Agent");
    String ContentType = request.getHeader("Content-Type");
    return "UserAgent: " + UserAgent + ", ContentType: " + ContentType;
}

使用注解@RequestHeader

java 复制代码
//获取Header:使用注解
@RequestMapping("/p26")
public String p26(@RequestHeader("User-Agent") String UserAgent) {
    return "UserAgent: " + UserAgent;
}

响应

在接收到请求之后,经过某些逻辑,我们给需要返回响应,这时我们会接触到另一个注解Controller。

Controller和RestController的区别

  • @Controller:是一个通用的控制器注解,它标记的类可以处理HTTP请求,但返回的视图通常需要通过Spring MVC的视图解析器来解析,适用于需要返回视图的Web应用程序,如传统的服务器渲染的Web页面
  • @RestController:是@Controller@ResponseBody的组合注解。这意味着任何标记了@RestController的类中的方法都会自动应用@ResponseBody,即方法的返回值将直接作为HTTP响应的正文返回,而不是通过视图解析器解析。适用于构建RESTful API,通常返回JSON或XML格式的数据给客户端。

如果想返回数据,使用ResponseBody,如果想返回html页面,使用Controller。Controller是类注解,ResponseBody即是类注解,又是方法注解,加在类上表示该类的所有方法都返回数据,加在方法上表示该方法返回数据,其他方法不受影响。

返回html页面

java 复制代码
@RequestMapping("/Response")
@Controller
public class ResponseController {
    //返回html页面
    @RequestMapping("/r1")
    public String r1() {
        return "/Test.html";
    }
}

返回html代码片段

java 复制代码
@RequestMapping("/Response")
@Controller
public class ResponseController {
    //返回html代码片段
    @RequestMapping("/r3")
    @ResponseBody
    public String r3() {
        return "<h1>你好</h1>";//浏览器会解析成html代码
    }
}

返回json数据

java 复制代码
@RequestMapping("/Response")
@Controller
public class ResponseController {
    //返回json数据
    @ResponseBody
    @RequestMapping("/r4")
    public User r4() {
        User user = new User();
        user.setAge(18);
        user.setName("张三");
        user.setGender("男");
        return user;//虽然这里返回的是user对象,但是实际上返回的就是json
    }
}

设置状态码

使用HttpServletResponse

java 复制代码
@RequestMapping("/Response")
@Controller
public class ResponseController {
    //设置状态码,使用HttpServletResponse
    @ResponseBody
    @RequestMapping("/r5")
    public String r5(HttpServletResponse response) {
        response.setStatus(500);//设置状态码
        return "状态码设置成功";
    }
}

设置Header

java 复制代码
@RequestMapping("/Response")
@Controller
public class ResponseController {
    //设置响应的Header,设置返回的数据类型
    @RequestMapping(value = "/r6", produces = "application/json")
    @ResponseBody
    public String r6() {

        return "{\"user\":wpre}";
    }

    //设置响应的Header,自定义key,value
    @RequestMapping(value = "/r7")
    @ResponseBody
    public String r7(HttpServletResponse response) {
        response.setHeader("Key1", "value1");
        return "设置成功";
    }

}

4. 应用分层

应用分层是一种软件开发思想,它将应用程序分成N个层次,每个层次负责自己的工作,多个层次之间协同完成整个应用的功能。

对于Java后端,有一种新的分层架构

三层架构:

1、表现层:就是展示数据结果(返回结果)和接收用户指令接收参数的,是最靠近用户的一层

2、业务逻辑层:负责处理业务逻辑

3、数据层:负责存储、管理业务数据,包括增删查改

Spring中的体现:

Controller:控制层,也就是表现层,负责接收前端发送的请求,对请求进行处理并响应数据

Service:业务逻辑层

Dao:数据访问层,也称为持久层

5. 小案例:加法计算器

实现一个加法计算器,用户在浏览器中输入两个数后,后端返回这两个数相加的结果,最后将结果显示在浏览器中

前端代码:前端代码一般放在static文件夹中

html 复制代码
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <form action="calc/sum" method="post">
            <h1>计算器</h1>
            数字1:<input name="num1" type="text"><br>
            数字2:<input name="num2" type="text"><br>
            <input type="submit" value=" 点击相加 ">
        </form>
    </body>

</html>

后端代码:

java 复制代码
@RestController
@RequestMapping("/calc")
public class CalcController {
    //实现计算器功能
    @RequestMapping("/sum")
    public String sum(@RequestParam("num1") Integer num1, @RequestParam("num2") Integer num2) {
        Integer sum = num1 + num2;
        return "计算结果:" + sum;
    }
}

效果展示

输入内容,点击按钮之后

相关推荐
weixin_436525072 分钟前
Spring Boot 集成 EasyExcel 的最佳实践:优雅实现 Excel 导入导出
java·spring boot·后端
ChinaRainbowSea5 分钟前
9. LangChain4j + 整合 Spring Boot
java·人工智能·spring boot·后端·spring·langchain·ai编程
武昌库里写JAVA16 分钟前
Mac下Python3安装
java·vue.js·spring boot·sql·学习
Light6023 分钟前
领码方案|Linux 下 PLT → PDF 转换服务超级完整版:异步、权限、进度(一气呵成)
linux·spring boot·pdf·gpcl6/ghostpcl·s3/oss·权限与审计·异步与进度
召摇2 小时前
Spring Boot 内置工具类深度指南
java·spring boot
Moshow郑锴4 小时前
SpringBootCodeGenerator使用JSqlParser解析DDL CREATE SQL 语句
spring boot·后端·sql
小沈同学呀10 小时前
创建一个Spring Boot Starter风格的Basic认证SDK
java·spring boot·后端
凤山老林12 小时前
SpringBoot 轻量级一站式日志可视化与JVM监控
jvm·spring boot·后端
Chan1613 小时前
JVM从入门到实战:从字节码组成、类生命周期到双亲委派及打破双亲委派机制
java·jvm·spring boot·后端·intellij-idea