Java外功基础(1)——Spring Web MVC

Java外功基础(1)——Spring Web MVC

1.前置知识

1.1 Tomcat

定义:Tomcat是一个开源的轻量级Web(Http)服务器和Servlet容器。它实现了Java Servlet等Java EE规范的核心功能,常用于部署和运行Java Web应用程序 。换言之,Tomcat就是一个严格遵循Servlet规范开发出来的、可以独立安装和运行的Java Web服务器/Servlet容器核心功能:Servlet容器:支持Servlet的执行,处理HTTP请求和响应Web服务器:提供静态资源(如HTML)的访问能力,支持基本的HTTP服务安装与版本对应:
tomcat官网Apache Tomcat®目录结构:bin:存放可执行文件,如startup.batconf:存放配置文件lib:存放Tomcat运行所需的jar文件logs:存储日志文件temp:存放临时文件,如上传的文件或缓存数据webapps:默认web应用部署目录work:服务器的工作目录,存放运行时生成的临时文件(编译文件)

1.2 Servlet

1.2.1 定义

Servlet是Java语言编写的、运行在服务器端的程序,它遵循一套标准的API规范(Tomcat是这套规范的一个具体实现/容器,并提供了让Servlet与前端交互的运行时环境)

1.2.2 API示范

创建项目/配置文件:
(1)在IEDA中创建Maven项目
(2)在pom.xml文件中添加servlet依赖(置于< project >< /project >标签下)

<dependencies><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><!--servlet依赖版本应与jdk和tomcat的版本相匹配--><version>6.1.0</version><scope>provided</scope></dependency></dependencies>

(3)在main路径下创建webapp/Web-INF/web.xml,在xml文件中添加以下内容

<!DOCTYPEweb-appPUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><display-name>Archetype Created Web Application</display-name></web-app>

(4)下载插件:Smart Tomcat(为了方便启动项目)

在这里插入图片描述


API示例:

importjakarta.servlet.annotation.WebServlet;importjakarta.servlet.http.HttpServlet;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importjava.io.IOException;//设置访问路径(url)@WebServlet("/method")//继承HttpServlet并重写doGet和doPost方法publicclassMethodServletextendsHttpServlet{//接收method=post的请求@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsIOException{System.out.println("doPost"); resp.setContentType("text/html; charset=utf-8"); resp.getWriter().write("doPost");}//接收method=put的请求@OverrideprotectedvoiddoPut(HttpServletRequest req,HttpServletResponse resp)throwsIOException{System.out.println("doPut"); resp.setContentType("text/html; charset=utf-8"); resp.getWriter().write("doPut");}//接收method=delete的请求@OverrideprotectedvoiddoDelete(HttpServletRequest req,HttpServletResponse resp)throwsIOException{System.out.println("doDelete"); resp.setContentType("text/html; charset=utf-8"); resp.getWriter().write("doDelete");}}
在这里插入图片描述

1.2.3 生命周期

定义:Servlet 生命周期由 Web容器(如Tomcat)管理,包含加载、初始化、处理请求和销毁四个阶段。每个阶段对应特定的方法调用,开发者可通过重写这些方法实现自定义逻辑1.类加载:Web容器通过类加载器加载 Servlet 类(通常首次请求触发或容器启动时预加载,字节码文件被加载到内存但未实例化)。具体类加载流程请阅读:Java虚拟机——JVM(Java
Virtual
Machine)解析一
1.5 实例化:确认Servlet类成功加载后立刻执行,在整个Web容器中每种Servlet类(如HttpServlet)只会有一个实例化对象2.初始化:Web容器调用刚刚创建好的Servlet实例的init(ServletConfig config)方法,在整个servlet实例的生命周期中仅调用一次,主要作用是读取配置和资源加载。若初始化失败,抛出
ServletException,Servlet不会被加入可用队列3.处理请求:Web容器为每个请求创建线程,调用service(ServletRequest req, ServletResponse res)方法。service() 方法根据
HTTP请求类型(get/post)调用doGet()或doPost()4.销毁:Web容器调用 destroy()方法,Servlet 实例被标记为垃圾回收

2.SpringBoot

Servlet是Java EE规范中处理Web请求的核心组件,但随着应用复杂度提升,Servlet的直接使用显得笨重。Spring框架通过一系列抽象和扩展,简化了企业级应用开发
我们可以用一个非常形象的比喻来贯穿始终:建造一座房子第一阶段:Servlet 时代 - 自己烧砖砌墙
目标:建造一个能遮风挡雨的房子(一个能处理HTTP请求的Web应用)
你的工作状态:材料: 你有最基础的原材料——泥土(Java 语言)和水(JVM)。你需要自己烧制砖块(编写Servlet类)工具: 只有简单的泥瓦刀(Servlet API)过程:1.你为每一面墙、每一扇门都亲手烧制一块特定的砖(编写 LoginServlet, UserServlet, OrderServlet)2.你亲自规划每块砖的位置(在web.xml中配置大量的 < servlet > 和 < servlet-mapping >)3.你亲自搅拌水泥,一块一块地砌墙(在每个 Servlet 的doGet/doPost 方法中手动解析参数、处理业务、组装 HTML)

核心特点:高度灵活: 你可以造出任何形状的砖极其繁琐: 大量重复性劳动(每个 Servlet 都有获取参数、关闭连接等样板代码)难以维护: 砖块之间紧密耦合(对象依赖硬编码),想换一扇窗(修改功能)可能会牵动整面墙依赖外部: 房子建在别人的地上(需要将war包部署到外部的Tomcat服务器)

总结:Servlet提供了Web开发的基础能力,但开发效率极低,代码冗余且难以维护第二阶段:Spring 时代 - 使用预制件和设计图纸
目标:用更高效、更标准化的方式建造一个结构更好、更易扩展的房子
你的工作状态:材料: 你不再烧砖,而是使用工厂提供的标准化预制件(Spring Bean,如 @Controller, @Service)核心创新: 你聘请了一位神奇的管家(IoC 容器)你不再亲自“砌砖”(用new实例化对象),只需告诉管家你需要什么(用@Autowired声明依赖)管家会自动把预制件(Bean)按照图纸(配置)组装好,送到你手上(依赖注入DI)过程:1.一个总大门(DispatcherServlet): 房子只有一个入口,所有访客(请求)都先到这里2.管家调度: 总大门处的接待员(DispatcherServlet)根据访客需求,呼叫房子里对应的专业房间(@Controller中的方法)来接待3.开发者只需专注于房间内的专业服务(业务逻辑),而不用关心访客是怎么进来的

核心特点:解耦: 预制件之间是松耦合的,易于更换和测试专业化: AOP(面向切面编程)可以像“装修队”一样,非侵入式地为所有房间统一安装中央空调(日志、安全、事务)效率提升: 避免了大量重复劳动,结构清晰配置复杂: 绘制详细的“组装图纸”(配置 Spring)本身成了一项复杂的工作

总结:Spring框架通过IoC/DI和AOP等理念,解决了代码耦合和重复劳动问题,但引入了显著的配置复杂度
Spring Boot 1.0.0正式发布于2014年4月1日,标志着该框架的首次稳定版本发布。SpringBoot基于Spring
Framework 4进行设计,显著减少了开发者的配置工作量,彻底消除了Spring的配置地狱约定大于配置:约定了默认配置Start机制:是一种依赖管理机制,每个Starter包含特定功能所需的依赖库和自动配置类,开发者只需引入对应Starter即可快速启用功能模块嵌入式容器:内置了Tomcat等嵌入式容器,无需部署war文件到外部容器,直接运行即可启动应用

3.Spring Web MVC

3.1 概述

官方描述:Spring Web MVC是基于Servlet API构建的原始Web框架,并从一开始就在 Spring框架中。正式名称“Spring Web MVC”, 来自其源模块的名称(spring-webmvc),但它通常被称为“Spring MVC”

MVC的起源与发展:MVC(Model-View-Controller)模式最初由挪威计算机科学家Trygve Reenskaug于1978年在施乐帕克研究中心(Xerox PARC)提出,目的是为Smalltalk编程语言设计用户界面。其核心思想是将应用程序的逻辑分为三个独立组件:Model:处理数据逻辑和业务规则View:负责数据展示和用户界面Controller:接收用户输入并协调Model与View的交互

Spring MVC与MVC的关系:Spring MVC是MVC模式在Spring框架中的具体化,同时扩展了传统MVC的功能以适应现代Web开发需求

3.2 必需工具

Postman:主要用于 API 的开发和测试。它提供了一个用户友好的界面,支持发送HTTP请求、管理请求历史、自动化测试以及团队协作下载地址Download Postman

Fiddler:是一个网络调试代理工具,主要用于监控和分析HTTP/HTTPS流量。它可以捕获设备与服务器之间的所有请求和响应,支持修改请求、重放请求以及性能分析下载地址Fiddler - Download

3.3 RequestMapping

作用:是Spring MVC中最核心、最基础的注解之一,用于将HTTP请求映射到具体的方法上
注解级别:类+方法作为类注解:可以为整个类提供一个统一的url前缀(可有可无)作为方法注解:指定该方法负责处理哪个url的请求(强制要求)
@RequestMapping("/HelloController")//@RestController声明该类是一个Spring MVC控制器@RestControllerpublicclassHelloController{//0.不接收参数//作为 方法注解 时,@RequestMapping(value = "/hello",method = RequestMethod.GET)等同于@GetMapping(value = "/hello")//设置返回的响应是json格式,produces = "application/json"@RequestMapping(value ="/hello",method =RequestMethod.GET,produces ="application/json")publicStringhello(){return"{\"Hello\" : World}";}//1.一个参数@RequestMapping("/receiveAge1")//不传参或者传递的参数名不匹配时默认为nullpublicStringreceiveAge1(Integer age){return"接收到参数 age:"+ age;}@RequestMapping("/receiveAge2")//不传参或者传递的参数名不匹配时尝试设置为null,但int无法被设置为null,所以抛出IllegalStateExceptionpublicStringreceiveAge2(int age){return"接收到参数 age:"+ age;}//2.接收数组@RequestMapping("/receiveArray")publicStringreceiveArray(String[] array){return"接收到参数 array:"+Arrays.toString(array);}//3.接收对象,需要保证传递的参数名称和数量与Java对象保持一致@RequestMapping("/receivePerson")publicStringreceivePerson(Person person){return"接收到参数 person:"+ person;}}

3.4 RequestBody

作用:将HTTP请求体中的json数据绑定到Java对象(方法注解)
注解级别:方法
@RequestMapping("/receivePerson")//@RequestBody接收JSON格式的数据publicStringreceivePerson(@RequestBodyPerson person){return"接收到参数 person:"+ person;}

3.5 RequestParam

作用:是Spring MVC框架中从HTTP请求中提取参数/查询字符串的注解,主要用于将请求参数绑定到控制器方法的参数上
注解级别:方法
@RequestMapping("/receiveRename")//@RequestParam将url中key=name的查询字符串绑定到控制器的userName参数上//required = false设置该参数为非必传(默认为true,必传)publicStringreceiveRename(@RequestParam(value ="name",required =false)String userName){return"接收到参数name:"+ userName;}


注意:需要接收多个同名参数时(如param=value1&param=value2),直接绑定到List类型需通过该注解明确声明
@RequestMapping("/receiveList1")publicStringreceiveList1(ArrayList<String> list){//返回的list为空return"接收到参数 list:"+ list;}
(1)在Spring MVC中,参数绑定机制对集合类型数组类型的处理存在差异(2)使用ArrayList< String >作为方法参数时,必须显式添加@RequestParam注解,原因如下:默认绑定规则:Spring默认将单个请求参数的值绑定到简单类型(如 String、int)或单个对象。对于集合类型,框架无法自动推断是否需要将多个同名参数合并为集合需要明确指示:@RequestParam注解会告知Spring将同名请求参数的值收集到一个集合中(3)数组(如 String[])无需 @RequestParam 注解即可正确接收,原因如下:内置支持:Spring对数组类型有原生支持,能自动将多个同名请求参数值绑定到数组。这是框架的默认行为,无需额外配置

@RequestMapping("/receiveList2")publicStringreceiveList2(@RequestParam(required =false)ArrayList<String> list){//正确返回return"接收到参数 list:"+ list;}
@RequestMapping("/receiveList3")publicStringreceiveList3(List<String> list){//报错return"接收到参数 list:"+ list;}
后端报错:java.lang.IllegalStateException: No primary or single unique constructor found for interface java.util.List。receiveList3方法使用List< String >接口类型而非具体实现类。Spring虽然支持接口类型参数绑定,但需要满足特定条件:必须配合@RequestParam注解使用不能直接使用未注解的接口类型参数

报错根本原因:Spring尝试实例化List接口失败(接口不可实例化)

3.6 PathVariable

作用:用于从URL路径中提取变量值并绑定到方法的参数上
注解级别:方法
@RequestMapping("/receivePath/{article}/{blog}")//required = false设置该参数为非必传(默认为true,必传)publicStringreceivePath(@PathVariable(value ="article",required =false)Integer title,@PathVariable(value ="blog",required =false)String content){return"接收到参数 article:"+ title +" blog:"+ content;}

3.7 RequestPart

作用:用于处理 HTTP 请求中的 multipart/form-data 类型数据,通常用于文件上传或同时上传文件和其他表单字段的场景
注解级别:方法
@RequestMapping("/receiveFile")publicStringreceiveFile(@RequestPart(value ="file",required =false)MultipartFile imgFile,@RequestParam(value ="userName",required =false)String name){//返回原始的文件名return"用户:"+ name+",接收到文件:"+imgFile.getOriginalFilename();}

3.8 Controller&ResponseBody&RestController

Controller作用:是Spring MVC中的核心注解,用于标记一个类作为Web请求的处理器(声明一个类是一个Spring MVC控制器),负责处理HTTP请求并返回视图注解级别:

ResponseBody作用:指示方法返回值应直接写入HTTP响应体,而非通过视图解析器渲染注解级别:类+方法
@RequestMapping("/ControllerResponse")@ControllerpublicclassControllerResponse{//返回视图@RequestMapping("/HTMLView")publicStringHTMLView(){return"/show.html";}//返回数据@ResponseBody@RequestMapping("/HTMLData")publicStringHTMLData(){return"/show.html";}}

RestController作用:是Spring MVC中的一个组合注解,它结合了@Controller和@ResponseBody的功能,标记的类所有方法返回值默认直接作为 HTTP 响应体(JSON/XML 等格式),无需额外视图渲染注解级别:

4.Gitee

Gitee地址:九转苍翎
本文源码:SpringBoot_Demo1

Read more

【前沿解析】2026年3月25日:从机器人协同到全模态AI生态——中关村论坛与昆仑万维双重突破定义AI产业新范式

摘要:2026年3月25日,北京中关村论坛盛大开幕,展示了跨品牌机器人协同服务与昆仑万维三大世界第一梯队模型的突破进展。本文深入解析具身智能机器人“组团上岗”的技术原理、昆仑万维Matrix-Game 3.0、SkyReels V4、Mureka V9的全模态能力,以及产业协同生态的战略价值,涵盖统一调度系统架构、多智能体协作机制、代码实现方案与未来发展趋势。 关键词:具身智能、机器人协同、多模态大模型、全模态AI、中关村论坛、昆仑万维、Matrix-Game 3.0、SkyReels V4、Mureka V9、AI产业生态 一、引言:AI产业化进程加速,生态协同成为新焦点 2026年3月25日,北京中关村论坛年会正式拉开帷幕,本届论坛以"科技创新与产业创新深度融合"为主题,吸引了全球AI领域的目光。与往年不同,今年论坛的"机器人浓度"

前端html2canvas使用场景详解

html2canvas 是前端常用的 “DOM 转图片” 库,核心是将页面 DOM 节点渲染为 Canvas,再转为图片(Base64 或 Blob)。以下是 9 种核心使用场景的详细教程,包含代码示例、参数配置、问题解决,覆盖日常开发需求。 一、基础使用:将指定 DOM 转为 Base64 图片 适用于简单场景(如生成证书、截图分享),无需复杂配置。 1. 安装与引入 # npm 安装 npm install html2canvas --save javascript // 模块化项目引入(Vue/React/Angular) import html2canvas from 'html2canvas'

计算机学院校友网信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

计算机学院校友网信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着信息技术的快速发展,高校校友资源的管理与维护成为提升学校社会影响力的重要途径。传统校友信息管理方式通常依赖人工操作或简单的电子表格,存在数据分散、更新滞后、共享困难等问题,难以满足校友与学校之间的高效互动需求。校友网信息管理系统通过整合校友数据、活动管理、新闻发布等功能,实现校友资源的数字化、网络化管理,为校友与母校之间的沟通搭建高效平台。该系统不仅能够提升校友服务的质量,还能为学校提供校友数据分析支持,助力校友资源的深度开发与利用。关键词:校友管理、信息化、资源共享、互动平台。 该系统基于SpringBoot后端框架和Vue前端框架开发,结合MySQL数据库,构建了一套完整的校友信息管理解决方案。后端采用SpringBoot实现RESTful API接口,支持高效的数据交互与业务逻辑处理;前端使用Vue.js框架实现动态页面渲染,提升用户体验;MySQL数据库负责存储校友信息、新闻动态、活动记录等数据。系统功能包括校友信息管理、新闻发布、活动报名、校友交流等模块,支持多角色权限控制,确保数据安全。系统源码经过优化,可直接运行,便于二次开发与部署。关键词:SpringBo

前端学习日记 - 前端函数防抖详解

前端学习日记 - 前端函数防抖详解

前端函数防抖详解 * 为什么使用防抖 * 函数防抖的应用场景 * 函数防抖原理与手写实现 * 原理 * 手写实现 * 使用 Lodash 的 \_.debounce * 完整示例:防抖搜索组件 * 结语 在现代 Web 应用中,函数防抖(debounce)是一种常见且高效的性能优化手段,用于限制高频事件触发下的函数调用次数,从而减少不必要的计算、网络请求或 DOM 操作。本文将从“为什么使用防抖”切入,介绍典型的应用场景,深入解析防抖原理,并给出从零实现到在实际项目中使用 Lodash 的完整代码示例,帮助你快速掌握前端防抖技术。 为什么使用防抖 函数防抖的核心思想是在连续触发的事件停止后,仅执行最后一次调用,以避免频繁触发带来的性能问题 ([MDN Web Docs][1])。 在不使用防抖的情况下,例如在 input 输入事件或 window.resize 事件中直接调用逻辑,页面可能会因短时间内大量调用而出现卡顿或请求风暴 ([GeeksforGeeks]