SpringMVC的基本使用
SpringMVC简介
SpringMVC是Spring提供的一套建立在Servlet基础上,基于MVC模式的web解决方案
SpringMVC核心组件
DispatcherServlet:前置控制器,来自客户端的所有请求都经由DispatcherServlet进行处理和分发Handler:处理器,包括了拦截器和控制器中的方法,主要负责处理请求HandlerMapping:映射器,解析文件和扫面注解,内部缓存了handler和handler的访问路径,被DispatcherServlet调用,用于查找路径对应的handlerHandlerAdapter:适配器,处理请求参数和处理响应数据,DispatcherServlet就是通过HandlerAdapter间接调用handlerViewResolver:视图解析器,返回的视图是逻辑视图,需要进行解析、渲染之后才是给用户看的页面

SpringMVC的工作流程
前端发送的请求由DispatcherServlet接收到,然后DispatcherServlet调用HnadlerMapping映射器,通过URL去匹配对应的handler,因为无法确定处理的类型,所以调用HandlerAdapter适配器去适配handler,适配之后就会调用这个handler处理器(实际就是拦截器和控制器下的方法),如果返回的类型是ModelAndView,就会将这个ModelAndView返回给ViewResolver视图解析器进行解析,得到视图的位置,然后对这个视图进行渲染,最后将渲染好的视图交给DispatcherServlet返回给前端展示;如果在控制器(比如说类或者某个方法上)中加上了@ResponseBody这个注解,就代表handler的返回值是直接返回给前端的,不会经过视图解析器
SpringMVC的使用
第一步:引入依赖
<properties><lombok-vesion>1.18.24</lombok-vesion><fastjson-version>2.0.42</fastjson-version><spring-context-version>5.3.8</spring-context-version><spring-context-supprt-version>5.3.8</spring-context-supprt-version><spring-aop-version>5.3.23</spring-aop-version><project.compile.source>1.8</project.compile.source><project.compile.target>1.8</project.compile.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring-context-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring-context-supprt-version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok-vesion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring-aop-version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectJ-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring-context-version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson-version}</version></dependency>
</dependencies>
第二步:创建spring.xml
在resources文件夹下创建spring.xml文件
错误一:命名空间的标签不匹配,比如
xmlns:mvc="http://www.springframework.org/schema/c",mvc应该对应的是../schema/mvc错误二:没有添加对应的xsi:schemaLocation,比如引入了
xmlns:mvc="http://www.springframework.org/schema/mvc",但是没有在最后添加http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--视图解析器:在控制器返回视图的时候生效--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--视图资源的前缀--><property name="prefix" value="/"/><!--视图资源的后缀--><property name="suffix" value=".jsp"/></bean><!-- 映射器 --><!-- <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> --><!-- 适配器 --><!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> --><!-- 较新的版本支持注解驱动,效果等同于上面两句 --><mvc:annotation-driven><mvc:message-converters><ref bean="stringHttpMessageConverter"/><ref bean="jsonConverter"/></mvc:message-converters></mvc:annotation-driven><!-- 添加需要扫描的包 --><context:component-scan base-package="cn.cnmd.controller, cn.cnmd.exception"/><!-- 编码转换器 --><!-- 字符串数据转换器 --><bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/><!-- JSON格式数据转换器 --><bean id="jsonConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property></bean></beans>
第三步:编写controller类
报错:415-不支持的媒体类型
解决方案:在spring.xml中配置编码转化器
<!--在注解驱动中添加编码转换器--> <mvc:annotation-driven><mvc:message-converters><ref bean="stringHttpMessageConverter"/><ref bean="jsonConverter"/></mvc:message-converters> </mvc:annotation-driven><!-- 字符串数据转换器 --> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/><!-- JSON格式数据转换器 --> <bean id="jsonConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property> </bean>
UserController类
@RestController//@RestController = @Controller + @ResponseBody
@RequestMapping("/user")
public class UserController {/*** 获取一个学生的信息** @param id 学生编号* @return 学生对象*/@GetMappingpublic Student getStudent(@RequestParam("id") int id) {// System.out.println(1/0); => 遇到异常会被带有@RestControllerAdvice注解的ExceptionController处理return new Student();}/*** 添加一个学生** @param student 学生对象的JSON数据* @return 状态码*/@PostMappingpublic int addStudent(@RequestBody Student student) {System.out.println("student = " + student);return 0;}/*** 更新一个学生的信息** @param student 更新后的学生信息* @return 状态码*/@PutMappingpublic int updateStudent(@RequestBody Student student) {System.out.println("student = " + student);return 0;}/*** 通过学生id删除一个学生** @param id 学生编号* @return 状态码*/@DeleteMapping("/{id}")public int deleteStudent(@PathVariable("id") int id) {System.out.println("id = " + id);return 0;}/*** 批量查询学生** @param currentPage 当前页数* @param pageSize 当页数据条数* @return 学生集合*/@GetMapping("/stuList")public List<Student> getAllStudent(@RequestParam("currentPage") int currentPage,@RequestParam("pageSize") int pageSize) {System.out.println("currentPage = " + currentPage + ", pageSize = " + pageSize);return new ArrayList<>();}/*** 获取请求头中的数据** @param ua 请求头中的User-Agent*/@GetMapping("/header")public void getHeader(@RequestHeader("User-Agent") String ua) {System.out.println("ua = " + ua);}/*** 获取cookie中的数据** @param status cookie中的key:status*/@GetMapping("/cookie")public void getCookie(@CookieValue("status") String status) {System.out.println("status = " + status);}}
全局异常处理
@RestControllerAdvice
public class ExceptionController {/*** 处理全局异常的方法** @param e 异常对象* @return 异常信息*/@ExceptionHandler(Exception.class)public String exceptionHandler(Exception e) {return e.getMessage();}
}
常用的注解
实例都在上方
//用于标记是否是一个控制器
@Controller//匹配请求中的URL地址来调用对应的handler
@RequestMapping//用于匹配URL地址中的parameter参数
@RequestParam//用于匹配URL路径上的参数
@PathVariable//用于匹配前端发送给后端的JSON数据
@RequestBody//用于匹配请求头中的数据
@RequestHeader//用于匹配Cookie中的数据
@CookieValue//用于标记一个方法的返回值是否直接返回给前端
@ResponseBody//RESTFul风格下的注解,等同于@Controller + @ResponseBody
@RestController//RESTFul风格下的用于匹配不同请求方式
@GetMapping/@PostMapping/@PutMapping/@DeleteMapping//该注解只能应用在类上,表示这个类就是处理异常的控制器
@ControllerAdvice//RESTFul风格下的用于表示这个类就是处理异常的控制器,并且返回值直接返回给前端,等同于@ControllerAdvice + @ResponseBody
@RestControllerAdvice//该注解只能应用在@ControllerAdvice或者说@RestControllerAdvice标识的类的方法上,用来处理异常
@ExceptionHandler
静态资源访问解决
为什么静态资源无法访问?
因为在Tomcat的自带的web.xml中有这样一个配置
<!--.......-->
<servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param><init-param><param-name>listings</param-name><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<!--.......-->
<!-- The mapping for the default servlet -->
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
说明在创建webapp项目时,我们在web.xml中配置的DispathcerServlet的映射覆盖了DefaultServlet的映射,所以就不会再使用默认的DefaultServlet,造成了静态资源无法访问
解决方案
方案一:修改@XxxMapping中的url,比如加上后缀.do、.action
方案二【推荐】:在web.xml中配置静态资源的访问地址,比如将js、css、图片等静态资源放在static文件夹下
<!-- web.xml -->
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/static/*</url-pattern>
</servlet-mapping>
方案三:在spring.xml文件中配置 default-servlet-handler
<!--
这个handler就是处理静态资源的,它的处理方式就是将请求转会到tomcat中名为default的Servlet
-->
<mvc:default-servlet-handler/>
<!-- mapping是访问路径,location是静态资源存放的路径 -->
<mvc:resources mapping="/static/**" location="/static/" />
中文乱码问题
解决方案:编码转换器
<!-- 编码转换器 -->
<!-- 字符串数据转换器 -->
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/><!-- JSON格式数据转换器 -->
<bean id="jsonConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property>
</bean>
<!--在注解驱动中添加编码转化器-->
<mvc:annotation-driven><mvc:message-converters><ref bean="stringHttpMessageConverter"/><ref bean="jsonConverter"/></mvc:message-converters>
</mvc:annotation-driven>
相关文章:
SpringMVC的基本使用
SpringMVC简介 SpringMVC是Spring提供的一套建立在Servlet基础上,基于MVC模式的web解决方案 SpringMVC核心组件 DispatcherServlet:前置控制器,来自客户端的所有请求都经由DispatcherServlet进行处理和分发Handler:处理器&…...
【PYG】Cora数据集分类任务计算损失,cross_entropy为什么不能直接替换成mse_loss
cross_entropy计算误差方式,输入向量z为[1,2,3],预测y为[1],选择数为2,计算出一大坨e的式子为3.405,再用-23.405计算得到1.405MSE计算误差方式,输入z为[1,2,3],预测向量应该是[1,0,0]࿰…...
MyBatis-plus这么好用,不允许还有人不会
你好呀,我是 javapub. 做 Java 的同学都会用到的三件套,Spring、SpringMV、MyBatis。但是由于使用起来配置较多,依赖冲突频发。所有,各路大佬又在这上边做了包装,像我们常用的 SpringBoot、MyBatisPlus。 基于当前要…...
Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲
摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。 关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB 一、Linux 设备驱动模型 Li…...
安全技术和防火墙
1、安全技术 1.1入侵检测系统 特点是不阻断网络访问,主要提供报警和事后监督。不主动介入,默默的看着你(类似于监控) 1.2入侵防御系统 透明模式工作, 数据包,网络监控,服务攻击,…...
Webpack: 开发 PWA、Node、Electron 应用
概述 毋庸置疑,对前端开发者而言,当下正是一个日升月恒的美好时代!在久远的过去,Web 页面的开发技术链条非常原始而粗糙,那时候的 JavaScript 更多用来点缀 Web 页面交互而不是用来构建一个完整的应用。直到 2009年5月…...
python处理txt文件, 如果第一列和第二列的值在连续的行中重复,则只保留一行
处理txt文件, 如果第一列和第二列的值在连续的行中重复,则只保留一个实例,使用Python的内置函数来读取文件,并逐行检查和处理数据。 一个txt文件,里面的数据是893.554382324,-119.955825806,0.0299997832626,-0.133618548512,28.1155740884,112.876833236,46.7922,19.62582…...
C++17中引入了什么新的重要特性
C17是C标准的一个重要版本,它在语言核心和标准库中引入了许多新特性和改进,使得C编程更加现代化和高效。以下是C17中引入的一些重要新特性: 语言核心新特性 结构化绑定(Structured Bindings): 结构化绑定…...
Andrej Karpathy提出未来计算机2.0构想: 完全由神经网络驱动!网友炸锅了
昨天凌晨,知名人工智能专家、OpenAI的联合创始人Andrej Karpathy提出了一个革命性的未来计算机的构想:完全由神经网络驱动的计算机,不再依赖传统的软件代码。 嗯,这是什么意思?全部原生LLM硬件设备的意思吗?…...
用国内镜像安装docker 和 docker-compose (ubuntu)
替代方案,改用国内的镜像站(网易镜像) 1.清除旧版本(可选操作) for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove $pkg; done 2.安装docker apt-get update 首先安装依赖 apt-g…...
Linux多线程【线程互斥】
文章目录 Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex模拟抢票代码 互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁改进模拟抢票代码(加锁)小结对锁封装 lockGuard.hpp 互斥量实现原理探究可重入VS线程安全概念常见的线程不安全的情况常…...
os实训课程模拟考试(大题复习)
目录 一、Linux操作系统 (1)第1关:Linux初体验 (2)第2关:Linux常用命令 (3)第3关:Linux 查询命令帮助语句 二、Linux之进程管理—(重点) &…...
QT/QML国际化:中英文界面切换显示(cmake方式使用)
目录 前言 实现步骤 1. 准备翻译文件 2. 翻译字符串 3.设置应用程序语言 cmake 构建方式 示例代码 总结 1. 使用 file(GLOB ...) 2. 引入其他资源文件 再次生成翻译文件 5. 手动更新和生成.qm文件 其他资源 前言 在当今全球化的软件开发环境中,应用程…...
设计模式在Java项目中的实际应用
设计模式在Java项目中的实际应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 设计模式是软件开发中重要的思想工具,它提供了解决特定问题…...
js制作随机四位数验证码图片
<div class"lable lable2"><div class"l"><span>*</span>验证码</div><div class"r"><input type"number" name"vercode" placeholder"请输入验证码"></div>&l…...
[开源软件] 支持链接汇总
“Common rules: 1- If the repo is on github, the support/bug link is also on the github with issues”" label; 2- Could ask questions by email list;" 3rd party software support link Note gcc https://gcc.gnu.org openssh https://bugzilla.mindrot.o…...
从零开始搭建spring boot多模块项目
一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…...
Iot解决方案开发的体系结构模式和技术
前言 Foreword 计算机技术起源于20世纪40年代,最初专注于数学问题的基本原理;到了60年代和70年代,它以符号系统为中心,该领域首先开始面临复杂性问题;到80年代,随着个人计算的兴起和人机交互的问题&#x…...
02.C1W1.Sentiment Analysis with Logistic Regression
目录 Supervised ML and Sentiment AnalysisSupervised ML (training)Sentiment analysis Vocabulary and Feature ExtractionVocabularyFeature extractionSparse representations and some of their issues Negative and Positive FrequenciesFeature extraction with freque…...
Stable Diffusion秋叶AnimateDiff与TemporalKit插件冲突解决
文章目录 Stable Diffusion秋叶AnimateDiff与TemporalKit插件冲突解决描述错误描述:找不到模块imageio.v3解决:参考地址 其他文章推荐:专栏 : 人工智能基础知识点专栏:大语言模型LLM Stable Diffusion秋叶AnimateDiff与…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
