我的技术博客|222100306

222100306洪朗晨 2024-06-05 00:46:24

技术概述

Spring Boot是一个用于快速构建Java应用的框架,尤其适用于微服务架构。

MVC 模式实现业务逻辑与视图分离,支持团队协作。

我在团队开发中因缺乏Java和Spring Boot经验而遇到挑战,但通过不断学习和实践,我逐渐掌握了Spring Boot与Java的基础知识,理解自动配置机制、MVC 组件交互及异常处理,并在项目中实现了功能。

技术详述

(一)技术介绍

是什么

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。它使用“约定优于配置”(Convention Over Configuration)的理念,极大地简化了基于 Spring 的应用开发。

MVC 模式(Model-View-Controller)是一种用于设计创建 web 应用程序和软件的可扩展性架构模式。在 Spring Boot 中,MVC 模式主要由 Controller、Service、Repository(或 Mapper)和 Entity(或 Model)等组件构成。

做什么

Spring Boot 与 MVC 模式的结合,允许开发者快速构建、测试和部署可扩展的 web 应用程序。通过自动配置和简化的依赖管理,开发者可以专注于业务逻辑的实现,而无需过多关注底层配置和集成。

使用原因

学习并使用 Spring Boot 与 MVC 模式的原因主要有两点:

  1. MVC是最耳熟能详的架构,团队都理解,便于合作开发

  2. 团队大部分同学都更擅长Java语言

使用难点

对于我个人而言难点主要集中在以下几个方面:

  1. 理解 Spring Boot 的自动配置机制和工作原理。

  2. 熟练掌握 MVC 模式的各个组件及其之间的交互关系。

  3. 理解和处理可能出现的异常和错误情况。

(二)实际操作

项目架构图 imgimgimgimg

如何使用mvc架构

以下将结合上面列出的项目结构,介绍mvc架构。

Model(模型)

在Model部分,主要负责数据持久化和数据传输对象的定义。这对应于src/main/java/com/dogcat/entity目录。

  • Entity(实体类):我们定义了与数据库表结构相对应的Java对象。例如,User.javaPost.javaComment.java等。这些类包含与数据库表字段相对应的属性和getter/setter方法。

  • DTO(数据传输对象):在Service层与Controller层之间,我们使用了DTO来传输数据。在entity/DTO子目录下,我创建了一系列的DTO类,如AuthenticationRequest.javaCommentDTO.javaPostDTO.java等,用于封装从Service层返回给Controller层的数据,或者从Controller层传递给Service层的数据。

  • VO/:VO(View Object)通常用于展示层,用于封装需要展示给前端的数据。VO被放在了entity/VO/目录下。

  • result/:这个目录下包含了结果封装类,如PageResult.javaResult.java,它们通常用于封装API的响应结果。

View(视图)

在Spring Boot的Web应用中,View通常指的是前端页面或模板。然而,由于我们的项目结构中没有直接包含前端页面的部分,我们将View视为以数据响应(我们用JSON)的形式返回给客户端的。在Controller层,我处理HTTP请求并返回响应,这可以看作是View的一种实现。

Controller(控制器)

在Controller层,我负责处理HTTP请求,并调用Service层来处理业务逻辑。这对应于src/main/java/com/dogcat/controller目录。例如:

  • UserPostController.java:这个类包含与userpost相关的HTTP请求处理方法。例如,我实现了一个方法用于处理用户发布帖子的请求。在该方法中,我调用Service层的相应方法来处理业务逻辑,并将结果以JSON或XML等格式返回给客户端。

Service(服务)

Service层是业务逻辑的核心部分,我负责处理与业务相关的操作,并且与Controller层紧密协作。

  • UserService.javaPostService.java(假设存在):这些类包含与用户和帖子相关的业务逻辑方法。例如,在UserService中,我实现了注册用户、登录用户、获取用户信息等方法;在PostService中,我实现了发布帖子、获取帖子列表、删除帖子等方法。

Mapper(映射器)

  • mapper/:这个目录下包含了所有的MyBatis Mapper接口,用于操作数据库。这些接口定义了如何与数据库进行交互。

Util(工具类)

  • util/:这个目录下包含了项目中使用的工具类,如AliOssUtil.java(用于与阿里云OSS进行交互)和JwtUtil.java(用于处理JWT相关的操作)。

Filter(过滤器)

  • filter/:这个目录下包含了用于处理HTTP请求的过滤器,如JwtRequestFilter.java(用于在请求中验证JWT令牌)。

问题和解决

(一)两个mapper

其实在java和resources下分别有一个mapper文件夹。

【分析】而java中的mapper是用java语言写的,而resources下是用xml语言写的。

当我进行函数调用的时候,我将两个mapper文件夹下所需的增删改查都用了同样函数名的函数,并都实现了。

【冲突】后来调用的时候发现会冲突。因为,调用resources的mapper就不能调用java的mapper了

【原因】不然程序无法辨别你到底调用的是哪个文件夹下的函数。所以我得到了个结论是,这两个文件夹下的函数是同等级的,都会被扫描到。

(二)JWT鉴权

因为关于项目有太多问题和解决可以分享了,所以这里分享另一些令我印象深刻的问题。

1 加Bearer

JWT产生token出来后,怎么加到Header里呢?我以为直接把token放到Author里就行,但是其实前面要加一个 Bearer和空格

【Python】这和Python就不一样,Pyhton的flask架构,校验时是不用加这个标识的。

这是Java特有的。

2 修饰符

【Python】在Python里,JWT鉴权可以以注解的方式在每一个url前加上,表示要先鉴权才可以继续下一步。

而在Sprinboot里,写好了JWT时,设定哪些路由需要鉴权,是在函数内定义的。如下:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> auth
                    .requestMatchers("/authenticate").permitAll()
                    .requestMatchers("/frontend/user/login").permitAll()
                    .requestMatchers("/frontend/user/register").permitAll()
                    .requestMatchers("/frontend/**").authenticated()
                    .requestMatchers("/backend/**").permitAll()
                    .anyRequest().permitAll()
            )
            .sessionManagement(session -> session
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            );
​
    http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
​
    return http.build();
}

(三)Apipost调试

一开始下载项目直接运行后,发现把接口文档下载到自己软件上时,直接调试是不能成功的。

【原因】因为接口文档只会把url载入,而body等内容是不会同步的,每次电脑开关机也都会消失,需要每次都手动输入。

总结

在这篇技术博客中,我详细回顾了自己在团队开发过程中使用Spring Boot框架和MVC模式的经历。起初,由于对Java和Spring Boot不够熟悉,我在项目开发中遇到了不少挑战。然而,通过持续的学习和实践,我逐步掌握了Spring Boot的基础知识,深入理解了其自动配置机制、MVC模式中各个组件之间的交互,以及如何有效处理异常。

我认识到Spring Boot之所以能简化新Spring应用的搭建和开发过程,是因为它采用了“约定优于配置”的理念。在MVC模式中,我了解了Controller、Service、Repository和Entity等组件的作用,它们共同构成了一个可扩展的web应用程序架构。我学习到,团队之所以选择MVC模式,一方面是因为它广为人知,便于团队合作开发;另一方面是因为团队成员普遍擅长Java语言。

在实际开发中,我面临了一些技术难点,包括理解Spring Boot的自动配置机制、熟练掌握MVC模式的组件交互,以及处理异常和错误。我通过实际操作,逐渐克服了这些难点。例如,在项目架构中,我负责了Model部分,包括数据持久化和数据传输对象的定义。我创建了实体类、DTO、VO以及结果封装类,以适应不同层次的数据需求。

我还遇到了一些具体的问题,比如Java和XML两种不同形式的Mapper冲突问题,我通过分析和实践解决了这一冲突。在JWT鉴权方面,我学习了如何在Spring Boot中正确地将token添加到Header,并设置了哪些路由需要鉴权。我还分享了使用Apipost进行接口调试时遇到的问题,以及如何确保调试的顺利进行。

总的来说,通过这一系列的学习和实践,我不仅提升了自己的技术能力,还加深了对团队协作重要性的认识。这些经验对我未来的软件开发职业生涯无疑是宝贵的财富。

参考文献

  1. Spring Boot 官方文档

  2. Spring MVC 官方文档

  3. Spring Boot 教程

  4. 深入理解 Spring Boot

  5. Spring MVC 实战

...全文
271 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
助教鲍仁俊 助教 2024-06-11
  • 打赏
  • 举报
回复

很赞,唯一的小遗憾就是概述字数超出要求,其他的部分很详细~

内容概要:本文介绍了基于低秩逼近代理模型的N-1安全约束经济调度快速计算方法,并提供了完整的Matlab代码实现。该方法针对电力系统中N-1故障场景下的安全约束经济调度(SCED)问题,提出采用低秩逼近技术构建高效代理模型,有效降低高维优化问题的计算维度与复杂度,显著提升多场景下调度方案的求解效率。文中系统阐述了数学建模过程、代理模型构造原理、低秩近似算法推导及其实现流程,特别适用于含高比例可再生能源接入、存在大量不确定性因素的现代电力系统优化调度,能够在保障计算精度的同时满足实时性与准实时性应用需求。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员和工程技术人员,尤其适合从事电力系统经济调度、安全稳定分析、不确定性建模与高性能计算等相关领域的专业人士。; 使用场景及目标:①应用于大规模电力系统在N-1故障条件下的快速安全校核与经济调度决策支持;②为高渗透率新能源接入的电力系统提供高效的多场景优化求解方案;③支撑日前调度、实时调度等对计算速度与精度均有较高要求的工程应用场景。; 阅读建议:读者应结合所提供的Matlab代码深入理解算法实现细节,建议在标准测试系统上复现并调试程序,以掌握低秩逼近方法在电力系统优化中的具体应用技巧,并可根据实际研究方向进行模型拓展、性能对比与算法改进。
内容概要:本文档聚焦于电力系统黑启动与负荷恢复的研究,结合Matlab代码实现,系统探讨了电力系统在发生大面积停电事故后的恢复策略。研究内容涵盖了黑启动过程中的关键环节,如发电机组的启动顺序、恢复路径规划、负荷逐步投入等,并通过Matlab仿真对恢复流程进行建模与验证,旨在优化恢复时序与资源配置。文档还关联了智能优化算法、机器学习、路径规划、电力系统故障分析与调度优化等多种技术方向,展现了其在科研与工程实践中的广泛应用前景。配套代码和资料可通过提供的网盘链接下载,便于读者复现与拓展研究。; 适合人群:具备电力系统基本理论知识和Matlab编程能力的研究生、高校科研人员及从事电力系统运行、调度与控制相关工作的工程技术与研究人员。; 使用场景及目标:①用于电力系统恢复策略的教学演示与科研仿真分析;②支撑黑启动方案的设计、评估与优化决策;③为复杂电网故障后快速恢复供电提供算法模型与技术参考; 阅读建议:建议读者结合网盘中的完整代码资源,按照文档所述技术路线逐步实践,重点关注黑启动过程中机组启动逻辑与负荷恢复的协调机制,并可进一步拓展至多能源协同恢复、智能算法优化等前沿研究方向。
源码直接下载地址: https://pan.quark.cn/s/1eceaa56687c Chrome 开发者工具中文手册 =============== Chrome DevTools 是公认的优秀的前端调试工具,由于功能强大,所以使用起来有一定的学习门槛,与此同时 Chrome DevTools 暂时没有中文手册,对于不太熟悉英文的同学会比较吃力。 本项目的初衷是为想使用或者正在使用 Chrome DevTools 的同学提供一个中文手册,方便大家学习使用这个优秀的工具,提高前端开发效率和质量! 翻译流程 第一阶段 先将 Chrome DevTools 的内容按现有的目录结构翻译成中文,其中: 文章正文内容均放在 目录下,采用 格式。 文章中所用到的图片资源暂时先用现有英文手册的原始链接,后续图片资源会统一托管到七牛云存储 文件命名规则 文件名为 Chrome DevTools 对应文章超链接中 后的部分。 所有的空格和 用 代替。 例如: 这篇文档,对应 这个文件。 对于下级子页面文档,将其放在以父级文档名称命名的文件夹下面。 例如: 属于 那么将放置在 。 第二阶段 根据翻译文档,制作成类似在线手册或者与官方文档类似的网站,方便大家参阅。 参与项目 欢迎你参与翻译本项目,在翻译的过程中,可以锻炼你的英语能力和 Chrome DevTools 的实际应用能力,同时还为他人提供方便,何乐而不为? 一个个 commit 堆积起来就是一个了不起的 repo,欢迎你 Fork 并提交 Pull Request 或者 Issue ,哪怕是改正一个错别字、修正一个病句,我们都会很高兴。 参与方法和步骤如下: 登录 https://.com Fork 创建您的特性分支 (gi...

315

社区成员

发帖
与我相关
我的任务
社区描述
福州大学的软件工程实践-2023学年-W班
软件工程需求分析结对编程 高校 福建省·福州市
社区管理员
  • FZU_SE_teacherW
  • Pity·Monster
  • 助教张富源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧