本篇会加入个人的所谓鱼式疯言
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
引言
Spring MVC 犹如一座桥梁,连接着前端的精彩与后端的强大,它赋予开发者以灵动之笔,在数字化的画布上描绘出绚丽多彩的 Web 世界。在 Spring MVC 的引领下,我们能够驾驭复杂的业务逻辑,实现流畅的用户体验,让技术与创意完美融合,开启无限可能的 Web 开发之旅。
目录
-
返回响应内容
-
lombok
-
加法器
一. 返回响应内容
在上篇中,我们学习了如何使用控制层的处理 请求相关 , 现在我们学习如何处理 返回响应内容 。
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;
}
如上图:
- 类定义前 加入
@RequestMapping("/response")
和@Controller
- 方法定义前 加入 @RequestMapping(“/setStatus”) 和 @ResponseBody
- 使用
HttpServletResponse
类型来接收 响应方式
- response.setStatus(); 这个方法来设置响应的状态码 , 这个为其中的 一种枚举类型的状态码常量之一 :
HttpServletResponse.SC_BAD_REQUEST
为400
鱼式疯言
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
的报文格式
- 类定义前 加入
@RequestMapping("/response")
和@Controller
- 方法定义前 加入
@ResponseBody
- 其次, 使用
@RequestMapping(value = "/setContentType",produces = "application/json")
在这个注解这里, 第一个参数先加入 value = “/setContentType”, 然后第二个参数就加入 produces = “application/json” 。 这里也可以不需要加入参数
- 最后返回
"{\"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 "键值对设置完成!";
}
}
如上图:
- 类定义前 加入
@RequestMapping("/response")
和@Controller
- 方法定义前 加入 @RequestMapping(“/setStatus”) 和 @ResponseBody
- 使用
HttpServletResponse
类型来接收 响应方式
- 使用 这个方法 :
response.setHeader
(“My-Key”, “My-Value”); 第一个参数为 报头参数名, 第二个为 报头参数的内容 。 可以理解为Key
和Value
。
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";
}
}
如上图:
- 如果我们不使用
@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());
}
}
如上图所示,
- 添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
- 然后使用
@Data
添加 getter 和 setter 方法
- 最后使用
@AllArgsConstructor
添加 含有所有参数的构造方法 ,和 使用@NoArgsConstructor
添加不含有参数的构造方法。
展示完 lombok 的效果 之后, 下面就让小编来带着小伙伴们来 添加lombok 依赖 , 能轻松使用上面这三个注解 提高开发效率 吧~
3. 已有项目下添加依赖
-
安装插件
-
在 pom 文件 的
<dependencies></dependencies>
下 右击鼠标 点击生成(generate)
- 点击第一个插件
4. 默认的URL 点击OK 即可
- 选择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);
}
}
如上图:
- 首先,在 类前面加入
@RequestMapping("/calc")
@RestController
- 然后在 方法前加入
@RequestMapping("/sum")
并指定注解@RequestParam("num1")
和@RequestParam("num2")
为必传参数。
- 最后 相加返回 。
总结
-
返回响应内容: 学习HttpServletResponse 多种方法,从而实现 设置状态码,报文格式 ,设置报头信息 , 设置响应格式 等… 并且学习了
@Controller
,@ResponseBody
和@RestController
之间的联系和区别, 以及不同的使用效果。 -
lombok : 了解了
lombok
: 简化 Java代码编写的工具库 ,并且熟悉了使用@Data
,@AllArgsConstructor
以及@NoArgsConstructor,
还有一些@Getter
和@Setter
的使用等… -
加法器 :使用加法器, 从 前端中获取数据,直接返回给后端,然后端进行 相加得到数据, 直接返回给后端 。
如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖