简单的设计网站,域名租用平台,网络营销的六大功能,简述做个人网页的思路对于spring boot #xff0c;我只接触了一个学期#xff0c;没有太大的了解#xff0c;作为刚接触Java开发框架的新手#xff0c;在学Spring Boot前#xff0c;我对传统Spring项目的配置简直“谈虎色变”。记得第一次尝试搭建简单的Web项目#xff0c;光是查资料引入Spri…对于spring boot 我只接触了一个学期没有太大的了解作为刚接触Java开发框架的新手在学Spring Boot前我对传统Spring项目的配置简直“谈虎色变”。记得第一次尝试搭建简单的Web项目光是查资料引入Spring MVC、Tomcat的依赖就花了半天更别提还要写一长串XML配置来“装配Bean”——那些bean标签、命名空间看得我眼花缭乱好不容易写好配置启动时又因为Spring和依赖包版本不匹配报错盯着控制台的红色日志半天摸不着头脑。而这堂Spring Boot课程就像给迷茫的我递了一盏灯不仅让我快速搭起了能跑的项目更让我这个新手读懂了“约定优于配置”这种听起来很抽象的设计理念。课程里最让我惊喜的是Spring Boot的“起步依赖”。老师在IDEA里只加了一行spring-boot-starter-web依赖点击启动按钮项目就直接跑起来了——不用手动配Tomcat不用额外引JSON解析包甚至能直接写个接口在浏览器里访问。这场景让我想起前几天自己瞎折腾的经历为了让Spring项目能返回JSON数据我翻遍论坛才找到匹配的Jackson版本反复试了五六次才成功。而Spring Boot的起步依赖就像“打包好的工具箱”通过spring-boot-dependencies把常用依赖的版本都协调好了根本不用我们新手操心版本冲突终于能把精力放在“怎么写业务逻辑”上而不是“怎么把框架拼起来”。自动配置功能则让我觉得Spring Boot“特别聪明”。老师讲数据库连接的时候我本来做好了记一堆配置参数的准备结果发现只要在application.properties里写清楚数据库地址、账号密码项目就能直接连上数据库。老师说这是因为Spring Boot会自动装HikariCP连接池我追问背后的原因才知道是ConditionalOnClass这些注解在“干活”——只要项目里有数据库相关的类框架就自动触发配置要是我们没自己定义连接池它就用默认的。这对新手太友好了以前写传统Spring配置光是数据源的property标签就够我抄半天现在居然“填几个参数就搞定”。这让我明白“约定优于配置”不是不让我们配置而是帮新手把“该怎么配”的规矩定好了少走很多弯路。实践课上的小失误反倒让我对框架理解更深了。我照着老师的例子写了个接口前端同学说跨域访问不了我当时就慌了——明明代码和老师的一模一样怎么会出问题我甚至怀疑是不是Spring Boot有“bug”。后来老师提醒我“框架的自动配置是‘按约定来的’跨域这种特殊需求得自己加配置。”他教我用CrossOrigin注解或者在配置类里写CORS规则问题一下子就解决了。这件事让我清醒过来Spring Boot虽然“省心”但不是“万能”的。作为新手不能光会“拿来就用”还得知道它的“约定”是什么遇到超出约定的需求时才知道该怎么调整。就像老师说的“新手先会用再懂原理但不能一直只当‘调包侠’。”// 控制器类负责接收请求并返回数据 import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; // RestController Controller ResponseBody自动返回JSON格式数据 RestController public class HelloController { // GetMapping表示接收GET请求路径为/hello GetMapping(/hello) // RequestParam获取请求参数defaultValue设置默认值 public String sayHello(RequestParam(defaultValue Spring Boot新手) String name) { return 你好 name 这是我的第一个Spring Boot接口; } }课程最后讲的自定义Starter让我觉得Spring Boot“潜力好大”。老师说有电商公司把自己常用的日志、监控功能做成了自定义Starter新人建项目只要引个依赖这些功能就都有了新服务上线时间省了一大半。我当时就想“我这种新手也能做这个吗”跟着老师的步骤我试着把课上写的“接口日志打印”功能封装成了简单的Starter——写个自动配置类加上AutoConfiguration注解再打包成jar包。当我把这个jar包引入另一个项目不用任何配置接口调用时控制台就自动打印日志了那种成就感真的没法说。原来我不光能“用别人的框架”还能基于框架做自己的小工具这让我对继续学下去更有动力了。这堂Spring Boot课对我这个开发新手来说不止是学会了一个框架更像是帮我建立了“高效开发”的思维。以前我总觉得“写代码就是堆配置、抄代码”现在才知道好的框架会帮你把重复的工作都做了你只要专注于解决实际问题。接下来我打算先把课上的知识点吃透比如老师提到的ConfigurationProperties怎么用生产环境里连接池该怎么调参数这些“细节”对新手来说特别重要。然后我想做几个小项目练手比如写个简易的待办清单接口把学到的东西用起来之后再试着把项目里重复的功能也封装成Starter慢慢积累自己的“工具库”。对我来说Spring Boot的学习才刚刚起步。这堂课最大的收获是让我这个新手不再害怕框架知道了“跟着约定走复杂的事交给框架”。以后开发的时候我既要学会用框架的“约定”省力气也要在需要的时候敢去调整配置、扩展功能。我相信只要一步步来先会用、再懂原理总有一天能真正“驾驭”这个强大的框架而不是只做一个“会点鼠标的新手”。这一个学期学spring boot虽然学会的不多但是有多少收获的度过了一学期的学习过的还不错有挫折有难度但是我尽力完成了这个学习的课程。关键实现新手重点学习价值掌握MyBatis-Plus简化开发的核心技巧理解“实体类-服务层-控制器”的分层思想这是所有Spring Boot项目的基础架构。案例2简易个人博客进阶级·多表关联核心功能包含文章发布、分类管理、标签关联、文章列表分页查询支持按分类/标签筛选文章适合作为个人技术博客雏形。技术栈Spring Boot 2.7.x Spring Web MyBatis-Plus MySQL Thymeleaf前端模板无需单独写前端接口 PageHelper分页插件。学习价值掌握企业级权限控制基础理解事务管理的重要性适合作为课程设计或小型团队工具。学习价值理解多表关联查询逻辑掌握分页插件使用学会用Thymeleaf实现前后端简单结合也可扩展为前后端分离架构。案例3图书管理系统实用级·权限控制核心功能区分管理员和普通用户权限——管理员可进行图书CRUD、用户管理普通用户仅能查询图书、借阅/归还图书包含借阅记录查询。技术栈Spring Boot 2.7.x Spring Web Spring Security权限控制 MyBatis-Plus MySQL Bootstrap。关键实现新手重点学习价值理解多表关联查询逻辑掌握分页插件使用学会用Thymeleaf实现前后端简单结合也可扩展为前后端分离架构。学习价值贴合新手成长的真实收获 1. 突破“单表局限”这是我第一次接触多表关联从“一对多”到“多对多”的实现让我明白“中间表”“外键”不是课本上的抽象概念而是解决实际问题的工具——就像我给Spring Boot笔记贴“自动配置”“起步依赖”标签用标签筛选文章时瞬间懂了多对多的意义 2. 建立“分层思维”写服务层时我刻意把“查文章”“关联分类”“分页”拆成不同方法不再像刚学的时候把所有代码堆在控制器里这种“控制器接请求、服务层做逻辑”的分层和老师说的“企业开发规范”完全对应以后写简历也有东西可写 3. 收获“实用成果”这个博客我现在每天都用——把课堂上的代码案例、配置技巧写成文章按分类归档期末复习时直接按“Spring Boot配置”“MyBatis-Plus用法”筛选比翻笔记快10倍更意外的是我把这个项目放到GitHub上面试时HR特意问了这个案例说“比空泛的‘掌握Spring Boot’更有说服力” 4. 降低“技术畏难情绪”一开始看到“多表关联”“分页”就怕了拆成小步骤后发现核心还是之前学的“CRUD简单循环”这种“大问题拆小解决”的思路不仅适用于编程我后来写课程报告时也用这个方法效率特别高。 对新手来说这个案例最大的价值不是“做出一个博客”而是让我们明白Spring Boot的进阶知识不用“一步到位”只要跟着“基础功能→核心难点→实用优化”的节奏走再复杂的需求也能啃下来。核心功能包含文章发布、分类管理、标签关联、文章列表分页查询支持按分类/标签筛选文章适合作为个人技术博客雏形。技术栈Spring Boot 2.7.x Spring Web MyBatis-Plus MySQL Thymeleaf前端模板无需单独写前端接口 PageHelper分页插件。关键实现新手重点依赖管理省心起步依赖如spring-boot-starter-web已打包协调好常用组件版本避免新手手动引依赖的版本冲突问题像 “现成工具箱” 直接用。配置极度简化“约定优于配置” 减少冗余操作如数据库连接仅需在配置文件填地址 / 账号 / 密码框架自动装配连接池无需传统 Spring 的繁琐 XML 配置。上手快速高效内嵌 Tomcat 等容器项目引入依赖后可直接启动新手无需纠结环境搭建能快速聚焦业务逻辑开发。灵活且易扩展基础需求 “零配置” 满足特殊场景如跨域可通过简单注解 / 配置扩展还支持自定义 Starter 封装通用功能适配不同需求。 对我来说Spring Boot的学习才刚刚起步。这堂课最大的收获是让我这个新手不再害怕框架知道了“跟着约定走复杂的事交给框架”。以后开发的时候我既要学会用框架的“约定”省力气也要在需要的时候敢去调整配置、扩展功能。我相信只要一步步来先会用、再懂原理总有一天能真正“驾驭”这个强大的框架而不是只做一个“会点鼠标的新手”。更意外的是Spring Boot不仅帮我掌握了一项技术还悄悄改变了我的生活节奏和思维方式。作为初学编程的学生以前总因为搭环境、调配置占用大量时间常常熬夜赶作业现在用Spring Boot能快速完成项目demo不仅作息变规律了还能腾出时间学前端知识形成“Java前端”的技能搭配。这种“高效解决问题”的体验也让我在生活中养成了“找方法、省力气”的习惯——比如整理笔记时会像Spring Boot的“约定”一样先定好固定格式后续补充内容就不用反复纠结排版做事效率明显提高。在职业规划上Spring Boot更给了我明确的方向。现在很多企业招聘都把Spring Boot作为基础要求我用课程里学的知识做了个简易的个人博客接口放在简历里后居然收到了小企业的实习面试邀请。对新手来说这种“学完就能用、能用就有反馈”的正向激励太重要了它让我不再迷茫“学编程到底有没有用”也让我明白掌握高效工具能让自己在职业起步阶段就站稳脚跟。甚至在帮同学解决编程问题时我能用Spring Boot快速写出示例代码这种“被需要”的感觉也让我更有学习动力。RestController public class CrossOriginController { // CrossOrigin允许跨域访问origins指定前端地址 CrossOrigin(origins http://127.0.0.1:5500) // 本地前端文件打开的地址 GetMapping(/user) public String getUserInfo() { return {username:小明,age:20}; // 模拟返回用户数据 } }import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; // Configuration表示这是配置类Spring Boot会自动识别 Configuration public class GlobalCorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) // 对所有接口生效 .allowedOrigins(http://127.0.0.1:5500) // 允许的前端地址 .allowedMethods(GET, POST) // 允许的请求方式 .allowCredentials(true) // 允许携带Cookie .maxAge(3600); // 跨域配置有效期秒 } }二、代码使用说明1. 上述代码均无需额外配置XML只需在application.properties中添加基础配置如端口server.port80802. 新手可直接在IDEA中创建“Spring Boot Initializr”项目勾选“Spring Web”依赖将代码复制到对应包下即可启动3. 若需连接数据库仅需在配置文件添加spring.datasource.urljdbc:mysql://localhost:3306/test、spring.datasource.usernameroot、spring.datasource.password123456无需手动配置数// 控制器类负责接收请求并返回数据 import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; // RestController Controller ResponseBody自动返回JSON格式数据 RestController public class HelloController { // GetMapping表示接收GET请求路径为/hello GetMapping(/hello) // RequestParam获取请求参数defaultValue设置默认值 public String sayHello(RequestParam(defaultValue Spring Boot新手) String name) { return 你好 name 这是我的第一个Spring Boot接口; } }import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.time.LocalDateTime; // 日志拦截器拦截接口请求并打印日志 public class LogInterceptor implements HandlerInterceptor { // 接口调用前执行 Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod (HandlerMethod) handler; // 获取接口路径和方法名 String url request.getRequestURI(); String methodName handlerMethod.getMethod().getName(); // 打印日志 System.out.println(LocalDateTime.now() - 接口被调用 url 方法名 methodName); } return true; // 允许接口继续执行 } }关键实现新手重点依赖引入除spring-boot-starter-web外新增MyBatis-Plus起步依赖无需手动写基础CRUD SQLmybatis-plus-boot-starter、mysql-connector-java。核心代码 ① 实体类与数据库表映射import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import lombok.Data;Data // Lombok注解自动生成getter/setter减少代码public class Todo {TableId(type IdType.AUTO) // 主键自增private Long id;private String content; // 待办内容private Integer status; // 状态0未完成1已完成private LocalDateTime createTime; // 创建时间}② 控制器接口层类似前文HelloControllerRestControllerRequestMapping(/todo)public class TodoController {Autowiredprivate TodoService todoService;// 添加待办PostMappingpublic String addTodo(RequestBody Todo todo) {todo.setCreateTime(LocalDateTime.now());todo.setStatus(0);todoService.save(todo); // MyBatis-Plus自带save方法return 添加成功;}// 按状态查询0未完成1已完成GetMapping(/status/{status})public ListTodo getTodoByStatus(PathVariable Integer status) {return todoService.lambdaQuery().eq(Todo::getStatus, status).list(); // 链式查询无需写SQL} }案例2简易个人博客进阶级·多表关联核心功能包含文章发布、分类管理、标签关联、文章列表分页查询支持按分类/标签筛选文章适合作为个人技术博客雏形。技术栈Spring Boot 2.7.x Spring Web MyBatis-Plus MySQL Thymeleaf前端模板无需单独写前端接口 PageHelper分页插件。关键实现新手重点多表设计核心表3张文章表article、分类表category、标签表tag通过article_category、article_tag中间表实现多对多关联。分页查询实现引入PageHelper依赖后仅需一行代码开启分页// 服务层代码查询第1页每页10条数据public PageInfoArticle getArticlePage(Integer pageNum) {PageHelper.startPage(pageNum, 10); // 分页核心代码ListArticle articleList articleMapper.selectAll();#xA; return new PageInfo(articleList); // 封装分页结果}跨域支持若后续对接独立前端如Vue直接复用前文的GlobalCorsConfig配置类即可解决跨域问题。权限配置核心通过Spring Security配置类实现角色区分无需手动判断权限Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers(/admin/**).hasRole(ADMIN) // 管理员接口仅ADMIN角色可访问.antMatchers(/book/**).hasAnyRole(ADMIN, USER) // 图书接口两种角色均可访问.anyRequest().authenticated() // 其他请求需登录.and().formLogin(); // 启用默认登录页}}借阅业务逻辑核心判断“图书是否已被借出”通过事务注解Transactional保证操作原子性借阅时同时修改图书状态和新增借阅记录Servicepublic class BorrowService {Autowiredprivate BookMapper bookMapper;Autowiredprivate BorrowRecordMapper borrowRecordMapper;Transactional // 事务注解确保两步操作同时成功或失败public String borrowBook(Long bookId, Long userId) {Book book bookMapper.selectById(bookId);if (book.getStatus() 1) { // 1表示已借出return 该图书已被借出;}// 1. 修改图书状态为已借出book.setStatus(1);bookMapper.updateById(book);// 2. 新增借阅记录BorrowRecord record new BorrowRecord();record.setBookId(bookId);record.setUserId(userId);record.setBorrowTime(LocalDateTime.now());borrowRecordMapper.insert(record);return 借阅成功;} }DataTableName(article) // 明确对应数据库表名新手别漏写public class Article {TableId(type IdType.AUTO)private Long id;private String title;private String content;TableField(category_id) // 对应数据库的categoryId字段避免大小写问题private Long categoryId;// 关联分类信息MyBatis-Plus会自动封装TableField(exist false) // 表示数据库表中没有这个字段仅用于前端展示private Category category;private LocalDateTime createTime;}③ 核心接口实现和之前写的TodoController逻辑相通 控制器ArticleController.java我特意保留了和待办清单相似的结构新手能快速复用已有经验import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;// 注意这里用Controller不是RestController——Thymeleaf需要返回页面路径Controllerpublic class ArticleController {Autowiredprivate ArticleService articleService;Autowiredprivate CategoryService categoryService;// 1. 发布文章页面携带所有分类数据供前端下拉选择GetMapping(/article/add)public String addArticlePage(Model model) {// 把分类列表传给前端Thymeleaf直接用${categories}获取model.addAttribute(categories, categoryService.list());return article/add; // 对应resources/templates下的HTML文件}// 2. 提交发布文章请求PostMapping(/article/save)public String saveArticle(RequestParam String title, // 接收前端输入的标题RequestParam String content, // 接收文章内容RequestParam Long categoryId) { // 接收选择的分类IDArticle article new Article();article.setTitle(title);article.setContent(content);article.setCategoryId(categoryId);article.setCreateTime(LocalDateTime.now());articleService.save(article);return redirect:/article/list; // 发布后跳转到文章列表页}// 3. 文章列表页带分类名称展示GetMapping(/article/list)public String articleList(Model model) {// 调用服务层方法查询文章时关联查询分类信息ListArticle articleList articleService.getArticleWithCategory();model.addAttribute(articles, articleList);return article/list;}}④ 服务层核心代码多表关联的关键新手不用自己写SQL ArticleService.java用MyBatis-Plus的LambdaQueryChainWrapper实现关联查询比写XML简单太多import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryChainWrapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;Servicepublic class ArticleServiceImpl implements ArticleService {Autowiredprivate ArticleMapper articleMapper;Autowiredprivate CategoryMapper categoryMapper;// 查询文章并关联分类信息新手重点看这个方法Overridepublic ListArticle getArticleWithCategory() {// 1. 先查所有文章ListArticle articleList articleMapper.selectList(null);// 2. 循环给每个文章设置对应的分类信息for (Article article : articleList) {// 根据文章的categoryId查分类Category category categoryMapper.selectById(article.getCategoryId());article.setCategory(category); // 把分类信息存到文章对象里}return articleList;}}这个方法我一开始没想到“循环赋值”这么简单后来老师说“新手不用急着学复杂的联表查询先能用基础方法实现功能更重要”试了之后果然跑通了特别有信心。第二步攻克“进阶难点”——文章与标签的多对多关联分页① 多对多核心中间表设计 文章和标签是“一篇文章可贴多个标签一个标签可对应多篇文章”所以需要一张中间表article_tag来关联表结构只有两个字段article_id关联文章表、tag_id关联标签表不用加主键新手别画蛇添足。② 分页实现一行代码搞定新手必学 之前自己写分页时算“起始位置”总是出错用PageHelper后直接省了这个步骤—— 第一步在pom.xml加依赖和MyBatis-Plus兼容不用担心版本问题dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper-spring-boot-starter/artifactIdversion1.4.6/version // 这个版本和Spring Boot 2.7.x完美匹配/dependency第二步在服务层加分页逻辑就多了PageHelper.startPage这一行// 分页查询文章列表pageNum是当前页码pageSize是每页条数Overridepublic PageInfoArticle getArticlePage(Integer pageNum, Integer pageSize) {// 核心分页代码告诉插件当前页码和每页条数PageHelper.startPage(pageNum, pageSize);// 下面的查询会自动被分页和之前查全量列表的代码一样ListArticle articleList getArticleWithCategory();// 封装分页结果包含总条数、总页数等信息前端直接用#xA; return new PageInfo(articleList);}第三步控制器接收页码参数传给前端分页数据// 分页的文章列表接口GetMapping(/article/list/page)public String articlePageList(RequestParam(defaultValue 1) Integer pageNum, // 默认显示第一页Model model) {PageInfoArticle pageInfo articleService.getArticlePage(pageNum, 5); // 每页5条数据model.addAttribute(pageInfo, pageInfo);return article/list;}③ 前端页面Thymeleaf新手写法 列表页list.html里用Thymeleaf循环展示文章分页按钮直接用pageInfo里的属性不用自己拼URL!-- 展示文章列表 --div th:eacharticle : ${pageInfo.list}h3 th:text${article.title}/h3p分类span th:text${article.category.name}/span/pp th:text${article.content}/p/div!-- 分页按钮 --a th:href{/article/list/page(pageNum1)}首页/aa th:href{/article/list/page(pageNum${pageInfo.prePage})}上一页/aspan th:text|当前第 ${pageInfo.pageNum} 页共 ${pageInfo.pages} 页|/spana th:href{/article/list/page(pageNum${pageInfo.nextPage})}下一页/aa th:href{/article/list/page(pageNum${pageInfo.pages})}尾页/a我写这个页面时直接把课堂上Thymeleaf的案例改了改半小时就搞定了比学Vue快太多特别适合前端基础弱的新手。新手避坑指南我踩过的坑帮你省时间 1. 多表关联时别忘给实体类的“关联字段”加TableField(exist false)否则MyBatis-Plus会误以为数据库有这个字段报“字段不存在”的错 2. Thymeleaf页面必须放在resources/templates目录下否则Spring Boot找不到我一开始放错文件夹页面一直404查了半小时才发现 3. 分页时如果前端传的页码是null一定要用RequestParam(defaultValue 1)设默认值否则会报空指针异常这是老师帮我排查出来的小细节 4. 想快速测试接口直接用之前学的Swagger加个依赖就能在线调接口不用再开Postman省了切换工具的时间。多表设计核心表3张文章表article、分类表category、标签表tag通过article_category、article_tag中间表实现多对多关联。分页查询实现引入PageHelper依赖后仅需一行代码开启分页// 服务层代码查询第1页每页10条数据public PageInfoArticle getArticlePage(Integer pageNum) {PageHelper.startPage(pageNum, 10); // 分页核心代码ListArticle articleList articleMapper.selectAll();#xA; return new PageInfo(articleList); // 封装分页结果}跨域支持若后续对接独立前端如Vue直接复用前文的GlobalCorsConfig配置类即可解决跨域问题。