Skip to content


需求实现

当在浏览器地址栏,访问前端静态页面(http://localhost:8080/usre.html)后,在前端页面上,会发送 ajax 请求,请求服务端(http://localhost:8080/list),服务端程序加载 user.txt 文件中的数据,读取出来后最终给前端页面响应 json 格式的数据,前端页面再将数据渲染展示在表格中

创建项目

实现步骤

引入前端文件

下载连接:https://pan.baidu.com/s/11o--fOuEgEQTXIr2wRP_jw?pwd=bn4r

引入资料中准备好的数据文件 user.txt,以及 static 下的前端静态页面

用户信息实体类

在 Springboot 启动类所在的包下再定义一个包 pojo,专门用来存放实体类。 在该包下定义一个实体类 User

java
package com.jacksonling.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;

@Data // 引入了依赖 lombok,该注解提供 getter 和 setter 方法
@NoArgsConstructor // 无参构造器
@AllArgsConstructor // 全参构造器
public class User {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private Integer age;
    private LocalDateTime updateTime;
}

相关注解

(1)@Data:引入了 lombok 依赖,该注解提供 getter 和 setter 方法

(2)@NoArgsConstructor:无参构造器

(3)@AllArgsConstructor:全参构造器

引入工具类依赖

我们在项目中再引入一个非常常用的工具包 hutool,然后调用里面的工具类,就可以非常方便快捷的完成业务操作

xml
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.27</version>
</dependency>

代码示例

创建子包 controller,用于处理请求,在其中创建一个类为 UserController

java
package com.jacksonling.controller;

import cn.hutool.core.io.IoUtil;
import com.jacksonling.pojo.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;


// 用于处理请求
@RestController
public class UserController {
    // 标识请求路径
    @RequestMapping("/list")
    public List<User> list() throws Exception{
        // 1. 加载并读取文件

        // 方法一:使用 hutool 工具类
//        FileInputStream fileInputStream = new FileInputStream(new File("src/main/resources/user.txt"));
//        ArrayList<String> lines = IoUtil.readLines(fileInputStream, StandardCharsets.UTF_8, new ArrayList<>());


        // 方法二:根据文件名称获取输入流
        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("user.txt");
        ArrayList<String> lines = IoUtil.readLines(resourceAsStream, StandardCharsets.UTF_8, new ArrayList<>());

        // 2. 解析数据,封装成对象 --> 集合
        List<User> userList = lines.stream().map(line -> {
            String[] parts = line.split(",");
            Integer id = Integer.parseInt(parts[0]);
            String username = parts[1];
            String password = parts[2];
            String name = parts[3];
            Integer age = Integer.parseInt(parts[4]);
            LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            // 把每一行数据封装成对象
            return new User(id, username, password, name, age, updateTime);
        }).collect(Collectors.toList());// 调用 collect 方法,封装到集合中

        // 3. 响应数据
//        return JSONUtil.toJsonStr(userList, JSONConfig.create().setDateFormat("yyyy-MM-dd HH:mm:ss"));
        return userList;
    }
}

@ResponseBody

基本介绍

(1)类型:方法注解、类注解

(2)位置:书写在 Controller 方法上或类上

(3)⭐ 作用:将方法返回值直接响应给浏览器,如果返回值类型是实体对象/集合,将会转换为 JSON 格式后在响应给浏览器

实现原理

(1)问题提出

我们所书写的 Controller 中,只在类上添加了 @RestController 注解、方法添加了 @RequestMapping 注解,并没有使用 @ResponseBody 注解,怎么给浏览器响应呢?

(2)原理解释

@RestController 注解包含了 @Controller 、@ResponseBody 注解,一旦在类上加了 @ResponseBody 注解,就相当于该类所有的方法中都已经添加了 @ResponseBody 注解