初识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
常用的为属性注入与构造器注入。