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;
    }
}

效果展示

输入内容,点击按钮之后

相关推荐
武昌库里写JAVA1 小时前
使用React Strict DOM改善React生态系统
数据结构·vue.js·spring boot·算法·课程设计
嗨小陈1 小时前
旅游推荐系统设计与实现 计算机毕业设计 有源码 P10090
spring boot·课程设计·旅游·计算机毕业设计
Q_19284999061 小时前
基于Spring Boot的大学就业信息管理系统
java·spring boot·后端
Yvemil71 小时前
《开启微服务之旅:Spring Boot Web开发举例》(二)
前端·spring boot·微服务
Allen Bright2 小时前
Spring Boot 整合 RabbitMQ:从入门到实践
spring boot·rabbitmq·java-rabbitmq
Takumilove2 小时前
MQTT入门:在Spring Boot中建立连接及测试
java·spring boot·后端
潜洋3 小时前
Spring Boot 教程之三十六:实现身份验证
java·数据库·spring boot
Yvemil74 小时前
《开启微服务之旅:Spring Boot Web开发》(三)
前端·spring boot·微服务