06.Spring Framework 之 Web

(01)Spring Framework文档 Mock对象,TestContext框架,Spring MVC测试,WebTestClient。IoC容器,事件,资源,i18n,验证,数据绑定,类型转换,SpEL,AOP,AOT。REST客户端,JMS,JCA,JMX,电子邮件,任务,调度,缓存,可视化。Spring MVC、WebSocket、SockJS、STOMP消息。事务、DAO支持、JDBC、R2DBC、O/R映射、XML封送。Kotlin,Groovy,动态语言。历史,设计理念,反馈,入门。 阅读详情

1. Servlet3.0 新特性

1.1 Servlet 新特性

web 容器在启动的时候,会扫描每个 jar 包下的 META-INF/services/javax.servlet.ServletContainerInitializer,可以使用 @HandlesTypes 将指定的类传入到 onStartup(Set<Class<?>> set, ServletContext servletContext) 方法中的 set 集合里

1.2 环境搭建

代码已经上传至 https://github.com/masteryourself-tutorial/tutorial-spring ,详见 tutorial-spring-framework/tutorial-spring-framework-servlet3.0 工程

1.2.1 配置文件
1. pom.xml
<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
2. META-INF/services/javax.servlet.ServletContainerInitializer
pers.masteryourself.tutorial.spring.framework.servlet3.MyServletContainerInitializer
1.2.2 核心代码
1. MyServletContainerInitializer
@HandlesTypes(ServletInitializer.class)
public class MyServletContainerInitializer implements ServletContainerInitializer {

    @Override
    public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
        // 打印 @HandlesTypes 传入的类
        for (Class<?> clazz : set) {
            System.out.println("@HandlesTypes 传入的类有:" + clazz.getName());
        }
        // 注册组件
        servletContext.addServlet("MyHttpServlet", MyHttpServlet.class)
                .addMapping("/servlet3");
        servletContext.addListener(MyServletContextListener.class);
        servletContext.addFilter("MyFilter", MyFilter.class)
                .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");

    }

}

2. Spring MVC 定制

2.1 Spring MVC 集成原理

在 spring-web-xxx.RELEASE.jar 里,META-INF/services/javax.servlet.ServletContainerInitializer 所对应的内容是 org.springframework.web.SpringServletContainerInitializer

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {

它在 onStartup() 方法里会去回调每一个 initializer 的 onStartup(servletContext) 方法,然后分别初始化 Spring 容器和 Spring MVC 容器,最后通过 ContextLoaderListener#contextInitialized() 和 HttpServletBean#init() 完成容器的 refresh() 操作
启动 Spring 容器和 Spring MVC 容器

2.2 环境搭建

代码已经上传至 https://github.com/masteryourself-tutorial/tutorial-spring ,详见 tutorial-spring-framework/tutorial-spring-framework-web 工程

2.2.1 配置文件
1. pom.xml
<packaging>war</packaging>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
2.2.2 核心代码
1. MyWebAppInitializer
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    /**
     * 获取 Spring 配置,相当于 Spring 父容器
     *
     * @return
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    /**
     * 获取 SpringMVC 配置文件,相当于 Spring 子容器
     *
     * @return
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    /**
     * 获取 DispatcherServlet 的映射信息
     * /:拦截所有请求(包括静态资源(xx.js,xx.png)),但是不包括 *.jsp
     * /*:拦截所有请求;连 *.jsp 页面都拦截;jsp 页面是 tomcat 的 jsp 引擎解析的
     *
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

}
2. SpringConfig
@ComponentScan(value = "pers.masteryourself.tutorial.spring.framework.web", excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
})
public class SpringConfig {
}
3. SpringMvcConfig
@ComponentScan(value = "pers.masteryourself.tutorial.spring.framework.web", includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {

    /**
     * 视图解析器
     *
     * @param registry
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }

    /**
     * 静态资源访问
     *
     * @param configurer
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    /**
     * 拦截器
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                System.out.println("MyInterceptor preHandle");
                return true;
            }

            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
                System.out.println("MyInterceptor postHandle");
            }

            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
                System.out.println("MyInterceptor afterCompletion");
            }
        }).addPathPatterns("/**");
    }

}

3. 异步处理

代码已经上传至 https://github.com/masteryourself-tutorial/tutorial-spring ,详见 tutorial-spring-framework/tutorial-spring-framework-async 工程

3.1 异步 Callable
3.1.1 核心代码
1. AsyncController
@Controller
public class AsyncController {

    /**
     * 如果方法返回 {@link Callable},Spring 将会异步处理,将任务提交到 {@link org.springframework.core.task.TaskExecutor},使用一个隔离的线程执行
     * {@link org.springframework.web.servlet.DispatcherServlet} 和所以的 {@link javax.servlet.Filter} 退出 web 容器的线程,但是 response 保持打开状态
     * {@link Callable} 返回结果,Spring MVC 将请求重新派发给容器,恢复之前的处理,根据 {@link Callable} 返回的结果,Spring MVC 继续进行视图渲染流程(接收请求 -> 视图渲染)
     *
     * @return
     */
    @RequestMapping(value = "/async")
    @ResponseBody
    public Callable<String> async() {
        System.out.println("主线程开始:" + Thread.currentThread().getName());
        Callable<String> result = () -> {
            System.out.println("任务线程开始:" + Thread.currentThread().getName());
            TimeUnit.SECONDS.sleep(2);
            System.out.println("任务线程结束:" + Thread.currentThread().getName());
            return "success";
        };
        System.out.println("主线程结束:" + Thread.currentThread().getName());
        return result;

        // 主线程开始:http-nio-8080-exec-4
        //主线程结束:http-nio-8080-exec-4
        //任务线程开始:MvcAsync1
        //任务线程结束:MvcAsync1
    }

}
3.2 长连接 DeferredResult
3.2.1 核心代码
1. AsyncController
@Controller
public class DeferredResultController {

    private Queue<DeferredResult<String>> queue = new ConcurrentLinkedQueue<>();

    /**
     * 可以将返回值定义成 {@link DeferredResult},一旦调用 setResult() 方法,就会返回结果
     *
     * @return
     */
    @ResponseBody
    @RequestMapping("/createOrder")
    public DeferredResult<String> createOrder() {
        DeferredResult<String> deferredResult = new DeferredResult<>((long) 3000, "create fail...");
        queue.add(deferredResult);
        return deferredResult;
    }

    @ResponseBody
    @RequestMapping("/doCreate")
    public String doCreate() {
        DeferredResult<String> deferredResult = queue.poll();
        if (deferredResult == null) {
            return null;
        }
        deferredResult.setResult(UUID.randomUUID().toString());
        return "success";
    }

}
Spring Framework 路径遍历漏洞复现(CVE-2024-38819) Spring Framework 存在路径遍历漏洞,当应用程序使用WebMvc.fn 或 WebFlux.fn 提供静态资源时,恶意攻击者通过编写特殊HTTP请求并获取目标系统上任何由Spring应用程序正在运行的进程访问的文件,从而导致信息泄露。 阅读详情

相关推荐

(SCADA)监控与数据采集系统

SCADA应用于监控和采集数据来控制工业过程软件。它通过收集和传输实时数据,帮助操作员监视和控制各种设备和过程。

软件技术的专栏 4545

Spring框架的搭建学习

1、Spring框架的搭建 这个很简单,只需要web容器中注册org.springframework.web.context.ContextLoaderListener,并指定spring加载配置文件,那么spring容器搭建完成。(当然org.springframework的核心jar包需要引入) 当然为了更加易用支持J2EE应用,一般我们还会加上如下: Sprin

qq_39048503的博客 376

在带有Intel Arc GPU的Windows上安装IPEX-LLM

本文将介绍在 Intel Arc GPU 环境下安装 IPEX-LLM。

wux_labs的博客 1636

Spring框架入门(六)---Web项目

第六章、Spring与Web 之前做的javase项目中是有main方法或者测试方法的,执行代码是执行main方法的,因此在main方法里面创建容器对象。执行一次main方法,创建一次容器对象。 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 而web项目是在Tomcat服务器上运行的,tomcat一启动,项目就一直运行。 下面举一个实例:在...

xxyneymar的博客 528

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 602

2.1 量子精密测量:SERF原子陀螺仪中的核自旋-电子自旋强耦合机制

本文深入解析了SERF原子陀螺仪中核自旋-电子自旋强耦合机制的核心原理与应用。通过量子精密测量技术,SERF陀螺仪实现了超高精度的惯性导航,其独特的磁场自补偿和拉莫尔进动特性使其在弱磁场环境下表现出色。文章还探讨了关键技术突破和前沿进展,展示了量子精密测量在惯性导航领域的巨大潜力。

kotlin6android的博客 212

springWEB搭建

注解@RestController 类似@Service 这些注解标签 表示此类是控制层类,并且会创建对象放进spring容容器里@RequestMapping(path = “/loginCtl”) 用来为类和方法定义映射地址, 必须是整个项目里唯一的可以使用value=""或者path=""都可以使用来定义对外访问地址@RequestMapping(path = “/loginCtl”) 在方法上使用时, 还可以添加访问的类型。

weixin_69252724的博客 1736

S32K144 ADC硬件触发实战:PDB模块配置与DMA传输全流程解析

本文详细解析了S32K144微控制器中ADC硬件触发的全流程实现。通过配置PDB模块产生精确的定时触发信号,并联动DMA实现转换数据的自动搬运,构建了一个无需CPU干预的高效、低抖动数据采集系统。文章深入讲解了时钟配置、模块初始化、DMA引擎搭建及实战调试技巧,为汽车电子和工业控制应用提供了可靠的解决方案。

weixin_29174141的博客 226

SpringFrameworkWeb补充

SpringWeb基础 关于SpringWeb那是老生常谈的东西了,搭建web环境的方法都记载在了SSM框架搭建方法中,参照即可。这篇笔记是对web一些内容的补充。 一、关于web中如何进行数据校验 SpringWeb对于数据校验提供了支持方式如下: 1、添加依赖: SpringBoot需要添加starter依赖 Spring需要添加hibernate-validator依赖 <!-- SpringBoot --> <dependency> <groupId>or

AC_sunK的博客 410

基于YOLOv26的智能农业无人机巡检系统

本文提出了一种基于YOLOv26的智能农业无人机巡检系统。系统采用模块化设计,包含数据采集、预处理、目标检测、图像拼接、分析决策和部署控制六大核心模块。无人机搭载多光谱相机、RGB相机和热红外相机进行农田数据采集,通过YOLOv26实现作物病虫害、杂草及灌溉设备的检测。系统采用PyTorch、OpenCV等技术栈,支持无人机自动路径规划和多传感器数据采集,并包含数据增强和预处理功能。该系统可有效提升农业巡检效率,为精准农业提供智能化解决方案。

一键难忘的博客 809

授时中心被攻击?Windows 11 电脑时间不准?手把手教您如何更换国内稳定高速的时间服务器(时间服务器整理)

近期授时中心被攻击,时间同步重要性凸显。Windows 11 默认服务器在国内常遇网络问题。本文教你轻松修改时间服务器,选择更稳定、快速的国内优质服务器,彻底解决电脑时间不准的烦恼,让你的系统时间永远精准如一!🚀

XiaoqiangClub的博客 1086

Spring框架——springweb(一篇包会)

本篇是有关spring框架中有关springweb部分知识的详细介绍。

2301_78341216的博客 3655

LPDDR6 技术标准详解(JESD209-6)

是继 LPDDR5/5X 之后的新一代低功耗 DRAM 标准,专为满足移动终端、AI、边缘计算等高带宽、低功耗场景而设计。该标准通过全新架构、动态功耗控制机制和增强型数据完整性机制,实现性能、能效与可靠性的全面升级。LPDDR6 并非仅是速度升级,更是内存架构设计思路的演进,围绕“低功耗 + 高带宽 + 强安全”的三维目标,构建下一代 SoC 平台关键基础。✅ 高带宽:支持 32B/64B 动态突发✅ 低功耗:动态电压、通道切换✅ 高可靠性:ECC + 自测试 + 安全区。

weixin_43199439的博客 2584

06.Spring Framework 源码解析之 web 启动原理

1. 环境搭建 代码已经上传至 https://github.com/masteryourself/spring-framework,工程是 tutorial-spring-web 2. 源码解析 详细的源码注释可参考 https://github.com/masteryourself/spring-framework 2.1 Spring 父子容器构造 2.1.1 流程分析 基于 se...

masteryourself 444

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring 框架(Spring Framework)使用详解

Spring 框架(Spring Framework)使用详解

墨鸦的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring Framework 深度解析系列

本系列文章深入解析Spring Framework核心原理,涵盖IoC容器、AOP、事务管理、Web开发(MVC/WebFlux)、数据访问等核心模块。基于Spring 6.x和Java 17+,提供详细代码示例和实际案例,适合不同层次的开发者。从基础概念到高级特性,系统讲解Spring架构设计、实现机制及最佳实践,并附有官方文档、源码地址和推荐书籍等学习资源。文章采用Apache 2.0许可证,欢迎反馈和贡献。

智慧是做事用的 177

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

[Java复习06] Spring Framework 框架小结

Spring 总共大约有 20 个模块,由 1300 多个不同的文件构成。 而这些组件被分别整合在 核心容器 (Core Container), AOP(Aspect Oriented Programming), 设备支持(Instrumentation), 数据访问及集成(Data Access/Integeration)- JDBC, ORM, JMS, T...

weixin_30702887的博客 111

Spring Boot 3.5 还有免费安全更新吗?OSS 支持已于 2026-06-30 结束,附离线自查工具

Spring Boot 3.5.x 的 OSS 支持已于 2026-06-30 结束,同一天断供的 Spring 项目共 46 个。这件事不产生 CVE 编号,Dependabot 和 OSV 都不会告警。一个离线工具帮你查清。

P191117的博客 769

ESPnet2 ACESinger-KiSing-V2 歌声合成实战:数据构建与 VISinger 训练指南

ACESinger-KiSing-V2(`egs2/kising/svs1`)是 ESPnet2 中一个以 ACESinger 数据增强方案扩充的中文歌声合成(SVS)recipe。本文从数据集目录规范、自动下载与处理脚本、Kaldi 风格数据目录生成,到 VISinger/VISinger2 的完整训练与评估流程进行系统讲解,读者可以据此端到端复现该 recipe,并理解 ESPnet2 SVS

gitblog_00577的博客 825

小马哥spring编程核心思想_求小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework教程...

这次搜集了下小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework,最强Spring全面核心实战的视频教程,有需要的朋友可以自行下载学习。课程简介:小马哥出手的Spring栈核心编程思想课程,可以说是非常专业和权威的Spring课程。课程主要的方向与核心是Spring Framework总览,带领同学们重新认识重新认识IoC,Spring IoC容器概述课程。Spr...

weixin_39662462的博客 2476

Spring 中的AnnotationConfigWebApplicationContext

是 Spring Framework 中用于支持基于注解的 Web 应用程序配置的类,位于包中。它是的一个实现,允许通过使用 Java 注解来设置和管理 Spring 的上下文。

龙大的博客 1440

Spring Framework 5.0新增的WebClient

Spring Framework 5.0 引入了 `WebClient`,这是一个新的非阻塞、响应式 Web 客户端 API,旨在为构建响应式微服务提供更好的支持。`WebClient` 是基于 Project Reactor 的响应式流 API 构建的,它可以高效地处理大量的并发请求,非常适合现代微服务架构。

svygh123的专栏 871

spring-framework4.3

spring-framework4.3 参考《https://docs.spring.io/spring/docs/4.3.25.RELEASE/spring-framework-reference/htmlsingle/》4.3.25.RELEASE 修改记录 日期 章节 状态 2019-12-06 Spring开始 OK 2019-12-06 依赖注入和控制反转 OK 第一部分:Sprin...

czl315的博客 452

Spring Framework面试题

Spring的IoC容器的启动过程,核心流程是将bean的配置项从不同渠道,包括XML、注解或者配置文件中读取和解析后,生成BeanDefinition的过程,在这过程中IoC容器会进行refresh操作,这个过程可以设置一些BeanPostProcesser的前置或后置操作,在执行完这些操作后,BeanDefinition就会被注册到BeanDefinitionRegistry容器中。Spring的事务管理的作用是保证每一次和数据库的交互都是可靠的,在Spring中有两种事务管理方式。

yangnk的技术记录 220

【Spring Framework】Spring IoC与AOP:从原理到实战的全方位解析(Spring Framework)

本文深入剖析了Spring框架的核心——IoC与AOP。从理论基础到实战应用,通过丰富的代码示例和最佳实践,帮助读者掌握Spring IoC容器的工作原理及AOP的实现技巧。无论您是Spring的新手还是资深开发者,都能从中受益,学会如何构建高效的应用程序,并解决常见的开发问题,如日志记录、安全检查等。本文将带领您从零开始,逐步深入Spring IoC和AOP的世界,助您成为Spring领域的专家。

欢迎来到我的技术空间!我是一名经验丰富的Java开发工程师,热衷于分享我在软件开发领域的知识和心得。在这个博客里,您会发现一系列关于Java编程的文章,包括最佳实践、技术趋势、代码优化技巧以及一些有趣的项目案例。无论是初学者还是有经验的开发者,都能在这里找 1444

Spring Boot 3 入门介绍

Spring Boot 3是基于Java 17和Spring Framework 6的轻量级框架,旨在简化Spring应用的初始化和开发过程。它支持自动配置、嵌入式Web服务器等功能,并引入了对Java 17、Jakarta EE 9、GraalVM原生镜像等新特性的支持,显著提升了开发体验和应用性能。Spring Boot 3还优化了性能、增强了安全性,并改进了配置系统和依赖管理机制。尽管与Spring Boot 2.x保持兼容性,但迁移时需注意API和配置的更新。

一个老Java开发的自白 1911
上一篇: 02.ActiveMQ 源码解析之发送消息
下一篇: 08.Spring Framework 之自动装配模式
masteryourself
博客等级 码龄9年 13粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值