公司动态

Java——springboot web案例

📅 2026/7/16 9:24:01
Java——springboot web案例
一、spring boot初始化这些文件是借助 Spring Initializr 初始化项目时官方自动生成的脚手架配套内容用于适配 Maven、Git 版本管理等通用开发场景其中一部分是刚需文件一部分属于可选文件。一、文件夹类.mvn作用存放 Maven Wrapper 的配套配置。Maven Wrapper也就是下文的mvnw可以让项目自带一套 Maven 版本即便你的电脑本地没有安装 Maven、或者本地 Maven 版本不一致其他人拿到项目也能依靠项目内置的 Maven 完成构建规避本地环境差异引发的报错。删除建议可选删除。如果你本机已经配置好了适配的 Maven 环境日常只会使用本地 Maven 进行构建这个文件夹就可以删掉团队成员本地 Maven 环境参差不齐的话建议保留。src作用项目代码主目录是绝对不能删除的核心目录src/main/java存放 Java 业务代码、Controller、实体类等src/main/resources存放配置文件、静态资源src/test/java单元测试代码。二、Git 相关文件.gitattributes作用Git 的配置文件用来规范不同操作系统的换行符格式Windows、Mac 换行标准不一样避免跨系统提交代码出现大量无意义的换行改动也可以设置不同文件的差异化处理规则。删除建议可选删除。如果你的项目压根不打算使用 Git 做版本控制可以删掉后续要用 Git 管理代码就建议保留。.gitignore作用告诉 Git 哪些文件、文件夹不需要提交到代码仓库典型过滤对象.ideaIDEA 专属配置、编译产出 target 文件夹、本地配置、系统缓存文件等避免 IDE 个性化配置、编译垃圾文件上传远程仓库。删除建议推荐保留只有彻底不用 Git 的时候才删。三、文档文件HELP.md作用初始化自动生成的说明文档里面记录 Spring Boot 入门帮助、常用参考链接仅起到新手引导作用运行项目完全不会读取这个文件。删除建议可以放心删除绝大多数开发者建好项目之后就会删掉它日常开发不会用到。四、Maven Wrapper 脚本mvnwLinux/Mac 系统执行脚本、mvnw.cmdWindows 系统执行脚本作用二者是 Maven Wrapper 的启动脚本mvnw适配 macOS、Linuxmvnw.cmd适配 Windows 运行这两个脚本就会调用.mvn目录内置的 Maven 来打包、编译项目。删除建议跟随.mvn一同取舍本地自备 Maven 就可以一起删掉。五、最核心不可删文件pom.xml作用Maven 的核心配置文件所有 Maven 依赖、插件、项目构建规则全部写在这里之前配置的 web、lombok 等依赖都存放于此。删除建议严禁删除删掉之后 Maven 就失去了项目依赖管理的能力项目无法正常构建。二、代码讲解private Integer id;选用Integer而非int的原因1.先理清二者基础区别1int是 Java 的基本数据类型属于原生类型默认初始值固定是02Integer是int对应的包装类属于引用类型它可以赋值为null。2.业务场景下选择 Integer 的核心理由后端开发主流习惯可以表达「字段不存在 / 数据库值为空」的情况最关键数据库表里面的 id 字段允许设置NULL。如果使用int id数据库 id 为空时Java 强制把初始值填充成0你无法区分两种截然不同的业务情况① 用户真实 id 就是 0② 数据库压根没有填入 id空缺会产生数据歧义如果使用Integer id数据库为空时实体的 id 就接收null可以精准识别出字段是空的状态不会出现歧义。private LocalDateTime time;1. LocalDate只保存年月日例如2025-11-20不包含小时、分钟、秒这些时分秒细节。 适用场景生日、入职日期、下单日期只需要记录哪一天即可。2. LocalTime只保存时分秒例如14:32:50没有年、月、日信息。 适用场景门店早晚上下班时刻、每日固定打卡时点。3. LocalDateTime正是代码要选用的二者进行组合同时拥有年月日 时分秒形如2024-07-16 11:03:28和你 txt 文件里2024-07-16 11:03:28这种完整时间格式完美匹配。Data NoArgsConstructor AllArgsConstructor1. Data综合型注解日常最常用它相当于批量一次性整合了好几类常用代码自动生成所有成员字段的getter、setter方法重写toString()打印实体对象时能够输出所有字段的取值调试查看数据很便捷重写equals()与hashCode()方便完成两个实体对象之间的相等判断还会生成字段对应的 canGet/canSet 布尔方法适配部分框架。适用场景绝大多数普通实体类比如你正在编写的 User 实体打上这一个注解就省去手写一大堆 get、set、toString 代码的工作量。2. NoArgsConstructor生成无参构造方法作用自动创建没有任何入参的构造函数public User(){}刚需原因大量框架强制实体配备无参构造 ① MyBatis 从数据库查询封装实体、Spring 做反射实例化对象时底层默认调用无参构造 ② JSON 序列化 / 反序列化Jackson 等工具解析前端 JSON 数据转为 Java 实体同样离不开无参构造 如果只写了全参构造默认的无参构造会被 Java 自动抹除运行阶段就容易抛出实例化报错。3. AllArgsConstructor生成全参构造方法作用自动创建包含实体全部成员属性的构造方法可以一次性传入所有字段完成对象初始化 示例你的 User 实体拥有 id、username、password、name、age、updateTime 一共 6 个字段注解就自动生成接收这 6 个参数的构造器写代码时可以直接new User(参数1,参数2……)快速完成对象创建适配你之前读取 txt、批量 new User 封装数据的写法。RestControllerRestController详细讲解1. 本质来源RestController是 Spring MVC 提供的复合注解等价于Controller ResponseBody两个注解合并的效果后端 Web 开发日常高频使用。2. 拆分两层理解作用1具备Controller的能力把类注册成控制器Spring 扫描该注解之后会将这个类纳入 Spring 容器进行管理专门用来接收前端发来的 HTTP 请求类内部可以编写各类接口方法也就是 Controller 层承接浏览器、前端页面、Postman 发出的请求。2具备ResponseBody的能力返回 JSON 格式数据这是它和普通Controller最关键的区别单用Controller的时候方法返回字符串会被 Spring 当成网页视图名称会尝试跳转对应的 html 页面叠加了ResponseBody之后方法返回的对象、集合会自动借助 Jackson 序列化为JSON 字符串直接把 JSON 响应给到前端不会进行页面跳转前后端分离开发基本都需要这种效果。RestController public class UserController { RequestMapping(/list) public Listuser list() throws Exception{ //1.加载并读取user.txt文件获取用户数据 InputStream in this.getClass().getClassLoader().getResourceAsStream(user.txt); ArrayListString lines IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList()); //2.遍历lines集合解析用户信息封装为user对象 - list集合 Listuser 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 updataTime LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)); return new user(id,username,password,name,age,updataTime); }).toList(); //3.返回json格式数据 return userList; } }浏览器访问http://localhost:8080/list程序读取resources/user.txt文本文件把文件里每一行用户文字转成user实体对象打包成列表返回给前端网页展示。第 1 行RestController这是 SpringBoot 的注解相当于给这个类贴标签。作用告诉 Spring这个类是接口控制器专门用来接收浏览器的网络请求Rest代表方法返回集合 / 对象时自动转换成 JSON 字符串给前端不用我们手动转字符串。对比基础语法注解是框架专属标记没有对应的基础 Java 语法记住固定作用即可。第 2 行public class UserController {public公共访问权限Spring 框架能随便调用这个类class UserController我们新建的类专门放用户相关接口代码{}类的代码范围所有写接口的代码都放这里面。第 3 行RequestMapping(/list)又是注解绑定网址/list和下面这个list()方法大白话只要浏览器地址末尾是/listSpring 就自动执行下面的 list 函数。第 4 行public Listuser list() throws Exception{拆成 5 小块全是你学过的基础语法public公共方法Spring 能调用Listuser方法返回值类型代表最后要返回一个装着 user 对象的动态数组集合就是你学的 ArrayList 父接口长度自动变长list()方法名字空括号 调用这个方法不用传任何参数throws Exception抛出所有异常读取文件、转数字、解析日期都可能出错文件找不到、文字转数字失败、日期格式不对初学简化写法告诉系统 “所有出错我暂时不写 if 判断捕获出错直接交给服务器处理”不用写一堆 try-catch{}方法内部代码全部写在大括号里。第 5 行InputStream in this.getClass().getClassLoader().getResourceAsStream(user.txt);分步拆开比喻讲解InputStream inInputStreamJava 自带字节读取管道相当于一根吸管用来吸文件里的文字in自定义变量名后面代码用in代表这根吸管。this代表当前UserController这个类运行出来的对象.getClass()拿到当前类的底层信息类对象.getClassLoader()类加载器专门负责找到项目里resources文件夹下的文件.getResourceAsStream(user.txt)参数是文件名加载器找到这个 txt 文件打开 “吸管” 读取文件返回 InputStream 吸管对象赋值把打开文件后的吸管存到变量in里后面读文件全靠这个变量。第 6 行ArrayListString lines IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList());逐段拆解用基础循环类比ArrayListString linesArrayList你学过的动态数组集合String约束集合里只能存字符串lines变量名用来存 txt 里每一行文字一行就是一个 String。IoUtil.readLines(参数1,参数2,参数3)IoUtil 是 Hutool 工具类别人提前写好的工具方法底层本质就是你熟悉的while循环一行一行读文件帮你省去几十行重复代码 参数 1in我们刚才打开的文件吸管告诉工具读哪个文件 参数 2StandardCharsets.UTF_8读取编码防止中文乱码 参数 3new ArrayList()新建一个空集合工具读完所有行后自动把每行文字放进这个集合赋值装满所有行文字的集合存入变量lines。第 7 行Listuser userList lines.stream().map(line - { ... }).toList();逐段拆解原代码每一部分Listuser userList定义集合专门存放组装好的 user 对象lines.stream()把集合 lines 转换成 “流”只是 Java 简化循环的写法作用 开启循环遍历 lines 里每一个字符串.map(参数)翻译遍历循环里对每一行 line 做统一转换把字符串一行转换成 user 对象line - { ... }Lambda 表达式相当于 for 循环里的循环体line循环里临时变量代表当前遍历到的单行文字和 for (String line : lines) 里的 line 完全一样{}转换逻辑里面全是你能看懂的数组、类型转换语法.toList()循环全部结束后把所有转换好的 user 收集成一个新 List 集合赋值给左边userList。大括号内部循环体逐行讲解①String[] parts line.split(,);③String username parts[1];直接取出数组下标 1 的字符串存用户名基础数组取值。④String password parts[2];数组下标 2取密码字符串。⑤String name parts[3];数组下标 3取真实姓名。⑥Integer age Integer.parseInt(parts[4]);数组下标 4 的文字是20转成数字年龄。split(,)字符串分割方法按逗号,把一行文字切成字符串数组举例一行文字1,zhangsan,123,张三,20,2024-07-15 15:05:45分割后数组partsparts[0] 1 parts[1] zhangsan parts[2] 123 parts[3] 张三 parts[4] 20 parts[5] 2024-07-15 15:05:45String[] parts字符串数组你基础语法学过的数组。②Integer id Integer.parseInt(parts[0]);parts[0]是字符串1不能直接存进数字变量Integer.parseInt()把数字字符串转换成整数基础类型转换语法Integer id数字变量存用户编号。⑦LocalDateTime updataTime LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss));parts[5]数组最后一位是日期字符串2024-07-15 15:05:45DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss)定义日期格式模板告诉程序文字的年月日时分秒怎么排列yyyy4 位年份、MM两位月份、dd日期、HH24 小时制小时、mm分钟、ss秒LocalDateTime.parse(文字,模板)按照模板把日期字符串转成 Java 日期对象专门存时间LocalDateTime updataTime日期变量存放解析完成的时间。⑧return new user(id,username,password,name,age,updataTime);new user(参数)创建 user 实体类对象把刚才拆分好的 id、用户名、密码、姓名、年龄、时间全部传入return把新建好的 user 对象返回给 map 流存入最终集合 userList 对应 for 循环里userList.add(u);这一步。倒数第二行return userList;方法结束把装满 user 对象的集合返回出去因为类上加了RestControllerSpring 自动把这个集合转换成 JSON 文本浏览器就能拿到表格数据渲染页面。