深入理解 Spring MVC:DispatcherServlet 与视图解析机制
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Locale;
import java.util.Map;// 继承自 FrameworkServlet 的 DispatcherServlet 类,作为前端控制器
public class DispatcherServlet extends FrameworkServlet {// 前端控制器的核心方法,处理请求,返回视图,渲染视图,都是在这个方法中完成的。protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {// 假设这里有对请求进行预处理HttpServletRequest processedRequest = request;// 模拟处理器适配器和映射处理器HandlerAdapter ha = new SimpleHandlerAdapter();HandlerExecutionChain mappedHandler = new HandlerExecutionChain(new SimpleController());// 根据请求路径调用映射的处理器方法,处理器方法执行结束之后,返回逻辑视图名称// 返回逻辑视图名称之后,DispatcherServlet会将 逻辑视图名称ViewName + Model,将其封装为ModelAndView对象。ModelAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler());// 这行代码的作用是处理视图processDispatchResult(processedRequest, response, mappedHandler, mv, null);}private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,HandlerExecutionChain mappedHandler, ModelAndView mv,Exception dispatchException) throws Exception {// 渲染页面(将模板字符串转换成html代码响应到浏览器)render(mv, request, response);}protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {String viewName = mv.getViewName();// 这个方法的作用是将 逻辑视图名称 转换成 物理视图名称 ,并且最终返回视图对象ViewView view = resolveViewName(viewName, mv.getModelInternal(), Locale.getDefault(), request);// 真正的将模板字符串转换成HTML代码,并且将HTML代码响应给浏览器。(真正的渲染。)view.render(mv.getModelInternal(), request, response);}protected View resolveViewName(String viewName, Map<String, Object> model,Locale locale, HttpServletRequest request) throws Exception {// 其实这一行代码才是真正起作用的:将 逻辑视图名称 转换成 物理视图名称 ,并且最终返回视图对象ViewViewResolver viewResolver = new SimpleViewResolver();// 如果使用的是Thymeleaf,那么返回的视图对象:ThymeleafView对象。View view = viewResolver.resolveViewName(viewName, locale);return view;}
}// 处理器适配器接口
interface HandlerAdapter {ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}// 简单处理器适配器实现
class SimpleHandlerAdapter implements HandlerAdapter {@Overridepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof SimpleController) {SimpleController controller = (SimpleController) handler;return controller.handleRequest(request, response);}return null;}
}// 处理器执行链类
class HandlerExecutionChain {private final Object handler;public HandlerExecutionChain(Object handler) {this.handler = handler;}public Object getHandler() {return handler;}
}// 简单控制器类
class SimpleController {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {// 模拟返回逻辑视图名称和模型return new ModelAndView("testView", null);}
}// 模型和视图类
class ModelAndView {private final String viewName;private final Map<String, Object> model;public ModelAndView(String viewName, Map<String, Object> model) {this.viewName = viewName;this.model = model;}public String getViewName() {return viewName;}public Map<String, Object> getModelInternal() {return model;}
}// 这是一个接口(负责视图解析的)
interface ViewResolver {// 如果使用Thymeleaf,那么该接口的实现类就是:ThymeleafViewResolver// 这个方法就是将:逻辑视图名称 转换成 物理视图名称 ,并且最终返回视图对象ViewView resolveViewName(String viewName, Locale locale) throws Exception;
}// 简单视图解析器实现
class SimpleViewResolver implements ViewResolver {@Overridepublic View resolveViewName(String viewName, Locale locale) throws Exception {return new SimpleView();}
}// 这是一个接口(负责将 模板字符串 转换成HTML代码,响应给浏览器)
interface View {void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)throws Exception;
}// 简单视图实现
class SimpleView implements View {@Overridepublic void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {response.setContentType("text/html;charset=UTF-8");response.getWriter().write("<html><body><h1>Simple View Rendered</h1></body></html>");}
}// 模拟的 FrameworkServlet 类
abstract class FrameworkServlet {protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {// 空实现,由子类实现具体逻辑}
}
代码功能概述
这段 Java 代码实现了一个简单的前端控制器 DispatcherServlet
,它是整个 Web 请求处理流程的核心。其主要功能是接收客户端请求,根据请求路径调用对应的处理器方法,获取逻辑视图名称,将逻辑视图名称转换为物理视图名称,最终将模板字符串渲染成 HTML 代码并响应给客户端。同时,代码中定义了两个核心接口 ViewResolver
和 View
,分别负责视图解析和视图渲染。
代码解释
DispatcherServlet
类:作为前端控制器,继承自FrameworkServlet
。doDispatch
方法是核心方法,负责接收请求、调用处理器方法、获取逻辑视图名称并封装为ModelAndView
对象,最后调用processDispatchResult
方法处理视图。processDispatchResult
方法调用render
方法进行视图渲染。render
方法通过resolveViewName
方法将逻辑视图名称转换为物理视图名称并获取视图对象,最后调用视图对象的render
方法进行实际渲染。ViewResolver
接口:定义了resolveViewName
方法,用于将逻辑视图名称转换为物理视图名称并返回视图对象。View
接口:定义了render
方法,用于将模板字符串转换为 HTML 代码并响应给浏览器。- 其他辅助类:为了使代码能够完整运行,添加了
HandlerAdapter
、HandlerExecutionChain
、SimpleController
、ModelAndView
、SimpleViewResolver
和SimpleView
等类,分别模拟处理器适配器、处理器执行链、控制器、模型和视图、视图解析器和视图的实现。
结论
如果你想实现自己的视图,至少需要编写两个类:一个类实现 ViewResolver
接口,实现其中的 resolveViewName
方法;另一个类实现 View
接口,实现其中的 render
方法。这样就可以自定义视图的解析和渲染逻辑。
深入理解 Spring MVC:DispatcherServlet 与视图解析机制
在 Spring MVC 框架中,DispatcherServlet作为前端控制器,是整个请求处理流程的核心枢纽。它负责协调各个组件完成请求接收、处理器调用、视图解析和页面渲染等关键步骤。本文将通过源码级解析,带你理解 DispatcherServlet 的核心逻辑,并揭秘视图解析的两大关键接口ViewResolver与View的工作原理。
一、DispatcherServlet 核心流程:请求处理的 "总指挥"
DispatcherServlet继承自FrameworkServlet,其核心逻辑集中在doDispatch方法中,该方法串联了从请求接收到视图渲染的完整流程:
1. 处理器调用与 ModelAndView 生成
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {// 1. 预处理请求(示例代码简化处理)HttpServletRequest processedRequest = request;// 2. 模拟处理器适配与映射(实际由Spring容器管理)HandlerAdapter ha = new SimpleHandlerAdapter();HandlerExecutionChain mappedHandler = new HandlerExecutionChain(new SimpleController());// 3. 调用处理器方法,获取逻辑视图名+模型数据ModelAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler());// 4. 处理视图渲染逻辑processDispatchResult(processedRequest, response, mappedHandler, mv, null);
}
- 处理器适配:通过HandlerAdapter适配不同类型的处理器(如 @Controller 标注的控制器)
- 关键产出:ModelAndView对象封装了逻辑视图名(如 "user/list")和模型数据(如 Map 类型的参数)
2. 视图处理的关键步骤
private void processDispatchResult(...) {// 核心:调用render方法进行视图渲染render(mv, request, response);
}protected void render(ModelAndView mv, ...) throws Exception {// 1. 解析逻辑视图名 -> 物理视图对象View view = resolveViewName(mv.getViewName(), ...); // 2. 执行实际的视图渲染view.render(mv.getModelInternal(), request, response);
}
这里体现了 "两步走" 的视图处理逻辑:先解析视图类型,再执行渲染。接下来我们深入这两个核心环节。
二、两大核心接口:视图解析的 "左右护法"
1. ViewResolver:逻辑视图到物理视图的桥梁
public interface ViewResolver {// 将逻辑视图名(如"home")转换为具体的View实现类View resolveViewName(String viewName, Locale locale) throws Exception;
}
- 典型实现:Thymeleaf 对应ThymeleafViewResolver,FreeMarker 对应FreeMarkerViewResolver
- 核心逻辑:根据视图名拼接物理路径(如添加前缀 "/WEB-INF/views/" 和后缀 ".html"),并创建对应的 View 实例
2. View:模板渲染的实际执行者
public interface View {// 将模型数据渲染为HTML并响应给浏览器void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
- 核心职责:
- 加载模板文件(如 Thymeleaf 模板)
- 填充模型数据到模板
- 生成最终的 HTML 内容并写入响应流
三、完整代码示例:模拟 Spring MVC 核心组件
为了完整呈现流程,我们补充必要的辅助类(实际 Spring 中由框架提供):
1. 处理器相关组件
// 处理器适配器(模拟Spring的HandlerAdapter)
interface HandlerAdapter {ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}// 简单控制器(返回逻辑视图名"testView")
class SimpleController {public ModelAndView handleRequest(...) {return new ModelAndView("testView", null); // 无模型数据}
}// 模型与视图封装类
class ModelAndView {private final String viewName;private final Map<String, Object> model;// 构造器、getter方法省略
}
2. 自定义视图解析与渲染(简化实现)
// 简单视图解析器(返回自定义View实例)
class SimpleViewResolver implements ViewResolver {@Overridepublic View resolveViewName(String viewName, Locale locale) {return new SimpleView(); // 实际应根据视图名创建不同View}
}// 简单视图实现(直接返回固定HTML)
class SimpleView implements View {@Overridepublic void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html;charset=UTF-8");response.getWriter().write("<h1>Custom View Rendered!</h1>");}
}
四、如何实现自定义视图?两步走策略
如果你需要集成新的视图技术(如自定义模板引擎),只需完成以下两步:
1. 实现 ViewResolver 接口
public class MyViewResolver implements ViewResolver {private String prefix = "/views/";private String suffix = ".mytpl";@Overridepublic View resolveViewName(String viewName, Locale locale) {return new MyView(prefix + viewName + suffix); // 拼接物理路径}
}
2. 实现 View 接口
public class MyView implements View {private String templatePath;public MyView(String templatePath) {this.templatePath = templatePath;}@Overridepublic void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {// 1. 读取模板文件String template = Files.readString(Paths.get(templatePath));// 2. 数据填充(假设模板语法为{{key}})String html = template.replaceAll("\\{\\{([^\\}]+)\\}\\}", model.get("$1").toString());// 3. 输出响应response.getWriter().write(html);}
}
五、总结:理解框架设计的核心思想
通过剖析 DispatcherServlet 的源码逻辑,我们可以提炼出 Spring MVC 的两大设计精髓:
- 责任链模式:DispatcherServlet 作为核心协调者,将请求处理分解为处理器调用、视图解析、视图渲染等独立步骤,各组件通过接口解耦
- 策略模式:通过 ViewResolver 和 View 接口的不同实现,支持灵活切换视图技术(Thymeleaf/FreeMarker/ 自定义)
当我们需要扩展框架功能时(如支持新视图),只需遵循既定接口规范,即可无缝集成到现有流程中。这种 "约定大于配置" 的设计思想,正是 Spring 框架保持强大扩展性的关键所在。
理解这些核心机制后,我们不仅能更熟练地使用 Spring MVC 的现有功能,还能在遇到复杂需求时,基于框架扩展点实现优雅的解决方案。下次当你在配置文件中写下ThymeleafViewResolver时,应该能清晰联想到背后整个视图解析与渲染的流程了吧?
相关文章:
深入理解 Spring MVC:DispatcherServlet 与视图解析机制
import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Locale; import java.util.Map;// 继承自 FrameworkServlet 的 DispatcherServlet 类…...
Python基本语法(lambda表达式)
lambda表达式 lambda的一般形式是在关键字lambda后面跟一个或多个参数,之后再紧跟一个 冒号,接下来是一个表达式。lambda是一个表达式,而不是一个语句,它能够出现 在Python语法不允许def出现的地方。作为表达式,lambd…...
嵌入式按键原理、中断过程与中断程序设计(键盘扫描程序)
按键去抖动 通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号波型如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。…...
C++负载均衡远程调用学习之实时监测与自动发布功能
目录 1.LarsDns-V0.3BackenThread后端实时监控线程流程 2.LarsDns-V0.3加载当前Route版本号方法实现 3.LarsDns-V0.3加载RouteChange修改表的信息 4.LarsDns-V0.3实现实时监控流程线程业务 5.LarsDnsV0.3编译bug修改和功能测试 6.Lars Web管理界面的集成 7.LarsDnsV0.3 D…...
VSCode常用插件推荐
文章目录 VSCode常用插件推荐1 Git相关插件2 代码格式3 AI工具4 语言插件通用工具参考 VSCode常用插件推荐 1 Git相关插件 2 代码格式 3 AI工具 4 语言插件 通用工具 参考 50 个 VSCode 必装插件推荐 https://mp.weixin.qq.com/s/b_OKvg3hdavtnv7pbWcKWg...
性能优化实践:内存优化技巧
性能优化实践:内存优化技巧 在Flutter应用开发中,内存优化是提升应用性能的关键环节之一。本文将从实战角度深入探讨Flutter内存优化的各种技巧,帮助你构建高性能的Flutter应用。 一、内存分析工具使用 1. DevTools内存分析器 启动DevTool…...
WPF中Behaviors
行为的好处 可以把复杂的界面逻辑抽象出去,让xaml的界面设计更简单,更清爽 1.安装包 Microsoft.Xaml.Behaviors.Wpf2.简单实现拖动效果 <Border Width"100"Height"100"Background"Red"><i:Interaction.Behav…...
FreeRTOS菜鸟入门(十)·消息队列
目录 1. 基本概念 2. 数据存储 3. 运作机制 4. 阻塞机制 4.1 出队阻塞 4.2 入队阻塞 5. 操作示意图 5.1 创建队列 5.2 向队列发送第一个消息 5.3 向队列发送第二个消息 5.4 从队列读取消息 6. 消息队列控制块 7. 消息队列常用函数 7.1 消息队列创建…...
Day3:设置页面全局渐变线性渐变背景色uniapp壁纸实战
效果: 页面全局渐变线性渐变背景色会让这个设计更加有质感 想给页面加背景的时候,就给最外部的布局容器添加一个pageBg这样一个类别 接下来,我们就可以在之前写的common的公共的style里的common-style.css里改变它就行了 线性渐变࿱…...
Ray开源程序 是用于扩展 AI 和 Python 应用程序的统一框架。Ray 由一个核心分布式运行时和一组用于简化 ML 计算的 AI 库组成
一、软件介绍 文末提供程序和源码下载 Ray开源程序 是用于扩展 AI 和 Python 应用程序的统一框架。Ray 由一个核心分布式运行时和一组用于简化 ML 计算的 AI 库组成 二、Ray AI 库的更多信息 数据:适用于 ML 的可扩展数据集训练:分布式训练Tune&…...
19、权限控制:分院帽系统——React 19 RBAC实现
一、分院帽的魔法本质 "RBAC是霍格沃茨城堡的智能分院帽,用角色编织的星轨矩阵阻隔黑魔法入侵!" 魔法部安全司官员挥舞魔杖,角色-权限的量子纠缠态在空中交织成防护结界。 ——基于《国际魔法联合会》第7号安全协议,RB…...
P1802 5 倍经验日
P1802 5 倍经验日 - 洛谷 题目背景 复制Markdown {展开 进入IDE模式 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却无奈的看着那一些比他等级高的好友,想着能否把他们干掉。干掉能拿不少经验的。 题目描述 现在abs…...
赋予网页健壮的灵魂 —— TypeScript(下)
7 DOM 操作与类型定义:赋予网页真正的交互 回到最初的目标:让网页动起来。在 TypeScript 中,我们如何安全地操作 HTML 元素并响应用户的交互呢?TypeScript 提供了内置的类型定义来描述浏览器环境中的各种对象(如 docu…...
ARM Linux 设备树
Linux 设备驱动开发详解:基于最新的Linux 4.0内核, 机械工业出版社, 宋宝华, 2015 1. 设备树的起源 • 背景: ARM架构中大量板级代码冗余,硬编码在mach-xxx目录,设备树(Device Tree)引入结构化描述硬件。 • 目的: 减…...
35、C# 中的反射(Reflection)
反射是 C# 和 .NET 框架中的一个重要特性,它允许程序在运行时检查、访问和操作类型、对象、属性和方法等元数据信息。 反射的核心概念 运行时类型检查:反射允许你在程序运行时获取类型的详细信息,而不需要在编译时知道这些信息。动态操作&a…...
驱动中的 mmap() 函数和 file_operations 中的 mmap() 原型的区别
在 Linux 驱动开发中,mmap() 系统调用和 file_operations 结构中的 mmap() 方法虽然功能相关,但原型和用途有显著区别。以下是两者的详细对比: 1. 系统调用 mmap() 的原型 这是用户空间程序调用的系统调用接口,定义在 <sys/mma…...
Go语言八股文之Map详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
矿泉水瓶的绘制
1.制作中心矩形,大小为60,注意设置矩形的两条边相等 2.点击拉伸,高度为150mm 3.使用圆角命令,点击连接到开始面,同时选中4条边,进行圆角转化,圆角大小为10mm,点击多半径圆角…...
LeetCode 热题 100 54. 螺旋矩阵
LeetCode 热题 100 | 54. 螺旋矩阵 大家好,今天我们来解决一道经典的算法题——螺旋矩阵。这道题在LeetCode上被标记为中等难度,要求我们按照顺时针螺旋顺序返回矩阵中的所有元素。下面我将详细讲解解题思路,并附上Python代码实现。 问题描述…...
方案精读:业财融合转型路径和华为实践【附全文阅读】
在当今快速变化、竞争激烈的时代,业务面临不确定性,业财融合至关重要。以华为为例,其从财务到财经的转型,历经财务四统一变革、IFS 变革等,构建了包含财经能力中心(COE)、业务伙伴(BP)和财经共享中心(SSC)的财务组织架构 。通过实现财务四算拉通、提升预算预测、项目…...
AIDC智算中心建设:计算力核心技术解析
目录 一、智算中心发展概览 二、计算力核心技术解析 一、智算中心发展概览 智算中心是人工智能发展的关键基础设施,基于人工智能计算架构,提供人工智能应用所需算力服务、数据服务和算法服务的算力基础设施,融合高性能计算设备、高速网络以…...
Javase 基础加强 —— 02 泛型
本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。 01 认识泛型…...
PowerShell 备份 Windows10/11 还原计算机驱动程序SOP
一、现在计算机C目录下创建一个新的文件夹名称为 driverbackup 二、打开cmd 以管理员身份执行 dism /online /export-driver /destination: C:\driverbackup 在正常情况下,Windows 10会自动检测您的设备所需的驱动程序,并将其安装到您的PC上。 但是&am…...
Python 中的 collections 库:高效数据结构的利器
Python 中的 collections 库:高效数据结构的利器 在 Python 编程中,数据结构的高效使用往往能极大地提升代码的性能和可读性。今天,就让我们来深入了解一下 Python 的 collections 库,它是一个非常实用且强大的工具库,…...
2025年- H24-Lc132-94. 二叉树的中序遍历(树)---java版。
1.题目描述 2.思路 递归遍历:返回值,中序遍历的节点值列表 List。 (1)首先是一个中序遍历的结果函数,传入root参数,定义一个节点值列表result,然后递归调用中序遍历的函数 (2&#…...
第十六届蓝桥杯单片机组省赛(第一套)
看到很多人在问第十六届蓝桥杯单片机难不难,以及实现多少功能可以获得省一。 先介绍下我的作答情况吧,选择题只对一题,程序题的求连续两次距离差值没有考虑负数的情况,其他功能都实现了,成绩是福建省省一第一页&#x…...
使用python写多文件#inlcude
使用下面的程序可以将当前文件夹下面的.c文件的写入main.h文件,我这里是将自己的基于标准库stm32初始化io文件为例。 import osbase ["#ifndef main_H","#define main_H\n","#endif" ]includes set() for file in os.listdir():if…...
深度学习中保存最优模型的实践与探索:以食物图像分类为例
深度学习中保存最优模型的实践与探索:以食物图像分类为例 在深度学习的模型训练过程中,训练一个性能良好的模型往往需要耗费大量的时间和计算资源。而保存最优模型不仅可以避免重复训练,还能方便后续使用和部署。本文将结合食物图像分类的代…...
OpenCv实战笔记(2)基于opencv和qt对图像进行灰度化 → 降噪 → 边缘检测预处理及显示
一、实现效果 二、应用场景 这三步是经典的 “灰度化 → 降噪 → 边缘检测” 预处理流程,常用于: 计算机视觉任务(如物体识别、特征提取)。 图像分析(如文档扫描、车牌识别)。 减少后续算法的计算复杂度&a…...
个人文章不设置vip
今天没登录打开自己文章,发现自己读自己文章还要充值。就感觉很扯。 继而去查看个人的历史文章,发现很多被标注为高质量的文章设置成了VIP文章。 如果仅有一两篇,还可能是本人手滑误设置,这么多就解释不通了。 (大概有…...
【聚类分析】基于copula的风光联合场景生成与缩减
目录 1 主要内容 风光出力场景生成方法 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序方法复现《融合风光出力场景生成的多能互补微网系统优化配置》风光出力场景生成部分,目前大多数研究的是不计风光出力之间的相关性影响,但是地理位置相近…...
CSDN积分详解(介绍、获取、用途)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 积分**一、积分类型及用途****二、积分获取途…...
运维--计划任务
计划任务分为一次性和循环性的计划任务 1.date的用法 date 月日时分年 eg:date 100118222023 date:查看时间和日期、修改时间和日期 获取当前日期:date +%F F:日期 获取当前时间:date +%H:%M:%S H:时 M:分 S:秒 获取周几: date +%w w:周 …...
AVL树(2):
我们之前讲AVL树,我们讲到了旋转,然后讲了左单旋和右单旋。 但是我们这里的单旋产生的条件都是纯粹的一边比较高, 我们看上面这个图片,当我们插入新的结点导致一边的子树比较高的时候,我们必须是存粹的一边高…...
架构思维:异构数据的同步一致性方案
文章目录 一、引言二、全景架构回顾三、潜在问题问题1:Binlog 延迟——理想 vs 实际问题2:Binlog 格式解析问题3:高可靠消费1. 串行 ACK 消费2. 并行消费+乱序风险3. 解决方案 问题4:缓存数据结构设计1. Key–Value 冗…...
nginx 正反向代理和nginx正则
目录 一. 正向代理 1. 编译安装Nginx 2. 配置正向代理 二. 反向代理 1. 配置nginx七层代理 2. 配置nginx四层代理 三. Nginx 缓存 1. 缓存功能的核心原理和缓存类型 2. 代理缓存功能设置 四. Nginx rewrite和正则 1. Nginx正则 2. nginx location 3. Rewrite …...
SAM-Decoding_ 后缀自动机助力大模型推理加速!
SAM-Decoding: 后缀自动机助力大模型推理加速! 大语言模型(LLMs)的推理效率一直是研究热点。本文介绍的SAM-Decoding方法,借助后缀自动机(Suffix Automaton,SAM)实现推测解码,在提升…...
使用Scrapy构建高效网络爬虫:从入门到数据导出全流程
在数据驱动的时代,网络爬虫已成为获取公开信息的核心工具。本文将带您通过Scrapy框架完成一个实战项目,涵盖从零搭建爬虫到多格式数据导出的完整流程,并深入解析Scrapy的Feed Exports功能。 一、项目背景与目标 我们将爬取书籍网站ÿ…...
Docker安装Gitblit(图文教程)
本章教程,使用Docker安装部署Gitblit。 一、Gitblit简介 Gitblit 是一个基于 Java 的 Git 仓库管理工具,主要用于在局域网或小型团队环境中搭建私有 Git 服务器。它提供了一个简单易用的 Web 界面,用于浏览代码、管理仓库和用户权限等。 二、拉取镜像 sudo docker pull git…...
SpringBoot的汽车商城后台管理系统源码开发实现
概述 汽车商城后台管理系统专为汽车4S店和经销商设计,提供全面的汽车管理系统解决方案。 主要内容 1. 核心功能模块 系统提供以下主要功能: 销售管理:记录销售信息,跟踪交易进度客户管理:维护客户…...
组合模式(Composite Pattern)
非常棒!你现在进入了结构型设计模式中最典型的「树形结构」设计模式 —— 组合模式(Composite Pattern)。 我将通过简明解释 清晰代码 类图演示,一步步帮你理解它。 🧠 一句话定义 组合模式允许你将对象组合成树形结…...
Java捕获InterruptedException异常后,会自动清空中断状态
InterruptedException异常一般是在一个线程处于等待(像Thread.sleep()、Object.wait()、Thread.join()等方法)状态时被另一个线程调用interrupt()方法中断而抛出的。一旦捕获到InterruptedException,Java 会自动清除该线程的中断状态。 以下…...
HTML04:图像标签
图像标签 常见的图像标签 JPGGIFPNGBMP <img src"路径" alt"名称" title"悬停名称" width"高" height"宽"/><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…...
供应链算法整理(二)--- 智能补货
供应链业务的目标价值是:优化货品的供给、销售提供支撑,以降低成本,提高时效、收益,最终提升用户体验。基于目标价值,整体的算法模块分为:智能选品、智能预测、品仓铺货、智能补货、智能调拨、仓网路由、快…...
【毕设通关】——Word交叉引用
📖 前言:在论文中,我们经常会在文段贴图片时,写“如图x所示”的内容,如果每次都手动写数字,那么当需要在前面内容插入图片时,后续更新会很繁琐,这时就需要交叉引用功能。 ǵ…...
java技术总监简历模板
模板信息 简历范文名称:java技术总监简历模板,所属行业:其他 | 职位,模板编号:XDNUTA 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工作…...
视频编解码学习三之显示器
整理自:显示器_百度百科,触摸屏_百度百科,百度安全验证 分为阴极射线管显示器(CRT),等离子显示器PDP,液晶显示器LCD 液晶显示器的组成。一般来说,液晶显示器由以下几个部分组成: […...
【人工智能】大模型安全的深度剖析:DeepSeek漏洞分析与防护实践
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的广泛应用,其安全性问题日益凸显。DeepSeek作为中国领先的开源AI模型,以低成本和高性能著称,但近期暴露的数据库…...
架构思维:使用懒加载架构实现高性能读服务
文章目录 一、引言二、读服务的功能性需求三、两大基本设计原则1. 架构尽量不要分层2. 代码尽可能简单 四、实战方案:懒加载架构及其四大挑战五、改进思路六、总结与思考题 一、引言 在任何后台系统设计中,「读多写少」的业务场景占据主流:浏…...
【AI提示词】黑天鹅模型专家
提示说明 详细解释黑天鹅模型的理论背景、定义、分类及其在不同领域的应用。 提示词 # Role: 黑天鹅模型专家## Profile - language: 中文 - description: 详细解释黑天鹅模型的理论背景、定义、分类及其在不同领域的应用 - background: 黑天鹅模型是尼尔斯莫尔提出的理论&a…...