- 博客(141)
- 收藏
- 关注
原创 60、数据访问-数据库场景的自动配置分析与整合测试
根据`application.properties`或`application.yml`中的配置(如`spring.datasource.url`、`spring.datasource.username`等),创建数据源实例。- 当引入数据库相关依赖(如`spring-boot-starter-jdbc`或`spring-boot-starter-data-jpa`)时,Spring Boot会自动检测类路径中的依赖。- 可通过`@Autowired`注入`JdbcTemplate`进行数据库操作。
2025-06-14 12:48:33
357
原创 59、定制化原理-SpringBoot定制化组件的几种方式
原理:`@EnableWebMvc`导入了`DelegatingWebMvcConfiguration`类,该类继承自`WebMvcConfigurationSupport`,导致`WebMvcAutoConfiguration`失效,从而禁用默认的Spring MVC自动配置。通过修改`application.properties`或`application.yml`文件,利用`@ConfigurationProperties`注解将配置项绑定到JavaBean上,从而调整组件的行为。
2025-06-14 12:46:37
267
原创 58、嵌入式Servlet容器-【源码分析】切换web服务器与定制化
`ServletWebServerFactoryAutoConfiguration`是关键的自动配置类,负责创建`ServletWebServerFactory`。通过以上方式,可以灵活地切换和定制Spring Boot的嵌入式Servlet容器,满足不同的应用需求。重新启动应用,Spring Boot将使用Jetty作为嵌入式Servlet容器。- 根据项目中引入的依赖,自动配置类会判断系统中存在哪些Web服务器相关的类。// 设置Jetty特有配置。-- 排除Tomcat -->
2025-06-13 18:14:42
342
原创 57、原生组件注入-【源码分析】DispatcherServlet注入原理
DispatcherServlet`的注入原理主要依赖于`Servlet`容器的生命周期和`Spring`的依赖注入机制。- `DispatcherServlet`继承自`FrameworkServlet`,而`FrameworkServlet`继承自`HttpServletBean`,最终`HttpServletBean`继承自`HttpServlet`。- 将当前`Servlet`转换为`BeanWrapper`,以便使用`Spring`的方式注入参数。
2025-06-13 18:13:39
344
原创 56、原生组件注入-原生注解与Spring方式注入
通过在组件类上使用`@WebServlet`、`@WebFilter`和`@WebListener`等注解,并配合`@ServletComponentScan`注解,Spring Boot会自动扫描并注册这些原生组件。在Spring Boot中,可以通过两种方式将原生的Servlet、Filter和Listener组件注入到应用程序中:**使用原生注解**和**使用Spring方式**。- 如果组件不需要依赖注入,且希望与Spring解耦,建议使用**原生注解方式**。### 一、使用原生注解注入。
2025-06-12 20:21:15
809
原创 55、错误处理-【源码流程】几种异常处理原理
Spring框架内置了一些异常处理器,如`DefaultHandlerExceptionResolver`,用于处理Spring框架自身抛出的异常。3. 根据异常类型查找`@ControllerAdvice`类中匹配的`@ExceptionHandler`方法。2. 如果找到精确匹配的错误页面,则返回该页面;否则,返回通用的`4xx.html`或`5xx.html`页面。- 在项目中定义特定的错误页面,如`error/404.html`、`error/5xx.html`等。// 跳转到错误页面。
2025-06-12 20:19:54
428
原创 54、错误处理-【源码流程】异常处理流程
`DefaultErrorAttributes` 将异常信息保存到 `request` 域的 `ERROR_ATTRIBUTE` 中,并返回 `null`。- 调用所有注册的 `HandlerExceptionResolver` 解析器,尝试处理异常。- 若存在对应的错误页面(如 `error/500.html`),则返回该页面。- 底层检测到未处理的异常后,会转发请求到 `/error` 路径。- 处理 `/error` 请求的控制器,负责返回错误响应。- 获取异常信息,设置响应状态码。
2025-06-11 20:52:48
486
原创 53、错误处理-【源码分析】底层组件功能分析
`BasicErrorController`处理`/error`请求,返回`ModelAndView`对象,视图名为`error`。- **类型**:`ErrorAttributes`、`HandlerExceptionResolver`- **使用`@ControllerAdvice`和`@ExceptionHandler`**:处理全局异常。- **自定义错误页面**:在`/templates/error`目录下创建特定状态码的HTML页面。- **作用**:处理默认`/error`路径的请求。
2025-06-11 20:51:21
620
原创 52、错误处理-SpringBoot默认错误处理机制
在 `classpath:/templates/error` 或 `classpath:/static/error` 目录下创建对应的错误页面,例如 `error/404.html`、`error/500.html`。4. **获取错误信息**:调用 `DefaultErrorAttributes` 的 `getErrorAttributes` 方法,获取错误信息的Map。2. **转发到 `/error`**:Spring MVC将异常请求转发到 `/error` 路径。
2025-06-10 09:04:09
502
原创 51、文件上传-【源码流程】文件上传参数解析器
这些信息被封装为`MultipartFile`对象,`MultipartFile`接口提供了对上传文件的操作方法,如`getOriginalFilename`、`getInputStream`、`transferTo`等。- 如果`isMultipart`返回`true`,表明是文件上传请求,`DispatcherServlet`调用`MultipartResolver`的`resolveMultipart`方法进行解析。- 调用`transferTo`方法可以将文件内容保存到指定位置。
2025-06-10 09:03:01
517
原创 50、文件上传-单文件与多文件上传的使用
通过以上步骤,可以实现单文件和多文件上传功能。在前端通过`<input type="file" accept="image/*">`限制文件类型,后端进行二次验证。使用`XMLHttpRequest`或`Fetch API`实现异步上传,提供进度条和实时反馈。- 设置`enctype="multipart/form-data"`以支持文件上传。- `<input type="file">`的`name`属性用于后端接收文件。- 使用`@RequestParam`注解接收`MultipartFile`对象。
2025-06-09 07:48:13
532
原创 49、拦截器-【源码分析】-拦截器的执行时机和原理
如果某个 `preHandle()` 返回 `false`,则中断执行,调用已执行拦截器的 `afterCompletion()` 方法,并返回。- `HandlerMapping` 返回 `HandlerExecutionChain` 对象,包含处理请求的控制器方法以及相关的拦截器链。- 所有 `preHandle()` 返回 `true` 后,调用控制器方法处理请求,生成 `ModelAndView` 对象。7. **执行拦截器的 `afterCompletion()` 方法**
2025-06-09 07:47:25
384
原创 47、视图解析-【源码分析】-视图解析器与视图
Spring 遍历配置的视图解析器,调用 `resolveViewName(String viewName, Locale locale)` 方法,尝试解析逻辑视图名。- 例如,逻辑视图名 `hello` 会被解析为 `/WEB-INF/views/hello.jsp`。- 逻辑视图名以 `redirect:` 开头,如 `redirect:/newUrl`。- 逻辑视图名以 `forward:` 开头,如 `forward:/jspPage`。47、视图解析-【源码分析】-视图解析器与视图。
2025-06-08 04:00:59
399
原创 48、拦截器-登录检查与静态资源放行
`preHandle`方法在请求到达Controller前执行,返回`true`放行,返回`false`拦截。- `.excludePathPatterns(...)`:指定放行的路径,包括登录相关路径和静态资源路径。"/css/**", // 静态资源。- **静态资源位置**:根据项目结构正确配置静态资源的存放位置和访问路径。- `.addPathPatterns("/**")`:拦截所有请求。- **路径匹配规则**:确保放行路径的准确性,避免误拦截或误放行。
2025-06-08 04:00:23
458
原创 46、web实验-遍历数据与页面bug修改
使用开发者工具查看元素盒模型,调整`margin`、`padding`、`width`、`height`等属性。- `th:each` 用于遍历集合,`user` 代表当前遍历的元素,`stats` 提供遍历状态(如序号)。- **模块化开发**:将页面拆分为独立的模块,便于代码复用和bug定位。- **代码规范**:遵循统一的代码规范,提高代码可读性和维护性。- **测试驱动开发**:编写单元测试,确保代码的稳定性和可靠性。- **原因**:CSS样式错误、盒模型问题、浏览器兼容性差异。
2025-06-06 00:04:04
494
原创 45、web实验-抽取公共页面
在其他需要使用公共片段的页面中,通过`th:insert`、`th:replace`或`th:include`属性引入公共片段。- **`th:include`**:将公共片段的内容插入到指定标签内部,但不保留公共片段的根标签。- **`th:insert`**:将公共片段的内容插入到指定标签内部,保留原标签。- **`th:replace`**:用公共片段的内容替换指定标签及其内容。-- 引入公共的侧边栏代码 -->-- 引入公共的头部代码 -->-- 引入公共的底部代码 -->
2025-06-06 00:03:08
550
原创 祝所有高考学子,旗开得胜!
金发少年的自信与深蓝笑眼的温暖,此刻都化作笔尖划过卷面时的闪亮荧光。书包里装着星辰大海的梦,手环上缠着青春倔强的誓言——愿你们在考场上像荧光棒般耀眼,用智慧点亮每一道题的缝隙;像白云般自在,把压力揉碎成云朵投进阳光里。当“旗开得胜”的金色誓言在风中飘扬,请记得:答案早已藏在你们高举的手臂里,藏在并肩奔跑的笑声中,藏在无数个挑灯夜战的星子下。——考神附体,超常发挥!
2025-06-05 23:41:55
143
原创 44、web实验-后台管理系统基本功能
**权限控制**:不同角色的用户拥有不同的操作权限,例如管理员可管理所有功能,普通用户只能查看部分信息。- **增删改查(CRUD)**:对系统中的数据进行添加、删除、修改和查询操作,如管理文章、产品信息等。- **用户登录/注销**:用户输入用户名和密码进行登录,登录后可执行相关操作,并提供注销功能。- **模板引擎**:Thymeleaf,用于渲染动态页面,与Spring Boot集成良好。- **后端框架**:Spring Boot,提供快速开发、自动配置等特性。
2025-06-05 19:54:54
667
原创 43、视图解析-Thymeleaf初体验
默认情况下,Spring Boot会在`src/main/resources/templates`目录下查找模板文件,模板的默认后缀名为`.html`。- **内置表达式语言**:提供强大的表达式语言(Thymeleaf EL),方便在模板中访问和操作数据。- **自然模板**:模板与常规HTML兼容,可以在不经过模板引擎解析的情况下直接打开查看。- **可读性强**:模板具有良好的可读性,即使没有模板引擎的上下文也能理解其结构。- **语法简洁**:标签语法简单明了,易于学习和使用。
2025-06-05 19:53:27
707
原创 42、响应处理-【源码分析】-浏览器与PostMan内容协商完全适配
*内容协商**是HTTP协议中的一种机制,允许服务器根据客户端的请求头信息(如`Accept`、`Accept-Language`、`Accept-Encoding`等),选择最合适的响应内容格式。- 发送GET请求到`http://localhost:8080/test/person`,设置请求头`Accept: application/json`,返回JSON格式数据。- 在浏览器中访问`http://localhost:8080/test/person?// 创建基于请求参数的内容协商策略。
2025-06-04 16:14:38
770
原创 41、响应处理-【源码分析】-自定义MessageConverter
**实现多协议数据兼容**:Spring MVC默认支持JSON、XML等格式的数据转换,通过自定义`MessageConverter`,可以支持自定义的数据格式,如`application/x-guigu`等。当客户端发送请求时,如果`Accept`头包含`application/x-guigu`,则会使用`GuiguMessageConverter`将`Person`对象转换为自定义格式的数据返回给客户端。- 实现`read()`和`write()`方法,分别处理数据的读取和写入逻辑。
2025-06-04 16:12:33
684
原创 40、响应处理-【源码分析】-基于请求参数的内容协商原理
Spring Boot中的`ContentNegotiationManager`负责内容协商,它会检查启用了哪些协商策略,包括基于请求头的`HeaderContentNegotiationStrategy`和基于请求参数的`ParameterContentNegotiationStrategy`。- **请求头策略**:如果未指定格式参数,或参数内容协商未启用,则根据请求头中的`Accept`字段进行内容协商,选择最合适的媒体类型。format=json`中获取`format`参数值为`json`。
2025-06-03 19:08:03
531
原创 39、响应处理-【源码分析】-内容协商原理
服务器从请求中读取`Accept`、`Accept-Language`、`Accept-Charset`、`Accept-Encoding`等请求头,了解客户端的偏好。- **Accept-Charset**:指定可接受的字符集,如`UTF-8`、`ISO-8859-1`。- **Accept-Encoding**:指定可接受的内容编码方式,如`gzip`、`deflate`。- **Accept-Language**:指定可接受的语言,如`en-US`、`zh-CN`。
2025-06-03 19:06:40
445
原创 38、响应处理-【源码分析】-HTTPMessageConverter原理
**功能**:处理表单数据,支持`application/x-www-form-urlencoded`和`multipart/form-data`。- 遍历所有注册的`HttpMessageConverter`,调用`canRead`方法,找到能处理该`Content-Type`的转换器。- **功能**:判断转换器是否能写入指定类型的数据,将`clazz`类型的Java对象转换为指定媒体类型的数据。- **功能**:判断转换器是否能读取指定类型的数据,并将其转换为`clazz`类型的Java对象。
2025-06-02 15:36:12
484
原创 37、响应处理-【源码分析】-ReturnValueHandler原理
**功能**:使用`HttpMessageConverter`将返回值转换为HTTP响应体,支持JSON、XML等格式。- **处理不同类型的返回值**:根据控制器方法返回值的类型,选择合适的`ReturnValueHandler`进行处理。2. **判断支持类型**:调用每个处理器的`supportsReturnType`方法,判断是否支持处理当前返回值类型。2. **执行处理逻辑**:调用处理器的`handleReturnValue`方法,将返回值转换为HTTP响应。否则返回`false`。
2025-06-02 15:34:35
310
原创 36、请求处理-【源码分析】-自定义Converter原理
在配置类上实现 `WebMvcConfigurer` 接口,并重写 `addFormatters` 方法,将自定义 `Converter` 添加到 `FormatterRegistry` 中。2. **注册 `Converter`**:通过 `WebMvcConfigurer` 将自定义 `Converter` 添加到 `ConversionService`。2. `WebDataBinder` 尝试将 "张三,18" 绑定到 `Person` 对象的 `name` 和 `age` 属性。
2025-06-01 13:09:10
533
原创 35、请求处理-【源码分析】-自定义参数绑定原理
通过`WebMvcConfigurer`的`addFormatters`方法将自定义`Converter`注册到`FormattingConversionService`中。- 参数上存在`@ModelAttribute`注解,或没有该注解但`annotationNotRequired`为`true`。3. **数据绑定**:利用`WebDataBinder`将请求参数绑定到对象属性,借助`Converters`进行类型转换。其中,`Person`类包含`name`、`age`和`birth`属性。
2025-06-01 13:07:55
429
原创 34、请求处理-【源码分析】-Model、Map原理
mavContainer.getModel()` 方法会返回一个 `Model` 实例,通常是一个 `BindingAwareModelMap` 对象,它既是 `Model` 也是 `Map`。- **`Model` 和 `Map` 参数在 Spring Boot 中本质上是同一个对象,都是 `BindingAwareModelMap` 的实例。- **通过 `Model` 或 `Map` 添加的数据最终都会被放入 `HttpServletRequest` 的请求域中,供视图访问。// 输出 true。
2025-05-31 15:27:40
538
原创 33、请求处理【源码分析】Servlet API参数解析原理
通过 `NativeWebRequest` 的 `getNativeRequest(Class<T> requiredType)` 方法,从当前请求上下文中获取原生的 `HttpServletRequest` 或 `HttpServletResponse`。- Spring 会遍历所有注册的 `HandlerMethodArgumentResolver`,调用 `supportsParameter` 方法判断是否支持 `HttpServletRequest` 类型的参数。
2025-05-31 15:25:50
451
原创 32、请求处理-【源码分析】-各种类型参数解析原理
使用 `HttpMessageConverter`(如 `Jackson2HttpMessageConverter`)将 JSON 转换为 `User` 对象。- 使用 `TypeConverter` 将字符串数组转换为 `List<Long>`。- 使用 `TypeConverter` 将字符串转换为 `Long` 类型。- 使用 `TypeConverter` 将字符串转换为 `Long` 类型。- 从请求路径的矩阵变量中提取名为 `low` 和 `brand` 的值。
2025-05-30 13:16:58
401
原创 31、请求处理@MatrixVariable与UrlPathHelper
通过以上介绍,您可以在Spring Boot项目中正确使用`@MatrixVariable`和配置`UrlPathHelper`来处理矩阵变量,实现灵活的URL参数传递。- 可使用`List<String>`或`String[]`接收同名变量的多个值,如`/path;`分隔,格式为`path;low=34`,`path`是路径变量,`low`是矩阵变量。key=value`,`var`是路径变量,`key`是矩阵变量。- `brand`值为`["byd", "audi", "yd"]`
2025-05-30 13:15:38
461
原创 30、请求处理-@RequestAttribute
**请求转发**:特别适用于请求转发场景,当一个请求被转发到另一个处理程序时,可以通过`@RequestAttribute`访问在转发前设置的属性。- **重定向**:由于重定向会发起新的请求,原请求的属性将丢失,无法通过`@RequestAttribute`获取。- **作用范围**:`@RequestAttribute`获取的是当前请求域中的属性,仅限于本次请求的生命周期内有效。- **获取请求属性**:允许你在控制器方法参数中直接注入请求域中的属性值。- **`name`或`value`**
2025-05-29 12:37:00
847
原创 29、请求处理-常用参数注解使用
**说明**:在转发请求时,通过`HttpServletRequest`设置属性,然后在目标方法中通过`@RequestAttribute`获取。- **用途**:用于获取请求体的内容,通常用于处理`POST`、`PUT`等请求的JSON或XML数据。- **说明**:当请求`/user/123`时,`userId`会被赋值为`123`。- **说明**:获取名为`JSESSIONID`的Cookie值。- **说明**:获取请求中的`User-Agent`头信息。
2025-05-29 12:35:44
500
原创 28、请求处理-【源码分析】-请求映射原理
**参数解析**:使用 `HandlerMethodArgumentResolver` 解析请求参数,支持多种参数类型,如请求体 (`@RequestBody`)、路径变量 (`@PathVariable`)、请求头 (`@RequestHeader`) 等。保存了所有 `@RequestMapping` 注解与处理方法的映射关系。- **URL 路径匹配**:精确匹配、通配符匹配 (`*`)、路径变量 (`/{variable}`)、正则表达式 (`/{regex:pattern}`)。
2025-05-28 19:35:10
828
原创 27、请求处理-【源码分析】-怎么改变默认的_method
通过自定义 `HiddenHttpMethodFilter` Bean 并设置 `setMethodParam` 方法,覆盖了默认的配置,从而改变了 `_method` 参数的默认值。通过以上步骤,成功将 Spring Boot 中默认的 `_method` 参数修改为 `_m`,实现了自定义请求方法参数的功能。- 在表单中,将原先的 `_method` 隐藏域名称修改为 `_m`。1. **自定义 `HiddenHttpMethodFilter`**#### 修改默认 `_method` 参数。
2025-05-28 19:32:38
365
原创 26、请求处理-【源码分析】-Rest映射及源码解析
`@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = true)`:默认开启,可以通过`spring.mvc.hiddenmethod.filter.enabled`配置项关闭。- 如果存在,将请求方法替换为`_method`的值,从而将POST请求转换为PUT或DELETE等请求。- 检查请求中是否存在名为`_method`的参数。
2025-05-27 15:04:15
1006
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人