Spring MVC Java配置梳理

从Servlet到Spring Boot:Java Web开发核心技术演进与实战解析 本文详细解析了Java Web开发从Servlet到Spring Boot的技术演进历程,涵盖Servlet核心机制、Spring MVC结构化开发及Spring Boot的现代化实践。通过实战案例和代码示例,帮助开发者掌握注解驱动开发、Thymeleaf模板引擎和Spring Batch批处理等关键技术,提升Web应用开发效率与性能。 阅读详情

Spring MVC处理流程

  1. DispatcherServlet收到用户请求
  2. DS调用处理映射器来找到具体Controller
  3. DS将请求发送给具体Controller
  4. Controller返回ViewAndModel给DS
  5. DS通过视图解析器解析出具体视图位置
  6. DS用Model来渲染视图
  7. 被渲染的视图最终响应给用户

Servelet 3规范下的Spring MVC配置

创建继承AbstractAnnotationConfigDispatcherServletInitializer的配置类,通过覆盖该类方法来配置Servlet容器中的类容。

  1. getServletMappings 配置DispatcherServlet映射
  2. getRootConfigClasses 配置Root上下文配置类
  3. getServletConfigClasses 配置MVC上下文配置类

注意:

在Servlet 3规范下我们可以不用配置web.xml文件,所有配置全部在java中完成。
具体实现原理是:

Servlet 3容器会在类路径下查找实现javax.servlet.ServletContainerInitializer接口的类,如果发现的话,就会用他来配置Servlet容器。

Spring提供了实现该接口的SpringServletContainerInitializer类,此类又会查找实现WebApplicationInitializer接口的类来完成配置。

Spring为WebApplicationInitializer提供了一个便利的实现类AbstractAnnotationConfigDispatcherServletInitializer。

所以但我们提供一个继承AbstractAnnotationConfigDispatcherServletInitializer的配置类,SpringServletContainerInitializer将会发现它,并完成所有的Servlet容器的配置。

两个上下文的区别

  1. ContextLoaderListener创建的上下文用来配置后端的中间件和数据层
  2. DispatcherServlet启动时候创建的上下文用来配置MVC的组件,控制器,视图解析器等

MVC上下文配置类

基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口,WebMvcConfigurerAdapter 抽象类是对WebMvcConfigurer 接口的简单抽象(增加了一些默认实现),所以上面配置代码选择直接继承WebMvcConfigurerAdapter 。然后根据项目的需要实现接口中特定的方法,最后要注意的是,要在配置类上标注@EnableWebMvc。

但是这是远不够的,需要丰富更多的配置。

视图解析器配置示例

@Bean
  public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
  }

该示例配置了一个InternalResourceViewResolver解析器,通过根据逻辑视图名称,以及自定义的前后缀名来定义具体视图位置。

静态资源处理配置

@Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

MVC配置类需要继承WebMvcConfigurerAdapter类,通过重写父方法来完善MVC配置。

WebMvcConfigurerAdapter一些主要方法

  1. configureViewResolvers(ViewResolverRegistry registry);
    通过调用ViewResolverRegistry的方法来进行ViewResolvers的配置。

ViewResolverRegistry常用方法有:

->public UrlBasedViewResolverRegistration jsp(String prefix, String suffix) 用来注册InternalResourceViewResolver ,作用类似与直接在上下文中装配一个InternalResourceViewResolver的Bean。

->public void beanName() 用来注册BeanNameViewResolver,该解析器视图名称解析成对应的bean。什么意思呢?假如返回的视图名称是example,它会到spring容器中找有没有一个叫example的bean,并且这个bean是View.class类型的?如果有,返回这个bean。

->public void viewResolver(ViewResolver viewResolver)用来注册各种其他的,或者是自定义的视图解析器。

  1. addViewControllers(ViewControllerRegistry registry)
    此方法可以很方便的实现一个请求到视图的映射,而无需书写controller,例如:
@Override  
    public void addViewControllers(ViewControllerRegistry registry){  
        registry.addViewController("/login").setViewName("login");  
    } 
  1. addResourceHandlers(ResourceHandlerRegistry registry)
    此方法用来专门注册一个Handler,来处理静态资源的,例如:图片,js,css等。举例:
@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resource/**").addResourceLocations("/WEB-INF/static/");
    }

当你请求http://localhost:8083/resource/1.png时,会把/WEB-INF/static/1.png返回。注意:这里的静态资源是放置在WEB-INF目录下的。

  1. configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

此时会注册一个默认的Handler:DefaultServletHttpRequestHandler,这个Handler也是用来处理静态文件的,它会尝试映射/*。当DispatcherServelt映射/时(/ 和/* 是有区别的),并且没有找到合适的Handler来处理请求时,就会交给DefaultServletHttpRequestHandler 来处理。注意:这里的静态资源是放置在web根目录下,而非WEB-INF 下。

简单举个例子,例如在webroot目录下有一个图片1.png。由于DispatcherServlet配置了映射路径是:/ ,它几乎把所有的请求都拦截了,从而导致1.png 访问不到,这时注册一个DefaultServletHttpRequestHandler 就可以解决这个问题。其实可以理解为DispatcherServlet破坏了Servlet的一个特性(根目录下的文件可以直接访问),DefaultServletHttpRequestHandler是帮助回归这个特性的。

Java框架演进史:从SSH到SSM,再到Spring Boot的架构选择 本文详细解析了Java企业级框架从SSH到SSM,再到Spring Boot的演进历程。通过对比各框架的架构特点、性能表现和应用场景,帮助开发者理解现代Java开发的最佳实践。特别探讨了Spring Boot在微服务架构中的优势,为技术选型提供实用指南。 阅读详情

相关推荐

从手写 Servlet 到 Spring Boot:Java Web 技术演进与核心原理

《JavaWeb技术演进:从Servlet到SpringBoot的蜕变》文章摘要: 本文系统梳理了JavaWeb开发的技术演进历程。从原生Servlet/JSP的"手动挡"时代(需手动创建对象、配置XML),到SpringFramework引入IoC/DI实现解耦,再到SpringMVC通过注解驱动简化Web开发,最终演进至SpringBoot的"约定大于配置"极简模式。文章通过同一功能的代码对比,生动展示了技术迭代如何逐步消灭样板代码。核心在于:IoC实现控制反转、

yue200403的博客 103

Spring MVC 中的视图解析器是什么?如何配置它

在 Spring MVC 中,控制器(Controller)的主要职责是处理用户请求,并产生模型数据(Model),同时指定该请求的逻辑视图名称(Logical View Name)。视图解析器的作用是将逻辑视图名称解析成实际的视图对象,以便最终在浏览器中呈现给用户。例如,当用户请求一个 URL 时,控制器可以返回一个逻辑视图名称为 “home”,而视图解析器会将其解析成一个 JSP 页面,最终在浏览器中渲染出来。

IT徐师兄 6716

Java面试题集锦,Java常见面试问题汇总,有需要的小伙伴看过来

Spring Framework 现在几乎已成为 Java Web 开发的标配框架。那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢?不妨用本文的问题来检测一下。 本文内容主要翻译自Top 50 Spring Interview Questions You Must Prepare In 2018 1. 一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? Version Feature Spring 2.5 发布于 2..

wenyusuran的专栏 1123

Spring boot的拦截器基础篇(一)

原理:(1)拦截器实现了对每一个请求处理前后进行相关的业务,类似于Servlet的filter。让普通的bean实现HanlderInterceptor接口或者继承HandlerInterceptorAdapter类实现自定义的拦截器。(2)新建另外一个类通过继承重写WebMvcConfigurerAdapter的addInterceptors的方法来注册自定义的拦截器,业务含义是每次处理的时...

qq_31940707的博客 305

Spring MVC 框架学习总结

Spring MVC 框架学习总结

shiyu_951的博客 1141

基于单目视觉的四旋翼定点降落——如何通过mavros控制pixhawk(二)

    一直拖了这么久没有更新,怪我太懒啦~~~ 今天要特别感谢舒仔仔同学,我的好队友帮我写了这篇博文。这篇文章主要讲了如何通过mavros来控制pixhawk。硬件逻辑是这样子,我们先搞一个odroid(土豪上TX2),再用usb线将odroid与pixhawk连接。所以,odroid发送控制指令来控制pixhawk飞行。pixhawk与外界的通信协议是mavlink。ROS下面有个包叫mavr...

zhengyuxin0507的博客 1万+

Spring MVC常用配置

使用Spring MVC过程中,常用的一些配置。

codedot 1384

Ceres Solver:从入门到使用

Ceres Solver是谷歌开源的C++非线性优化库,能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中,尤其在谷歌开源的cartographer中被大量的使用。 ceres可以在Linux,Windows,macOS,Andrioid,IOS系统进行安装使用,详情可查看下方的官网链接。 Ceres Solver 官网:http://ceres-solver.org/

非晚非晚的博客 1万+

ContentNegotiation内容协商机制(三)---在视图View上的应用:ContentNegotiatingViewResolver深度解析【享学Spring MVC】

Spring MVC内容协商配置ContentNegotiationConfigurer ContentNegotiationManagerFactoryBean 使用内容协商实现多视图例 ContentNegotiatingViewResolver 内容协商的应用 ResourceHttpRequestHandler ExceptionHandlerExceptionResolver HttpE...

架构师:通透,才能写出好代码! 1956

Elasticsearch连接中断:深入解析Connection reset by peer问题及优化策略

本文深入解析Elasticsearch连接中断问题,特别是Connection reset by peer错误的成因与解决方案。从TCP层的心跳机制到客户端与服务端的配置差异,详细介绍了网络不稳定、防火墙拦截等常见原因,并提供了六种优化策略,包括KeepAlive调整、TCP参数调优和智能重试机制等,帮助提升Elasticsearch连接的稳定性。

weixin_42546392的博客 410

rv1126 读取sensor输入,输出到屏幕显示【RK_MPI API接口】

rv1126 libdrm VO

学习记录 1万+

Spring、Spring MVC 和 Spring Boot ,mybatis 相关面试题

MyBatis中#{}和${}的核心区别在于安全性:#{}采用预编译机制防止SQL注入,将参数视为纯数据;${}是直接字符串替换,存在SQL注入风险。最佳实践是优先使用#{},仅在动态表名/列名等特殊场景谨慎使用${},但必须配合严格的白名单校验。例如雪花ID分表时,应由服务端解析安全后缀而非直接使用用户输入,确保${}使用的安全性。

lfeishumomol的博客 415

别再死记公式了!用TL072运放设计带通滤波器,调出干净正弦波的实战心得与误区盘点

本文分享了使用TL072运放设计带通滤波器的实战经验,重点解决波形失真问题,提供单电源供电优化、动态调谐技巧及仿真与现实的参数修正方法,帮助工程师调出纯净正弦波。内容涵盖模拟电路设计中的常见误区与解决方案,适合电子工程师和爱好者参考。

weixin_29172963的博客 404

Spring家族四兄弟:一张图看懂他们的关系

Spring是一个生态体系(也可以说是技术体系),是集大成者,它包含了Spring Framework、Spring Boot、Spring Cloud等。它是一个轻量级**控制反转(IOC)和面向切面(AOP)**的容器框架,为开发者提供了一个简易的开发方式。Spring MVC是Spring的一部分,主要用于开发WEB应用和网络接口,它是Spring的一个模块,通过DispatcherServlet, ModelAndView和View Resolver,让应用开发变得很容易。是一套整合了框架的框架。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3282

WSL2+Ubuntu-22.04搭建PX4仿真环境:从零避坑到一键起飞

本文详细指导在Windows系统上通过WSL2和Ubuntu-22.04搭建PX4仿真开发环境的完整流程,涵盖环境配置、源码下载、依赖安装、Gazebo仿真及常见错误解决方案,帮助开发者从零避坑实现无人机一键起飞仿真。

k8s6orchestrator的博客 670

RLHF 家族的奇巧魔改:On Policy 与 Off Policy 路线大PK

无论是 On Policy 还是 Off Policy,RLHF 家族的“魔改”之路都充满了奇思妙想。相信随着研究的深入,RLHF 技术将会在 Alignment 领域发挥越来越重要的作用。

步子哥的博客 2082

【面试题-8】Spring/Spring MVC/Spring Boot/Spring Cloud

【面试题-8】Spring/Spring MVC/Spring Boot/Spring Cloud

小何的博客 2085

uni-app - 文本展开 / 收起折叠功能,支持自定义样式(当文本内容超出规定行数后,展开收起折叠的功能)兼容 H5 / App / 小程序且易用更容易修改的插件组件源码,超详细的示例代码及注释

uniapp实现文本的展开与收起功能,uniapp展开全部和收起,uniapp里文本的展开与收起,uniapp中文本内容超出规定行数后展开收起的处理,UNIAPP兼容h5、微信小程序多行文本展开或收起,uni-app中,文字超出隐藏并显示省略号(实现展开、收起全文),uni-app中文本过长-实现折叠与展开效果,中文本内容超出规定行数(字数)后展开收起的处理,超出部分...显示,uniapp适用于uniapp多行文本溢出显示...,多行文本展开或收起,uni-app-文本展开/收起折叠功能,支

🏆 前端领域优质创作者 5641

Spring全家桶深度解析:从Spring到Spring Cloud的技术演进之路

本文深入解析Spring生态系统四大核心框架:Spring提供IoC和AOP基础功能;SpringMVC专注于Web层开发;SpringBoot简化配置提升开发效率;SpringCloud解决微服务治理问题。四个框架各司其职又相互依赖,形成从单体应用到微服务架构的完整解决方案。文章详细对比了各框架的定位、适用场景和相互关系,为Java开发者技术选型提供指导。

J_liaty的博客 903

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring序言

本文概述了一个Spring技术专栏的规划框架,分为五大模块:Spring框架、Spring MVC、Spring Boot、Spring Cloud和第三方技术集成。目前已完成部分文章,如Bean声明、循环依赖、事务传播、Redis集成等,并标注了已完成文章的质量评分(最高91分)。专栏采用渐进式写作策略,记录2025年对Spring Cloud Gateway等内容的更新和质量优化。完整规划包含40余个技术主题,涵盖从核心原理到微服务架构的完整Spring技术栈。

你的指尖有改变世界的力量 2172

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java和Spring常用注解汇总

在Spring框架中,@Component和@Service都是用来将一个Java类标记为Spring容器中的一个组件。不过,在实际开发中,@Service通常用于标记业务层的Bean,而@Component则更为通用,可以用于标记任意层的Bean。具体而言,@Component表示通用的组件,可以用在任何层次。它是一个比较抽象的概念,可以用于标记任何需要被Spring容器管理的组件类。而@Service则表示服务层组件,用于标记服务层(业务层)的Bean。

Hanhahahahah的博客 900

从Spring MVC到云原生的Java技术演进与面试要点

Spring MVC作为经典的Java Web框架,采用前端控制器模式实现请求分发与处理,其松耦合的组件设计为开发者提供了高度灵活性。随着微服务架构的普及,Spring生态逐步演进为Spring Cloud体系,涵盖服务注册发现、负载均衡等分布式系统核心功能。在云原生时代,容器化与Service Mesh技术进一步重塑Java应用架构,要求开发者掌握K8s部署、JVM调优等技能。本文通过解析Spring MVC核心机制、微服务拆分原则及分布式事务方案,结合Eureka、Nacos等注册中心选型对比,帮助开发

weixin_29306571的博客 344

【Spring全家桶】-一文弄懂Spring框架

Spring不是一天学会的,但每天学一点,终将成为Spring大师!

【javatoai17819112191】→Java && python && AI Agent工程师 1108

Java EE 知识点总结

本文摘要介绍了JavaEE技术体系的核心内容,主要包括:1. JavaEE三层架构(表现层、业务层、持久层)及其技术演进;2. Web开发基础(HTTP协议、B/S与C/S架构比较、Maven工具);3. JSP技术(脚本元素、指令动作、内置对象);4. Servlet与Filter技术(生命周期、请求处理、监听机制);5. EL表达式与JSTL标签库;6. MVC设计模式实现;7. ORM框架(重点介绍MyBatis配置与动态SQL);8. Spring框架(IoC容器、AOP编程);9. SpringM

zxq2wz的博客 1059

2025最新版Java面试题总结(Spring篇-35问)

Java 是面向对象的编程语言,一个个实例对象相互合作组成了业务逻辑,原来,我们都是在代码里创建对象和对象的依赖。所谓的IOC(控制反转):就是由容器来负责控制对象的生命周期和对象间的关系。以前是我们想要什么,就自己创建什么,现在是我们需要什么,容器就给我们送来什么。引入IOC之前和引入IOC之后也就是说,控制对象生命周期的不再是引用它的对象,而是容器。对具体对象,以前是它控制其它对象,现在所有对象都被容器控制,所以这就叫控制反转。控制反转示意图DI(依赖注入)

jcc4261的博客 664
上一篇: Spring Core配置笔记
下一篇: Spring MVC后台表单校验
AlainGogogo
博客等级 码龄18年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值