Bootstrap

【Spring 全家桶】Spring MVC 快速入门,开始web 更好上手(下篇) , 万字解析, 建议收藏 ! ! !

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言

而是理解过并总结出来通俗易懂的大白话,

小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.

🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

引言

Spring MVC 犹如一座桥梁,连接着前端的精彩与后端的强大,它赋予开发者以灵动之笔,在数字化的画布上描绘出绚丽多彩的 Web 世界。在 Spring MVC 的引领下,我们能够驾驭复杂的业务逻辑,实现流畅的用户体验,让技术与创意完美融合,开启无限可能的 Web 开发之旅。

目录

  1. 返回响应内容

  2. lombok

  3. 加法器

一. 返回响应内容

在上篇中,我们学习了如何使用控制层的处理 请求相关 , 现在我们学习如何处理 返回响应内容

1. 设置状态码

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/response")
@Controller

public class ResponseController {

//    设置状态码

    /**
     * 设置状态码, 利用响应 HttpServletResponse 来设置
     * @param response
     * @return
     */
    @RequestMapping("/setStatus")
    @ResponseBody
    public  Student setStatsus(HttpServletResponse response) {
        Student student = new Student();
        student.setName("dalao");
        student.setAge(18);
        student.setGender("nv");

        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

        return student;
    
}

在这里插入图片描述

如上图:

  1. 类定义前 加入 @RequestMapping("/response")@Controller
  1. 方法定义前 加入 @RequestMapping(“/setStatus”) 和 @ResponseBody
  1. 使用 HttpServletResponse 类型来接收 响应方式
  1. response.setStatus(); 这个方法来设置响应的状态码 , 这个为其中的 一种枚举类型的状态码常量之一HttpServletResponse.SC_BAD_REQUEST400

鱼式疯言

HttpServletResponse.SC_BAD_REQUEST 是一种 枚举类型的状态码常量 , 关于这些常量, 见如下图(源码中参考):

在这里插入图片描述
以上这些 状态码 , 可以根据 具体的需求来设置

2. 设置报文格式


import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/response")
@Controller

public class ResponseController {
    /**
     * 设置报文格式
     */
    @RequestMapping(value = "/setContentType",produces =  "application/json")
    @ResponseBody
    public String SetHeader() {
        return "{\"success\":true}";
    }

}

在这里插入图片描述

如上图:

我们使用 postman 得到的就是 JSON 的报文格式

  1. 类定义前 加入 @RequestMapping("/response")@Controller
  1. 方法定义前 加入 @ResponseBody
  1. 其次, 使用 @RequestMapping(value = "/setContentType",produces = "application/json") 在这个注解这里, 第一个参数先加入 value = “/setContentType”然后第二个参数就加入 produces = “application/json”这里也可以不需要加入参数
  1. 最后返回 "{\"success\":true}" , 中间用 \"转义双引号

3. 设置报头信息

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/response")
@Controller

public class ResponseController {
/**
     * 设置报头的键值对
     */
    @RequestMapping("/setHeader")
    @ResponseBody
    public  String SetHeader2(HttpServletResponse response) {
            response.setHeader("My-Key", "My-Value");
            return  "键值对设置完成!";
    }
}

在这里插入图片描述

如上图:

  1. 类定义前 加入 @RequestMapping("/response")@Controller
  1. 方法定义前 加入 @RequestMapping(“/setStatus”) 和 @ResponseBody
  1. 使用 HttpServletResponse 类型来接收 响应方式
  1. 使用 这个方法response.setHeader (“My-Key”, “My-Value”); 第一个参数为 报头参数名, 第二个为 报头参数的内容 。 可以理解为 KeyValue

4. 设置响应格式

<1>. @Controller

小伙伴有没有发现

上文 中, 我们没有像前面那样使用 @RestController , 而是使用 @Controller + @ResponseBody

其实 @ResponseBody 既是类注解, 也是 方法注解 , 可以使用在 类前面, 作用范围为全部方法, 也可以使用来方法前面,作用在某个具体的方法上面

如果加与不加入 @ResponseBody , 小伙伴们和我看看区别哦~

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/response")
@Controller

public class ResponseController {

    /**
     *
     * MVC  原始模型(含有视图): 只有 Controller
     * @return
     *
     */
    @RequestMapping("/demo1")
    public  String demo1() {
        return "/hello.html";
    } 

}

在这里插入图片描述

在这里插入图片描述

如上图:

  1. 如果我们不使用 @ResponseBody, 只是 单独的使用 @Controller , 可以把 "/hello.html" 用于跳转 当前目录static 下的 hello.html 文件。

鱼式疯言

在这里插入图片描述
如上图: 在Spring 的项目下, 存储着一个static 的目录 , 在 目录下存放的HTML 文件, 只要启动程序,可 直接访问 HTML 文件 (如下演示)

在这里插入图片描述

<2>. @Controller + @ResponseBody

如果加入 @ResponseBody 的话, 会是什么效果呢?

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/response")
@Controller

public class ResponseController {


/**
     * @ResponseBody + @Controller(有视图) = @RestController(无视图)
     * @ResponseBody 含有的类注释和方法注释, 前者作用域更大, 后者更小。
     * @return
     */

    @ResponseBody
    @RequestMapping("/demo2")
    public  String demo2() {
        return "/hello.html";
    }

}

在这里插入图片描述

如上图所示:

@Controller + @ResponseBody 的话就不会跳转HTML 文件, 而是 以字符串的形式之间打印内容

<3>. @Controller + @ResponseBody (2)

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/response")
@Controller

public class ResponseController {
//    返回一个html
    @RequestMapping("/returnHtml")
    @ResponseBody
    public  String returnHtml() {
//        如果是视图传输也是404
        return "<h1>返回一个HTML的一级标题</h1>";
    }
}

在这里插入图片描述

虽然@Controller + @ResponseBody 的话就不会跳转HTML 文件, 但是可以 解析HTML 的标签页面

鱼式疯言

综上所述

  • @Controller可跳转 HTML 文件 , 但 不解析HTML 的标签页面
  • @Controller + @ResponseBody只显示文本内容 , 但 可以解析HTML 的标签页面
  • 在需要使用 类注解@Controller + @ResponseBody = @RestController@RestController 是类注解, 不是方法注解

  • 需要在 方法上使用 , 就必须是 @Controller + @ResponseBody

二. lombok

1. lombok 的初识

lombok简化 Java 代码编写的一种的工具库

帮助 开发人员自动生成 getter , setter , 构造方法, toString方法 等…

但是使用 lombok 是需要添加 lombok 相关的依赖 才可以使用, 添加完依赖之后,就可以像小编这样使用啦。

2. 演示案例

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


//Data 注解 表示可以通过文档获取并修改类信息
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MessageInfo {
   private  String from;
   private  String to;
   private String message;
}


class Demo {
   public static void main(String[] args) {
      MessageInfo messageInfo = new MessageInfo("来自","指向","消息");
      System.out.println(messageInfo.getMessage());
      System.out.println(messageInfo.getFrom());
      System.out.println(messageInfo.getTo());
   }
}

在这里插入图片描述
如上图所示,

  1. 添加依赖
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>
  1. 然后使用 @Data 添加 getter 和 setter 方法
  1. 最后使用 @AllArgsConstructor 添加 含有所有参数的构造方法 ,和 使用 @NoArgsConstructor 添加不含有参数的构造方法

展示完 lombok 的效果 之后, 下面就让小编来带着小伙伴们来 添加lombok 依赖 , 能轻松使用上面这三个注解 提高开发效率 吧~

3. 已有项目下添加依赖

  1. 安装插件
    在这里插入图片描述

  2. pom 文件<dependencies></dependencies>右击鼠标 点击 生成(generate)

在这里插入图片描述

  1. 点击第一个插件

在这里插入图片描述
4. 默认的URL 点击OK 即可
在这里插入图片描述

  1. 选择lombok 点击OK

在这里插入图片描述

4. 新建项目下添加依赖

如果在 新建项目 下, 出现这个页面后 ,按照如下方式添加即可

在这里插入图片描述

鱼式疯言

lombok 虽好, 可不要贪杯哦~

根据具体的需求来哦~ 当需要getter 也可以使用@Getter 或 @Data 等…

小伙伴 自行灵活选择 哦~

三. 加法器

在这里插入图片描述

小伙伴可以尝试一下实现这个小加法器。

实现这个加法器需要 前端和后端共同实现

<1>. 前端代码

<!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>

鱼式疯言

注意事项:

注意添加的目录
在这里插入图片描述

前端代码 的话,小伙伴 copy 即可, 学习spring 重要是后端代码的理解和实现。

<2>. 后端代码

package com.example.demo;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@RequestMapping("/calc")
@RestController
public class CalcDemo {

    @RequestMapping("/sum")
    public  String sum(@RequestParam("num1") Integer num1, @RequestParam("num2") Integer num2) {

        return "计算机计算的结果: " + (num1 + num2);
    }

}

在这里插入图片描述

在这里插入图片描述

如上图:

  1. 首先,在 类前面加入 @RequestMapping("/calc") @RestController
  1. 然后在 方法前加入 @RequestMapping("/sum") 并指定注解 @RequestParam("num1")@RequestParam("num2") 为必传参数。
  1. 最后 相加返回

总结

  1. 返回响应内容: 学习HttpServletResponse 多种方法,从而实现 设置状态码报文格式设置报头信息设置响应格式 等… 并且学习了 @Controller@ResponseBody@RestController 之间的联系和区别, 以及不同的使用效果。

  2. lombok : 了解了 lombok : 简化 Java代码编写的工具库 ,并且熟悉了使用 @Data@AllArgsConstructor 以及 @NoArgsConstructor, 还有一些@Getter@Setter 的使用等…

  3. 加法器 :使用加法器, 从 前端中获取数据直接返回给后端,然后端进行 相加得到数据, 直接返回给后端

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

;