SpringBoot 入门:SpringMVC 综合练习与应用分层
SpringBoot 入门教程涵盖 SpringMVC 核心知识。内容包含留言板与图书管理系统的综合练习,演示前后端接口约定、Lombok 简化开发及服务器代码编写。深入讲解应用分层架构原理,包括表现层、业务逻辑层和数据层的职责划分,并通过代码重构展示分层优势。文末总结常用 Web 注解及 Cookie、Session 会话机制。

SpringBoot 入门教程涵盖 SpringMVC 核心知识。内容包含留言板与图书管理系统的综合练习,演示前后端接口约定、Lombok 简化开发及服务器代码编写。深入讲解应用分层架构原理,包括表现层、业务逻辑层和数据层的职责划分,并通过代码重构展示分层优势。文末总结常用 Web 注解及 Cookie、Session 会话机制。


需求:
Ⅰ 发布留言
Ⅱ 查询留言
Ⅰ 写代码之前,介绍一个新的工具包 Lombok。
Lombok 是一个 Java 工具库,通过添加注解的方式简化 Java 的开发。
① 引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
② 使用
Lombok 通过一些注解的方式,可以帮助我们消除一些冗长代码,使代码看起来简洁一些。就比如:上面写的 Student 对象,无需自己写 get、set、toString 方法。只需写一个注解 @Data 就可以了。
import lombok.Data;
@Data
public class Student {
private String name;
private Integer id;
private int age;
}
③ 原理解释
加了@Data 注解之后,Idea 反编译的 class 文件。
这不是真正的字节码文件,而是 Idea 根据字节码进行反编译后的文件。 反编译是将可执行的程序代码转换为某种形式的高级编程语言,使其具有更易读的格式。反编译是一种逆向工程,它的作用与编译器的作用相反。
④ 更多使用
如果觉得@Data 生成的方法太多,Lombok 也提供了一些更精细粒度的注解。
Ⅱ 更快捷引入依赖
① 安装插件 EditStarter,重启 Idea。
② 在 pom.xml 文件中,单击右键,选择 Generate。
③ 进入 Edit Starters 的编辑界面,添加对应依赖即可。
Ⅲ 实现服务器代码
定义留言对象
import lombok.Data;
@Data
public class MessageInfo {
private String from;
private String to;
private String say;
}
创建 MessageController 类
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RequestMapping("/message")
@RestController
public class MessageController {
List<MessageInfo> messageInfos = new ArrayList<>();
@RequestMapping("/publish")
public Boolean publish(MessageInfo messageInfo) {
// 校验信息
if (!StringUtils.hasLength(messageInfo.getFrom()) || !StringUtils.hasLength(messageInfo.getTo()) || !StringUtils.hasLength(messageInfo.getSay())) {
return false;
}
// 把信息存起来方便下一个方法获取
messageInfos.add(messageInfo);
return true;
}
@RequestMapping("/getList")
public List<MessageInfo> getList() {
return messageInfos;
}
}
前端页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>留言板</title>
<style>
.container { width:350px; height:300px; margin:0 auto; text-align: center; }
.grey { color: grey; }
.container .row { width:350px; height:40px; display: flex; justify-content: space-between; align-items: center; }
.container .row input { width:260px; height:30px; }
#submit { width:350px; height:40px; background-color: orange; color: white; border: none; margin:10px; border-radius:5px; font-size:20px; }
</style>
</head>
<body>
<div class="container">
<h1>留言板</h1>
<p class="grey">输入后点击提交,会将信息显示下方空白处</p>
<div class="row"><span>谁:</span><input type="text" name="" id="from"></div>
<div class="row"><span>对谁:</span><input type="text" name="" id="to"></div>
<div class="row"><span>说什么:</span><input type="text" name="" id="say"></div>
<input type="button" value="提交" id="submit" onclick="submit()">
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
function submit(){
$.ajax({
url:"/message/publish",
type:"get",
data:{ from: $("#from").val(), to: $("#to").val(), say: $("#say").val()},
success:function(result){
if(result ==false){alert("输入不合法");}
else{
var divE ="<div>"+from+"对"+to+"说:"+ say +"</div>";
$(".container").append(divE);
$("#from").val(""); $("#to").val(""); $("#say").val("");
}
}
});
}
</script>
</body>
</html>
需求:
创建新项目,引入依赖。 将前端代码复制到 static 目录下。
先实现其中的两个功能:用户登录和图书列表展示。
需求分析:
创建图书类
import lombok.Data;
import java.math.BigDecimal;
@Data
public class BookInfo {
private Integer id;
private String bookName;
private String author;
private Integer num;
private BigDecimal price;
private String publishName;
private Integer status;
private String statusCN;
}
创建 UserController,实现登录验证接口。
import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user")
@RestController
public class UserController {
@RequestMapping("/login")
public String login(String userName, String password, HttpSession session) {
if(!StringUtils.hasLength(userName)||!StringUtils.hasLength(password)){return"用户名或密码为空";}
if(!"admin".equals(userName)||!"admin".equals(password)){return"用户名或密码错误";}
session.setAttribute("userName",userName);
return "";
}
}
创建 BookController,获取图书列表
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@RequestMapping("/book")
@RestController
public class BookController {
@RequestMapping("/getBookList")
public List<BookInfo> getBookList(){
List<BookInfo> bookInfos = new ArrayList<>();
for(int i =1; i <=15; i++){
BookInfo bookInfo = new BookInfo();
bookInfo.setId(i); bookInfo.setBookName("图书"+i);
bookInfo.setAuthor("作者"+i); bookInfo.setNum(i*2+1);
bookInfo.setPrice(new BigDecimal(i*3)); bookInfo.setPublishName("出版社"+i);
if(i %5==0){ bookInfo.setStatus(2); bookInfo.setStatusCN("不可借阅");}
else{ bookInfo.setStatus(1); bookInfo.setStatusCN("可借阅");}
bookInfos.add(bookInfo);
}
return bookInfos;
}
}
登录页面代码略(包含 HTML/CSS/JS 结构)。 图书列表展示代码略(包含 Bootstrap 样式及分页逻辑)。
通过上面的练习,我们学习了 Spring MVC 简单功能的开发,但是我们也发现了一些问题。目前我们程序的代码有点"杂乱"。基于此,接下来学习应用分层。
Ⅰ 什么是应用分层? 应用分层是一种软件开发设计思想,它将应用程序分成 N 个层次,这 N 个层次分别负责各自的职责,多个层次之间协同提供完整的功能。
Ⅱ 应用分层的目的 随着业务越来越复杂,大量的代码混在一起,会出现逻辑不清晰、各模块相互依赖、代码扩展性差等问题。所以学习对项进行分层是程序员的必修课。
Ⅲ 如何分层 常见的 MVC 设计模式,就是应用分层的一种具体体现。目前更主流的开发方式是'前后端分离'的方式,对于 Java 后端开发者,又有一种新的分层架构:把整体架构分为表现层、业务逻辑层和数据层,即'三层架构'。
在 Spring 的实现中,均有体现:
使用上面的分层思想,来对代码进行改造。先创建对应的包路径,并把代码移到对应的目录。
在 dao 目录下创建 BookDao 文件,在 service 目录下创建 BookService 文件。
将 BookController 中的代码改写为调用 Service。
@RequestMapping("/getBookList")
public List<BookInfo> getBookList(){
BookService bookService = new BookService();
return bookService.getBookList();
}
BookDao 文件中的代码(mock 数据)。
BookService 文件中的代码(业务逻辑处理)。
学习 Spring MVC,其实就是学习各种 Web 开发需要用的到注解。
a. @RequestMapping: 路由映射 b. @RequestParam: 后端参数重命名 c. @RequestBody: 接收 JSON 类型的参数 d. @PathVariable: 接收路径参数 e. @RequestPart: 上传文件 f. @ResponseBody: 返回数据 g. @CookieValue: 从 Cookie 中获取值 h. @SessionAttribute: 从 Session 中获取值 i. @RequestHeader: 从 Header 中获取值 j. @Controller: 定义一个控制器,Spring 框架启动时加载,把这个对象交给 Spring 管理。默认返回视图。 k. @RestController: @ResponseBody + @Controller 返回数据
Cookie 和 Session 都是会话机制,Cookie 是客户端机制,Session 是服务端机制。二者通过 SessionId 来关联。Spring MVC 内置 HttpServletRequest 和 HttpServletResponse 两个对象。需要使用时,直接在方法中添加对应参数即可,Cookie 和 Session 可以从 HttpServletRequest 中来获取,也可以直接使用 HttpServletResponse 设置 Http 响应状态码。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online