初识Springboot

package org.example;

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

@RestController//表示当前类为一个请求处理类
public class HelloController {

    @RequestMapping("/hello")//用于指定访问路径,访问时执行该方法
    public String hello(String name){
        System.out.println("name:"+name);
        return "hello " + name;

    }
}
Java

SpringBoot基础案例(渲染用户数据列表)

核心代码:

//user.txt
1,daqiao,1234567890,大乔,22,2024-07-15 15:05:45
2,xiaoqiao,1234567890,小乔,18,2024-07-15 15:12:09
3,diaochan,1234567890,貂蝉,21,2024-07-15 15:07:16
4,lvbu,1234567890,吕布,28,2024-07-16 10:05:15
5,zhaoyun,1234567890,赵云,27,2024-07-16 11:03:28
6,zhangfei,1234567890,张飞,31,2024-07-16 11:03:28
7,guanyu,1234567890,关羽,34,2024-07-16 12:05:12
8,liubei,1234567890,刘备,37,2024-07-16 15:03:28
Dns
//user.html
<body>
    <div id="app">
        <h1>用户列表数据</h1>
        <!--定义一个表格,包括6,分别是: ID, 用户名, 密码, 姓名, 年龄, 更新时间-->
        <table>
            <thead>
                <tr>
                    <th>ID</th>
                    <th>用户名</th>
                    <th>密码</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>更新时间</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="user in userList">
                    <td>{{user.id}}</td>
                    <td>{{user.username}}</td>
                    <td>{{user.password}}</td>
                    <td>{{user.name}}</td>
                    <td>{{user.age}}</td>
                    <td>{{user.updateTime}}</td>
                </tr>
            </tbody>
        </table>
    </div>

    <!--引入axios-->
    <script src="js/axios.min.js"></script>  //导入axios
    <script type="module">  //模块化JS
        import { createApp } from './js/vue.esm-browser.js'  //创建Vue实例应用
        createApp({
            data() {
                return {
                    userList: []
                }
            },
            methods: {
                async search(){
                    const result = await axios.get('/list');//Axios同步通信,访问服务器(/list),执行对应方法获取数据
                    this.userList = result.data;
                }
            },
            mounted() { //钩子函数,用于中页面初始化后执行
                this.search();
            }
        }).mount('#app')
    </script>
</body>
JavaScript
//User.java
package org.example.pojo;//pojo:实体类

/*
* 实体用户类
* */

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

import java.time.LocalDateTime;

@Data    //快速构建get,set方法
@NoArgsConstructor   //无参构造方法
@AllArgsConstructor  //全参数构造方法
public class User {

    private Integer id;
    private String username;
    private String password;
    private String name;
    private Integer age;
    private LocalDateTime updateTime;

}
Java
//UserController.java
package org.example.controller;


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

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;

@RestController//请求处理类
public class UserController {

    @RequestMapping("/list")
    public List<User> list() throws Exception{

        //1.加载并读取user.txt文件,获取用户数据
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");//读取文件
        ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());//读取用户数据

        //2.解析用户信息,封装为User对象
        List<User> list = lines.stream().map(line -> {//这里的 map 方法接受一个 Function<T, R> 类型的参数,T 是流中元素的类型(这里是 String,因为 lines 是一个 List<String>,每一行数据是一个字符串),R 是转换后元素的类型(这里是 User)。Lambda 表达式 line -> {...} 就是这个 Function 的实现。return 语句所在的代码块就是这个 Lambda 表达式的主体。在 Java 的 Stream API 中,map 方法的作用是将流中的每个元素通过指定的函数进行转换,生成一个新的流。这个指定的函数需要返回一个新的元素,用于替换原流中的元素。
具体到这段代码,map 方法会对 lines 流中的每一行字符串数据进行处理。Lambda 表达式的作用就是将每一行字符串解析成一个 User 对象。return new User(id, username, password, name, age, updateTime); 语句的目的是返回一个新创建的 User 对象,这个对象是根据当前行数据解析得到的。map 方法会将这个 User 对象放入新的流中。最终,通过 toList() 方法将这个新的流转换为一个 List<User> 集合。
简单来说,return 语句是为了满足 map 方法的要求,将每一行字符串数据转换为对应的 User 对象,以便后续处理和存储。
            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);
        }).toList();//快速将数组转化为List集合

        //3.返回json
        return list;//响应时@RestController中的@BodyController会自动将对象或集合形式的数据转换为json格式并作为响应体渲染
    }
}
Java

最终效果:

分层解耦

三层架构(遵循单一职责原则)

Controller(接受请求,响应数据) -> Service(逻辑处理) -> Dao(数据访问)

上述案例优化后如下:(三层架构)

//UserController.java
package org.example.controller;

import org.example.Service.Impl.UserServiceImpl;
import org.example.Service.UserService;
import org.example.pojo.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    private UserService userService = new UserServiceImpl();

    @RequestMapping("/list")
    public List<User> list() throws Exception{

        //3.返回json
        List<User> list = userService.findAll();
        return list;

    }
}
Java
//UserDao.java
package org.example.Dao;

import java.util.List;

public interface UserDao {
    public List<String> findAll();
}
Java
//UserDaoImmpl.java
package org.example.Dao.Impl;

import cn.hutool.core.io.IoUtil;
import org.example.Dao.UserDao;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImpl implements UserDao {

    public List<String> findAll(){
        //1.加载并读取user.txt文件,获取用户数据
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");//读取文件
        ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());//读取用户数据
        return lines;//需要返回数据,供service层调用
    }

}
Java
//UserService.java
package org.example.Service;

import org.example.pojo.User;

import java.util.List;

public interface UserService {

    public List<User> findAll();

}
Java
//UserServiceImpl.java
package org.example.Service.Impl;

import org.example.Dao.Impl.UserDaoImpl;
import org.example.Dao.UserDao;
import org.example.Service.UserService;
import org.example.pojo.User;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

public class UserServiceImpl implements UserService{
    private UserDao userDao = new UserDaoImpl();
    @Override
    public List<User> findAll() {
        List<String> lines = userDao.findAll();

        //2.解析用户信息,封装为User对象
        List<User> list = 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);
        }).toList();

        return list;
    }
}
Java

IOC&DI入门

@Component:将该类交给IOC容器管理

@AutoWired:自动将该类型的bean复制给当前注解的成员变量

将Dao层,Service层(被依赖)交给IOC容器管理,为Controller层,Service层(依赖外界)提供依赖注入。

//UserController.java
@RestController
public class UserController {
    
    @Autowired
    private UserService userService;

    @RequestMapping("/list")
    public List<User> list() throws Exception{
        List<User> list = userService.findAll();
        return list;
    }
}
Java
//UserDaoImpl.java
@Component
public class UserDaoImpl implements UserDao {

    public List<String> findAll(){
        //1.加载并读取user.txt文件,获取用户数据
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");//读取文件
        ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());//读取用户数据
        return lines;//需要返回数据,供service层调用
    }
}
Java
//UserService.java
@Component
public class UserServiceImpl implements UserService{
    
    @Autowired
    private UserDao userDao;
    
    @Override
    public List<User> findAll() {
        List<String> lines = userDao.findAll();
        //2.解析用户信息,封装为User对象
        List<User> list = 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);
        }).toList();
        return list;
    }
}
Java

常用的为属性注入与构造器注入。