ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java后端Web入门:从环境搭建到Spring Boot接口实战

Java后端Web入门:从环境搭建到Spring Boot接口实战 很多自学Java的朋友逃不过一个瓶颈JavaSE语法刷完了集合、多线程、IO流都见过一遍但打开招聘网站看“Java后端工程师”的要求还是不知道从哪下手。缺的就是Web开发这一环。所谓“Java后端学习中的web入门”核心就是把“写代码”和“跑在服务器上被浏览器访问”这件事串起来。这篇内容就是给卡在这个阶段的人准备的会带你理解Web后端到底干什么然后从环境搭建、Servlet、Spring Boot、接口设计、数据库接入一路做到一个能跑起来的小项目全程都是我自己带新人时反复强调的核心逻辑。1. 先想清楚Web后端入门到底在学什么很多教程上来就让你创建Spring Boot项目然后对着代码一顿抄抄完了还是不知道自己做了什么。所以我习惯先讲清楚Web开发的整体图景再动手写代码。1.1 从一次浏览器访问看Web全貌你在浏览器地址栏输入一个网址回车页面出来。这个过程中浏览器是“前端”负责展示页面而在某个机房的一台服务器上有一个程序在接收你的请求、查数据库、拼数据然后把结果返回给浏览器这个程序就是“后端”。后端入门要掌握的第一件事就是理解这个“请求-处理-响应”模型。你把那次回车拆开看里面至少有四层东西HTTP协议浏览器和后端之间对话的语言规定了请求方法GET、POST等、状态码200、404、500等、请求头和请求体。Web服务器比如Tomcat负责监听端口默认8080把HTTP请求接收下来转给你写的Java代码去处理。业务代码你写的Java程序接收参数、调用方法、查数据库、组装返回数据。数据库数据真正存放的地方后端从里面读取、写入数据。这四层里HTTP协议是基本功Tomcat是容器业务代码是你要花最多时间练习的部分数据库是后端绕不开的底座。四者合在一起就是一个Web应用的完整闭环。1.2 后端的三大职责接收、处理、响应很多新人学后端时喜欢一上来就研究框架源码其实没必要。后端代码最核心的职责就三件事接收从HTTP请求里取出参数。参数可能放在URL上query string、路径里path variable、请求体里body、请求头里header。处理调用业务逻辑判断条件组装数据。这一步是变化最多的也是面试里最常考的部分——事务、权限、状态机、异常处理都发生在这里。响应把处理结果返回给前端。以前是返回一个HTML页面现在是返回JSON字符串由前端JS去解析渲染。能把这三件事做明白Web入门就过关了。剩下的各种框架、工具本质都是在帮你把这三个环节变得更高效、更规范、更不容易出错。1.3 为什么选择Java作为后端入门语言网上关于“Java已死”的论调年年都有但现实是Java在大型企业级应用、金融系统、电商系统里仍然占据绝对主流。选择Java做后端入门有三个实打实的理由生态成熟Spring Boot、MyBatis、Netty这些框架把大部分脏活累活都封装好了你只需要关注业务本身。工程化程度高Maven/Gradle管理依赖IDE提示完善代码可读性和维护性都好。对于刚入行的人来说这套体系能帮你建立正确的工程习惯。岗位需求大后端开发岗位里Java的需求量和稳定性依然是第一梯队。学完这条路后面可以往微服务、大数据、中间件开发等方向走。语言没有绝对好坏但Java是一条足够宽、足够稳的路。至少对新手来说它能帮你把Web开发的通用逻辑学扎实这套逻辑学到任何语言里都通用。2. 环境准备先把JDK、IDE、Maven三件套搞定Web入门最劝退的地方往往不是代码本身而是环境配置。我给新人的建议是环境装一次踩过的坑记下来后面就顺畅了。2.1 JDK版本选择与安装细节JDK是Java运行的基础。版本选择上我的建议很直接直接装JDK 17或者JDK 21别再用Java 8了。很多人公司项目还在用Java 8是因为历史包袱。但作为学习者新版本有更好的性能和更友好的语法。而且Spring Boot 3.x要求JDK 17起步你学完直接用新版本不会遇到版本不兼容的坑。安装时有几个细节要注意下载地址去Oracle官网或者AdoptiumOpenJDK发行版下载不要随便在第三方网站下。安装路径不要带空格和中文比如C:\Java\jdk-17这种。后面配置环境变量时路径里如果有空格很可能出一些莫名其妙的问题。配置环境变量时JAVA_HOME指向JDK安装目录PATH里加上%JAVA_HOME%\bin。配完之后在命令行执行java -version能正常输出版本号就说明装好了。2.2 IDE选择IntelliJ IDEA的正确用法IDE我只推荐IntelliJ IDEA社区版对学习完全够用。Eclipse不是不行但IDEA的提示、重构、快捷键会让你的学习效率高很多。新人在IDEA里最容易忽略的几个功能自动导入依赖写代码时类名标红按AltEnter可以自动导入。Live Templates输入psvm自动生成main方法输入fori自动生成for循环。这一类快捷键能省很多时间。版本控制集成内置Git操作面板不用切到命令行。Database面板可以直接连接MySQL浏览表结构和数据写SQL也比命令行直观。我见过很多人装完IDEA还跟用记事本一样一个字母一个字母敲代码。花半小时把常用的快捷键过一遍效率能翻一倍。2.3 Maven依赖管理与国内镜像配置Maven是Java项目的依赖管理和构建工具。你写代码时引用的那些第三方库——Spring、MyBatis、JSON解析库——都是靠Maven自动下载的。Maven的核心是一个pom.xml文件里面声明了项目需要的依赖。比如你想要Spring Boot就在pom.xml里加一段依赖坐标Maven会自动下载相关jar包。新手用Maven最痛苦的问题是下载慢。默认中央仓库在国外国内网络经常卡到怀疑人生。解决办法是修改Maven的settings.xml配置阿里云镜像。具体操作是在mirrors节点里加一段mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror配好之后依赖下载速度会有质的提升。这个配置一定要学会后面每台新电脑都要配一次。2.4 用Spring Initializr创建第一个项目环境配置好之后创建项目最快的方式是Spring Initializr。IDEA社区版里自带这个入口File - New - Project - Spring Initializr。创建时需要关注几个选项语言Java构建工具MavenSpring Boot版本选最新的稳定版3.x依赖组件刚开始只需要加Spring Web。后面用到数据库时再加MySQL Driver、MyBatis Framework等。项目生成之后你会看到标准结构src/main/java里放Java代码src/main/resources里放配置文件和静态资源pom.xml在根目录管理依赖。此时你直接运行启动类带SpringBootApplication注解的类控制台出现Tomcat started on port 8080然后在浏览器访问http://localhost:8080虽然暂时是报错页面但你的第一个Web应用已经在运行了。3. 从Servlet看Web应用的底层运行逻辑现在很多人学Spring Boot跳过了Servlet结果遇到问题不知道从哪里排查。Servlet是Java Web的底层规范Spring Boot的Web模块底层还是基于Servlet实现的。花时间搞懂Servlet会让你对整个Web运行机制有清晰的认识。3.1 Tomcat与Servlet的关系Tomcat是一个Servlet容器它实现了Java EE的Servlet规范。你可以把它理解成一个中转站Tomcat负责监听端口接收浏览器发来的HTTP请求。它把请求信息封装成一个HttpServletRequest对象里面包含了请求方法、URL、参数、请求头等所有信息。然后Tomcat根据请求的URL找到对应的Servlet类调用它的service()方法把请求对象和响应对象传进去。你的Servlet代码处理完业务后往HttpServletResponse对象里写入返回内容Tomcat再把内容打包成HTTP响应返回给浏览器。所以Servlet就是你写的处理业务的Java类Tomcat是负责调度它的容器。两者的关系用一句话概括Tomcat管网络Servlet管业务。3.2 手写一个Servlet处理第一个请求自己动手写一个Servlet能直观感受这个流程。创建一个类继承HttpServlet重写doGet方法import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class HelloServlet extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType(text/plain;charsetutf-8); resp.getWriter().write(Hello, 这是我写的第一个Servlet!); } }然后需要在web.xml里注册这个Servlet配置它对应的URL路径servlet servlet-namehello/servlet-name servlet-classcom.example.HelloServlet/servlet-class /servlet servlet-mapping servlet-namehello/servlet-name url-pattern/hello/url-pattern /servlet-mapping把项目部署到Tomcat的webapps目录下启动Tomcat访问http://localhost:8080/项目名/hello你就能在浏览器里看到刚才写的那段文字。这个过程虽然原始但它把Web运行的本质演示得很清楚URL和代码是怎么关联的请求是怎么进到Java方法里的返回值是怎么出去的。Spring Boot把这些细节自动处理了但底层逻辑没有变。3.3 请求转发与重定向的区别做Web开发一定会遇到页面跳转的需求。Servlet里有两个容易混淆的跳转方式forward请求转发和sendRedirect重定向。请求转发是服务器内部跳转。浏览器只发了一次请求服务器在内部把请求转给另一个资源浏览器地址栏的URL不会变。重定向是服务器告诉浏览器“你去另一个地址”浏览器会再发一次新请求地址栏会变成新的URL。举个例子你提交表单之后如果校验失败需要回到表单页重新填写用请求转发可以保留本次请求的参数。但如果是登录成功要跳到首页用重定向更合适因为防止用户刷新页面时重复提交表单。这个知识点面试经常考实际开发里也经常遇到。学习Servlet阶段最好自己写两个例子验证一下印象会深刻得多。3.4 Servlet时代的局限性Servlet本身的代码写起来很繁琐每写一个接口就要建一个类、配一个映射而且返回页面内容时需要手动拼接HTML字符串代码非常难维护。后来出现了JSP用类似HTML的语法写动态页面内部会被翻译成Servlet代码但本质上也是拼接字符串。再后来业务逻辑和页面展示的耦合问题越来越突出才有了MVC模式、各种框架的涌现。学Servlet不是为了让你回到老式开发方式而是为了让你理解那些框架究竟帮你做了什么Spring MVC里的RequestMapping注解本质就是在帮你做ServletMapping的配置ResponseBody注解本质就是在帮你设置响应类型并直接写返回体。理解了这一层你再看Spring Boot的代码就不会觉得那是魔法了。4. Spring Boot核心三件事请求、数据、分层Spring Boot是目前Java后端开发的绝对主流。它的核心价值不是发明了新东西而是把以前繁琐的配置自动化了。你不需要理解全部原理但必须掌握它的三个核心用法控制器接请求、服务层写业务、持久层操作数据库。4.1 为什么Spring Boot能简化开发在Spring Boot之前用SSM框架Spring SpringMVC MyBatis搭一个项目需要配置一堆XML文件数据源配置、事务配置、组件扫描配置……每换一个环境配置就是一次灾难。Spring Boot通过“约定大于配置”来解决这个问题。它内置了一个默认的Tomcat提供了自动配置机制。你引入spring-boot-starter-web依赖它就会自动配置好Spring MVC和Tomcat你引入数据库相关starter它就会根据application.properties里的连接信息自动配置数据源。开发体验也简化了启动直接运行main方法不用单独部署war包到外部Tomcat项目打包默认是jar包用java -jar就能跑起来。这背后还有一套依赖版本管理机制确保你引入的各个组件版本互相兼容。4.2 Controller层把请求接住Spring Boot项目里Controller是Web请求的第一站。一个最简单的接口长这样RestController RequestMapping(/api/user) public class UserController { GetMapping(/{id}) public ResultUser getUser(PathVariable Long id) { // 业务逻辑 return Result.success(userService.getById(id)); } }这里面几个注解是高频使用的RestController把当前类标记为控制器并且每个方法默认返回JSON不需要再手动写ResponseBody。RequestMapping映射URL路径到类或方法上。GetMapping/PostMapping/PutMapping/DeleteMapping分别对应GET、POST、PUT、DELETE请求方法。PathVariable从URL路径中取值。比如请求/api/user/1这里就拿到1。RequestParam从URL查询参数中取值比如/api/user?page1。RequestBody从请求体中获取JSON并自动反序列化为Java对象。新手最容易搞混的是PathVariable和RequestParam。简单记路径里的值用PathVariable问号后面的参数用RequestParam。4.3 Service层把业务装起来Controller直接写业务逻辑代码多了就会变成一坨“面条代码”。所以引入Service层把业务逻辑独立出来。Service层的作用有两层复用同一个业务可能被多个接口调用把逻辑放Service里Controller只做参数接收和结果返回。事务管理一个业务操作往往涉及多次数据修改要么全部成功要么全部失败。Spring的Transactional注解标注在Service方法上发生异常时自动回滚事务。实际开发中Service接口和实现类的拆分也很常见。示例结构public interface UserService { User getById(Long id); void createUser(UserCreateRequest request); } Service public class UserServiceImpl implements UserService { Autowired private UserMapper userMapper; Override public User getById(Long id) { return userMapper.selectById(id); } }分层不是强制要求但它是工程化的基础。哪怕你写个人项目也建议从第一天就保持Controller-Service-Mapper三层结构。等以后接触微服务架构你会发现这个分层思维贯穿整个后端体系。4.4 连接MySQLMapper层与MyBatis-Plus数据库操作是后端开发的核心技能。Java生态里最常用的方案是MyBatis而MyBatis-Plus是在MyBatis基础上封装的增强工具写简单的增删改查几乎不需要写SQL。先在pom.xml里加依赖dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.5/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId /dependency然后在application.properties里配置数据源spring.datasource.urljdbc:mysql://localhost:3306/web_demo?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password你的密码 spring.datasource.driver-class-namecom.mysql.cj.jdbc.DriverMapper接口继承MyBatis-Plus的BaseMapper就能直接获得单表的增删改查方法Mapper public interface UserMapper extends BaseMapperUser { }User实体类对应数据库的user表Data TableName(user) public class User { TableId(type IdType.AUTO) private Long id; private String name; private Integer age; private String email; }用起来很简单getById、insert、deleteById这些都是现成方法。复杂一点的查询再手写SQL用Select注解标注在Mapper方法上即可。5. 前后端分离与API接口设计现在的Web开发绝大多数项目都是前后端分离模式。后端不再生成页面只提供JSON数据接口前端用Vue、React这类框架渲染页面。这对后端开发提出了一些新要求入门前必须把概念理清。5.1 前后端分离到底是什么意思传统开发模式下页面是后端渲染的JSP、Thymeleaf这些模板技术在服务端把HTML拼好再发给浏览器。前后端分离之后后端只做数据接口前端拿到JSON自己渲染页面两者通过HTTP API通信。打个比方传统模式像餐厅配菜师傅直接帮你把菜夹到盘里端上来就能吃前后端分离像你点菜后厨只管把对应的菜做好端到出餐口你自己端到座位上甚至还可以让外卖员前端框架帮你送。对后端工程师来说关注点就变成了接口设计得是否合理参数和返回值是否清晰。数据格式是否统一前端好不好解析。接口的安全性、鉴权、限流怎么做。你不需要深入学习前端框架但至少要理解前端调用接口的方式这样调试起来才不抓瞎。5.2 RESTful接口的规范与统一返回结果RESTful是目前最主流的API设计风格。它利用HTTP协议本身的语义来设计接口GET /api/users获取用户列表GET /api/users/1获取ID为1的用户POST /api/users新增用户PUT /api/users/1更新ID为1的用户DELETE /api/users/1删除ID为1的用户资源用名词表示操作通过HTTP方法表达。这样设计出来的接口清晰、可预测前端和移动端都能很好地对接。接口的返回结果建议统一封装。不要有的接口直接返回对象有的返回List有的返回boolean这样前端处理时非常痛苦。用一个Result类统一包装Data public class ResultT { private Integer code; // 业务状态码200表示成功 private String message; // 提示信息 private T data; // 具体数据 public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(操作成功); result.setData(data); return result; } public static T ResultT error(String message) { ResultT result new Result(); result.setCode(500); result.setMessage(message); return result; } }统一的返回结构加上一套统一的异常处理机制是后端接口工程化的基本要求。5.3 跨域问题为什么前端调不通你的接口前后端分离以后前端项目跑在http://localhost:5173后端接口在http://localhost:8080。端口不同就触发了浏览器的同源策略前端发的请求会被浏览器拦截控制台报错。这就是跨域问题。跨域的解决方案有很多开发阶段最常用的是在后端开启CORS。Spring Boot里可以写一个配置类Configuration public class CorsConfig { Bean public CorsFilter corsFilter() { CorsConfiguration config new CorsConfiguration(); config.addAllowedOriginPattern(*); // 允许所有来源 config.addAllowedHeader(*); config.addAllowedMethod(*); config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration(/**, config); return new CorsFilter(source); } }注意生产环境不要用*放开所有来源应该指定前端域名的白名单。另外我见过很多新手把跨域报错当成“后端接口有问题”其实后端接口用Postman测是通的只是浏览器拦截了响应。区分这一点能节省大量排错时间。5.4 用Postman调试接口的正确姿势写完接口要先自己测试才能交给前端联调。Postman是最常用的接口调试工具。基础用法不复杂选择请求方法GET、POST等填写URL在Headers里设置Content-Type: application/json在Body里填JSON数据点击发送查看响应。有几个进阶技巧值得养成习惯使用环境变量管理baseUrl从开发环境切到测试环境不用逐个改URL。保存接口到集合Collection方便回归测试。写自动化测试脚本校验返回状态码和关键字段。用Mock Server模拟后端返回前端可以先并行开发。接口调试是后端基本功不要等到联调时才手忙脚乱。自己先测通的接口交出去才有底气。6. 入门实战一个待办事项后端从0到1理论学习再多不手写一遍等于零。这里我带你做一个小而完整的项目——待办事项Todo后端只包含一个实体的增删改查和列表分页。麻雀虽小五脏俱全能把这个做明白Web入门就真正落地了。6.1 需求与表结构设计需求非常简单支持新增待办事项、查看列表、修改状态、删除事项。数据库表设计CREATE TABLE todo_item ( id BIGINT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200) NOT NULL COMMENT 事项标题, status TINYINT NOT NULL DEFAULT 0 COMMENT 状态0-未完成1-已完成, created_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) COMMENT 待办事项表;这里只有4个字段。实际项目里的表不会这么简单但设计思路是一样的主键、业务字段、状态字段、时间字段。关于主键类型这个例子用自增ID方便理解。真实项目里分布式的场景常会使用雪花算法生成的Long型ID或者UUID。等学到分布式那一章你自然能体会到为什么。6.2 项目结构与DTO设计项目结构src/main/java/com/example/todo/ ├── TodoApplication.java // 启动类 ├── controller/ │ └── TodoController.java // 接口层 ├── service/ │ ├── TodoService.java // 接口 │ └── impl/ │ └── TodoServiceImpl.java // 实现类 ├── mapper/ │ └── TodoMapper.java // 数据库操作 ├── entity/ │ └── TodoItem.java // 数据库实体 └── dto/ ├── TodoCreateRequest.java // 新增请求参数 └── TodoUpdateRequest.java // 修改请求参数这里要强调一下DTOData Transfer Object的概念。很多新手直接把实体类当作接口参数这不是好习惯。实体类对应数据库表结构DTO对应前端传参格式两者经常不一样。比如创建事项时前端只需要传title但实体类里有id、status、createdTime等字段直接用实体类接收就会造成困惑。分离设计后暴露给外部的是稳定的接口契约内部表结构怎么变都不会影响前端。6.3 接口编码实现创建请求的DTOData public class TodoCreateRequest { NotBlank(message 事项标题不能为空) private String title; }Controller接口RestController RequestMapping(/api/todo) public class TodoController { Autowired private TodoService todoService; PostMapping public ResultLong create(RequestBody Valid TodoCreateRequest request) { return Result.success(todoService.create(request)); } GetMapping(/{id}) public ResultTodoItem getById(PathVariable Long id) { return Result.success(todoService.getById(id)); } PutMapping(/{id}/status) public ResultVoid updateStatus(PathVariable Long id, RequestParam Integer status) { todoService.updateStatus(id, status); return Result.success(null); } DeleteMapping(/{id}) public ResultVoid delete(PathVariable Long id) { todoService.delete(id); return Result.success(null); } }Service实现Service public class TodoServiceImpl implements TodoService { Autowired private TodoMapper todoMapper; Override public Long create(TodoCreateRequest request) { TodoItem item new TodoItem(); item.setTitle(request.getTitle()); item.setStatus(0); todoMapper.insert(item); return item.getId(); } Override public void updateStatus(Long id, Integer status) { TodoItem item new TodoItem(); item.setId(id); item.setStatus(status); todoMapper.updateById(item); } }注意updateStatus这里用一个对象去更新MyBatis-Plus默认只更新非null字段所以不会把其他字段覆盖成null。这个特性用起来方便但也容易踩坑如果你想要某一次把某个字段显示置为null默认策略下是做不到的需要额外配置FieldStrategy。入门阶段先记住这个特性即可。6.4 测试验证与常见问题启动项目后用Postman依次测试POSThttp://localhost:8080/api/todoBody里传{title: 学习Java Web}GEThttp://localhost:8080/api/todo/1PUThttp://localhost:8080/api/todo/1/status?status1DELETEhttp://localhost:8080/api/todo/1新手在这一步常见的问题我列一下数据库连不上检查MySQL是否启动账号密码是否正确url里的数据库名是否存在。控制台报Access denied for user就是账号密码错报Unknown database就是库不存在。接口返回404检查请求路径是否匹配Controller类上有没有RestController注解类有没有被Spring扫描到启动类所在包必须是最外层父包。接口返回500通常看控制台堆栈信息。最常见的两个没加Mapper注解导致Mapper注入失败SQL执行报错比如字段名和表结构对不上。JSON解析失败前端传的字段名和DTO里的属性名不一致或类型不匹配。确认Content-Type是application/json确认前端传的JSON格式正确。这个项目建议你亲手敲一遍不要复制粘贴。敲的过程中你会遇到各种小问题解决它们的经验比代码本身值钱得多。7. 新手必踩的坑和后面的成长路线我这些年带过不少新人发现有些坑几乎人人都会踩一遍。写在这里希望你能少走点弯路。7.1 我见过最多的几个入门错误第一个坑是不看控制台报错。很多新手接口500了第一反应是去代码里瞎找或者直接问人。正确做法是先看控制台的异常堆栈找到报错的那一行再顺着排查。80%的问题堆栈信息已经把原因写得明明白白了。第二个坑是分层不清晰逻辑全堆Controller里。刚开始写项目图省事直接在Controller里写数据库操作项目小还行项目一大就是灾难。哪怕学习阶段也一定要坚持Controller、Service、Mapper三层分离。第三个坑是不会看官方文档。遇到问题先百度搜索出来的全是过时回答或者错误答案。Spring Boot、MyBatis-Plus这些框架的官方文档写得非常清楚尤其是换版本升级的时候文档是你最可靠的信息来源。第四个坑是忽略异常处理。接口报错直接把异常栈抛给前端返回的是一大段看不懂的英文堆栈。正确的做法是定义全局异常处理器用RestControllerAdvice统一拦截异常把错误信息包装成统一的Result结构返回。7.2 学完这个阶段之后的路线图Web入门之后Java后端的路还很长我给你一个务实的学习顺序数据库进阶MySQL索引原理、事务隔离级别、SQL优化。缓存Redis基础数据类型、缓存穿透/击穿/雪崩的解决思路。消息队列Kafka或RabbitMQ的基本使用和应用场景。微服务Spring Cloud Alibaba体系Nacos注册中心、OpenFeign远程调用、Sentinel限流熔断。部署与运维Linux基础操作、Docker容器化、CI/CD流程把项目真正部署到服务器上。每学一个阶段都要找一个小项目练手。比如学完Redis就给Todo项目加一个缓存学完Docker就写个Dockerfile把项目打包成镜像。知识只有用起来才会变成你自己的。我在实际带人的过程中最深的感受是Web入门这件事难的不是任何一个单独的知识点而是如何把零散的知识串成一条线。环境、请求、接口、数据库听起来是四件事但在一个真实项目里它们是无缝衔接的整体。所以建议你把那个Todo项目完整做下来然后尝试给它加功能比如加上登录、加上分类、加上搜索。每加一个功能你就会多理解一层Web开发的协作方式。等到有一天你能独立把一个想法从数据库表设计变成可访问的接口Java后端这扇门就算真正为你打开了。
返回列表