框架面试题

1...项目中,将使用Lombok框架,如果IntelliJ IDEA没有安装对应的插件,则可能错误的认为代码
有误(代码可以正常执行,但IntelliJ IDEA会提示红色波浪线),则应该安装插件。
安装完成后需要重启,重启后,勾选设置中的 Enable annotation processing :
Lombok框架是用于简化代码编写的框架,在项目中编写实体类、VO类等类时,都会为属性添
加SETTERS & GETTERS方法,重新生成 toString() ,保留无参数构造方法,生成 hashCode() 和 equals() ……Lombok框架只需要使用一些注解即可在编译时插入这些方法,则编写代码时
只需要声明属性并添加注解即可,
以上 @Data 注解的作用就是生成SETTERS & GETTERS,重新生成 toString() ,要求当前类存
在无参数构造方法。
由于Lombok框架是编译期干预的,所以在 .java 源代码中不会看到各种SET或GET方法,但是
可以调用,因为最终编译出的 .class 文件中是有这些方法的
同时,也由于Lombok只在编译期才开始生成SET或GET方法,所以,在编写代码时,直接使用
SET或GET方法就提示语法错误,因为开发工具只能基于源代码来判断语法,为了保证编写代码
不会出现这些错误提示,就需要在开发工具中安装Lombok插件(参考第3步:在IntelliJ IDEA中
安装Lombok插件)!当然,即使不安装该插件,只是开发过程中代码会提示错误,但是不影响
运行!

2...当前项目将使用聚合项目的模式对项目进行管理,简单的说,会有1个父项目和多个子项目,父
项目存在的价值是“管理所有子项目可能需要使用的依赖”,先通过SpringBoot创建向导来创建
straw 父项目:
在创建过程中,不需要勾选任何依赖。
当项目创建出来之后,由于父项目的作用只是管理依赖而已,并不需要运行,所以,将 src 文件
夹直接删除!


3..创建straw-generator子项目
对父项目 straw 点右键,选择 New > Module 即可打开创建子项目的创建向导:
然后,依然通过SpringBoot的创建向导来创建 straw-generator 子模块项目:
在创建过程中,不勾选任何依赖。
接下来,分别调整父子项目的 pom.xml 文件,使得父项目管理依赖的版本,子项目直接添加依
赖而不需要关心版本!在父项目的 pom.xml 中:
将原本的 <dependencies> 的全部内容放到 <dependencyMangement> 节点之下;
将已经存在的 spring-boot-starter 依赖改为 spring-boot-starter-web ; 在 <properties> 中通过 <spring-boot.version>2.3.5.RELEASE</spring- boot.version> 将SpringBoot系列框架的版本号配置为变量;
在 <dependencies> 下的SpringBoot系列框架中补充 <version> 节点配置版本号,值为以
上配置的变量;
添加 <packaging>pom</packaging> ;
目前创建的 straw-generator 子模块项目是“代码生成器”项目,因为在开发项目时,各项目中可
能都需要创建一些高度相似的文件,然后再在各文件中编码代码,使用“代码生成器”可以直接生
成这些文件,其工作原理是通过分析MySQL数据库的数据表的名称、结构来生成对应的文件
的!为了保证代码生成器能够连接到MySQL服务器来解析数据表,所以,需要添加 mysql- connector-java 依赖,其参考代码是:


4...5...“代码生成器”项目生成的代码中,关于持久层的代码都是基于Mybatis Plus框架的,而Mybatis
Plus框架是基于Mybatis框架的,所以还需要添加这2个框架相关的依赖,其参考代码是

4.....关于Mybatis Plus框架
在使用Mybatis框架开发持久时,其实,无论开发哪张数据表对应的“插入数据”功能,编写代码
的模式是不变的,另外,绝大部分数据表的数据管理中,都包括“根据id查询数据”、“查询该表中
所有数据”、“根据id删除数据”等操作,所以,绝大部分数据表中都有一些固定的数据操作模式,
所以,Mybatis Plus框架的作者就设计了这个框架,使得开发人员在使用Mybatis Plus框架时,
可以直接调用相关的方法实现数据访问,而不必再自行设计抽象方法并配置SQL语句!
在使用之前,还是需要准备Mybatis框架的基础运行环境,所以,先在
StrawPortalApplication 的声明之前添加 @MapperScan 注解,以配置Mybatis使用的接口所
在的包:
@MapperScan("cn.tedu.straw.portal.mapper")
然后,在 application.properties 中添加配置:
# 配置连接MySQL中的straw数据库
 spring.datasource.url=jdbc:mysql://localhost:3306/straw? 
useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai 
spring.datasource.username=root spring.datasource.password=root 
# 配置Druid数据库连接池 
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource 
spring.datasource.druid.initial-size=2 
spring.datasource.druid.max-active=5
 # 设置日志的显示级别为trace,将显示所有级别的日志 
logging.level.cn.tedu.straw=trace
当已经完成以上配置后,就可以使用Mybatis Plus直接实现数据的访问了,可以通过单元测试
来实现,则先在 test 下的 cn.tedu.straw.portal 包下创建 MybatisPlusTests 测试类来测试
Mybatis Plus虽然定义了比较全面的数据访问功能,但是,除了常用功能以外,其它的功能实现
对应的API却不简洁,使用比较麻烦,而且,Mybatis Plus是根据调用API时的参数来决定需要执
行的SQL语句的,所以,执行效率偏低,违背了使用Mybatis框架的初衷!所以,使用Mybatis
Plus应该适可而止,简单的功能直接使用Mybatis Plus的API实现即可,而相对复杂的数据访问
还是使用自定义抽象方法并配置SQL语句来使用。


6....关于Slf4j日志
SpringBoot框架默认已经添加使用Slf4j日志的所有依赖,在SpringBoot项目中可以直接使用!
当项目中还添加了Lombok框架后,当需要使用Slf4j输出日志时,先在类的声明之前添加
@Slf4j 注解,然后,在类中调用 log 的方法即可输出日志,例如:
在Slf4j中,将日志级别定义从低到高为:
trace :跟踪信息
debug :调试信息
info :一般信息
warn :警告信息
for (User user : users) { System.out.println(">>> " + user); } } }
error :错误信息
当使用了Slf4j输出日志后,还可以通过 application.properties 配置日志的显示级别,例如
以下将显示级别设置为 warn :
logging.level.cn.tedu.straw=warn
如果没有配置以上属性,默认的显示级别是 info 级别。
通常,在使用Slf4j输出日志,通常推荐使用 public void debug(String format, Object... arguments); 及其它名称不同、参数列表相同的方法,这系列的方法的第1个字符串类型的参数
中可以使用 {} 作为占位符,然后使用第2个可变参数表示各个值,例如:
log.debug("今天是{}年{}月{}日",2020,11,11);
使用这种做法,就不必再使用传统的字符串拼接的方法来输出字符串,使用起来更加方法,并
且,Slf4j会自动缓存第1个参数字符串,以提高多次输出时的执行效率!
需要注意,Slf4j并不是一个完整的日志框架,它只是一套输出日志的标准,例如log4j才是实际
输出日志的框架,在Slf4j中定义了输出日志应该使用的API,并且实现了log4j或类似日志框架进
行转换的实现。

7..... 关于项目的简单开发流程
当需要开发一个项目时,首先,应该分析这个项目中需要处理哪些种类的数据,以当前项目为
例,当前项目是一个问答系统,可以处理的数据可能有:用户、问题、答案、评论等。
接下来,应该分析处理这些数据的先后顺序,一般先处理简单的、基础的数据,则以上数据的处
理顺序应该是:用户 > 问题 > 答案 > 评论。
然后,找出需要处理的数据,分析这种数据涉及的功能,以用户数据为例,需要处理的有注册、
登录、修改资料、修改密码等。
接下来,再分析这些功能的开发顺序,一般先开发简单的,且大多遵守增、查、删、改的顺序,
则以上列举的功能的开发顺序应该是:注册 > 登录 > 修改密码 > 修改资料。
最后,无论开发哪个功能,都应该遵循持久层 > 业务层 > 控制器层 > 前端页面的顺序。

8....Spring Validation是应用于SpringMVC框架基础之上,用于检查客户端提交的请求参数的基本有效性
(请求参数的格式)的!
当项目中需要使用Spring Validation实现验证时,需要添加依赖,参考代码为:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot- starter-validation --> 
<dependency> 
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.3.5.RELEASE</version> 
</dependency>
然后,在封装了请求参数的 StudentRegisterDTO 类的各属性之前添加注解以配置参数格式的规则,及
违反规则后的提示信息,例如:
  @Size(min = 2,max = 20,message = "注册失败,昵称必须是2-10个字符")
    private String username;
    @NotNull(message = "注册失败,请填写密码!")
    private String password;
然后,在控制器中的处理请求的方法的参数列表中,在被验证的请求参数之前添加 @Valid 注解,并在
这个参数之后添加 BindingResult 类型的参数,它是封装了验证结果的对象
注意:被验证的参数对象与 BindingResult 必须是连续的2个参数,中间不可以添加其它参数!
关于添加在各属性之前用于验证的注解,常用的有:
@NotNull :不允许为 null 值;
@NotEmpty :不允许为空值,即不允许为 "" 空字符串;
@NotBlank :不允许为空白值,例如不允许为 "" ,也不允许为 " " ,即字符串对象调用
trim() 方法后的长度不允许为 0 ; @Size :可以配置 min 、 "max" 属性来限制值的长度;
@Min :用于限制最小值,如果小于限制值则错误;
@Max :用于限制最大值,如果大于限制值则错误;
@Pattern :用于配置正则表达式,如果不符合正则表达式则错误;
其它。关于使用正则表达式验证时,正则表达式可参考:https://www.cnblogs.com/xujingyang/p/10225050.html

9.... 关于SpringMVC框架统一处理异常
当方法运行时抛出异常时,方法的调用者可以使用 try...catch 对异常进行捕获,也可以使用 throws
交异常声明抛出,如果是选择将异常抛出,则当前方法的调用者需要再考虑到底是 try...catch 还是
throws !
例如: a() 方法在运行过程中会抛出异常,如果 b() 方法调用了 a() 方法,就需要选择 try...catch 或 throws ,如果还有 c() 方法调用 b() 方法,当 b() 方法选择了 try...catch 后, c() 方法是不知
道曾经出现过异常的,因为 b() 方法已经将异常捕获了……
所以,关于异常,如果 try...catch 了,后续的调用者就不会再知道有这个异常了,如果选择的是
throws ,则谁调用谁负责(继续选择 try...catch 或 throws )。
注意:在异常的体系中, RuntimeException 及其子孙类异常通常不受到相关语法的约束,例如 a() 方
法会抛出某种 RuntimeException ,当 b() 方法调用了 a() 方法后,可以既不 try...catch 又不
throws !只要 a() 方法没有通过 try...catch 进行捕获,就相当于抛出!
如果某个异常对象一直被抛出,一直没有被处理,最终,将由运行环境进行处理,绝大部分运行环境处
理的方法就是将异常的跟踪报告输出到控制台!如果是Java EE项目,还可能同时将异常信息显示在页面
中!
在服务器端项目中,只要出现了任何异常且一直没有被处理,则会向客户端响应 500 错误。
在项目中,处理异常的本质在于“向客户端响应一些提示信息,避免客户端再次请求时仍出现错误”,及
一些可能必要的“收尾”工作。
正因为处理异常的本质是需要响应信息的,所以,在项目中,控制器组件是适合处理异常的,而其它的
组件就是不适合处理异常的!
但是,由控制器层处理异常,就导致控制器类中存在大量与处理异常相关的代码,而且代码的重复会非
常明显!
SpringMVC框架提供了统一处理异常的机制,它希望各控制器中处理请求的方法都直接将异常抛出即
可,然后调用专门的方法进行处理!
关于处理异常的方法:
必须添加 @ExceptionHandler 注解;
应该使用 public 权限;
返回值的声明原则与处理请求的方法相同;
方法名称可以自定义;
参数列表中必须包含异常类型的参数,表示SpringMVC框架在调用处理请求的方法之后捕获的异
常对象,另外,可按需添加 HttpServletRequest 、 HttpServletResponse 等限定的某些参数。
所以,可以在 UserController 中,先将处理请求的方法改为不捕获异常,并添加方法统一处理异常:
需要注意,以上处理异常的方法,只能作用于当前控制器类!所以,可以:
自定义一个控制器类的基类,将处理异常的方法放在基类中,并且各控制器类都继承自基类;
【推荐】自定义类,将处理异常的方法放在这个类中,并且在自定义类的声明之前添加
@ControllerAdvice 或 @RestControllerAdvice 注解。

10......
22.1. Spring Security框架简介
Spring Security框架是用于处理登录验证、授权访问的框架。
22.2. 在项目中添加Spring Security框架
关于Spring Security框架的依赖的参考代码为:
当添加了以上依赖后,当前项目中所有的访问默认都是必须登录才允许访问的!默认的用户名
是 user ,默认的密码是启动日志中输出的内容:
使用默认的用户名和密码登录后,会自动跳转到此前尝试访问的页面,如果此前是直接打开的登
录页面,则会跳转到主页。
当登录成功后,可以通过 http://localhost:8080/logout 退出登录。

11.要实现页面中的HTML部分代码的复用,可以通过Thymeleaf框架来实现,则在当前项目中需要使用
Thymeleaf框架,依赖的参考代码是:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot- starter-thymeleaf -->
 <dependency>
     <groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-thymeleaf</artifactId> 
<version>2.3.5.RELEASE</version> </dependency>
如果需要通过Thymeleaf框架实现HTML代码的复用,首先,相关的页面是需要通过Thymeleaf转发来
显示的!则先将 index.html 移动到 resources/templates 文件夹下,同时,为了便于统一风格,将
register.html 、 login.html 及 question 文件夹也都移动到该文件夹:

12...42. 关于summernote富文本编辑器
在原生的HTML标签中,用于输入文本的控件就是 <input type="text"/> 、 <textarea> </textarea> 这2种,无论哪种都不支持对文字的排版,例如将文字加粗、设置颜色等,更加不支持图
文混排和更复杂的排版!
在实际开发时,往往需要提交图文混排的内容,例如博客系统中的文章、电商系统中的商品介绍……为
了实现复杂的排版,就需要使用到“富文本编辑器”,富文本编辑器都是第三方的,种类比较多,基本上
都是实现了常规的图文混排功能,在选取时可以根据喜好进行选择。
当前项目中使用的富文本编辑是summernote,在使用时,需要先引用相关文件:
在HTML部分,只需要使用HTML原生的 <textarea> 标签来表示即可:
然后,还需要结合JavaScript代码配置summernote:

13....当使用summernote时,可以引用远程图片,summernote生成的源代码例如:
也可以选择使用本机的图片,summernote生成的源代码例如:
以上截图并不完整,后续还有许多行数据,以上是一张约104KB的图片,以上内容超过14万个字
符……
当插入本地图片,summernote默认会将图片转换为Base64编码,并通过 <img src="data:图片类 型;base64,数据……"> 来表示图片!
如果使用Base64编码来表示图片,最终,当填写正文并提交到服务器端时,会将图片的Base64编码也
写入到数据库,会导致数据库占据的存储空间会急剧增加,不利于数据库的维护,同时,因为数据表示
并不直观,也不利用图片的管理!所以,在插入本地图片时,应该将图片上传到服务器端,并引用该图
片即可


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值