当前位置: 首页 > news >正文

SpringMVC的基本使用

SpringMVC简介

SpringMVC是Spring提供的一套建立在Servlet基础上,基于MVC模式的web解决方案

SpringMVC核心组件

  • DispatcherServlet:前置控制器,来自客户端的所有请求都经由DispatcherServlet进行处理和分发
  • Handler:处理器,包括了拦截器和控制器中的方法,主要负责处理请求
  • HandlerMapping:映射器,解析文件和扫面注解,内部缓存了handler和handler的访问路径,被DispatcherServlet调用,用于查找路径对应的handler
  • HandlerAdapter:适配器,处理请求参数和处理响应数据,DispatcherServlet就是通过HandlerAdapter间接调用handler
  • ViewResolver:视图解析器,返回的视图是逻辑视图,需要进行解析、渲染之后才是给用户看的页面

img

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基础上&#xff0c;基于MVC模式的web解决方案 SpringMVC核心组件 DispatcherServlet&#xff1a;前置控制器&#xff0c;来自客户端的所有请求都经由DispatcherServlet进行处理和分发Handler&#xff1a;处理器&…...

【PYG】Cora数据集分类任务计算损失,cross_entropy为什么不能直接替换成mse_loss

cross_entropy计算误差方式&#xff0c;输入向量z为[1,2,3]&#xff0c;预测y为[1]&#xff0c;选择数为2&#xff0c;计算出一大坨e的式子为3.405&#xff0c;再用-23.405计算得到1.405MSE计算误差方式&#xff0c;输入z为[1,2,3]&#xff0c;预测向量应该是[1,0,0]&#xff0…...

MyBatis-plus这么好用,不允许还有人不会

你好呀&#xff0c;我是 javapub. 做 Java 的同学都会用到的三件套&#xff0c;Spring、SpringMV、MyBatis。但是由于使用起来配置较多&#xff0c;依赖冲突频发。所有&#xff0c;各路大佬又在这上边做了包装&#xff0c;像我们常用的 SpringBoot、MyBatisPlus。 基于当前要…...

Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲

摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。 关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB 一、Linux 设备驱动模型 Li…...

安全技术和防火墙

1、安全技术 1.1入侵检测系统 特点是不阻断网络访问&#xff0c;主要提供报警和事后监督。不主动介入&#xff0c;默默的看着你&#xff08;类似于监控&#xff09; 1.2入侵防御系统 透明模式工作&#xff0c; 数据包&#xff0c;网络监控&#xff0c;服务攻击&#xff0c;…...

Webpack: 开发 PWA、Node、Electron 应用

概述 毋庸置疑&#xff0c;对前端开发者而言&#xff0c;当下正是一个日升月恒的美好时代&#xff01;在久远的过去&#xff0c;Web 页面的开发技术链条非常原始而粗糙&#xff0c;那时候的 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标准的一个重要版本&#xff0c;它在语言核心和标准库中引入了许多新特性和改进&#xff0c;使得C编程更加现代化和高效。以下是C17中引入的一些重要新特性&#xff1a; 语言核心新特性 结构化绑定&#xff08;Structured Bindings&#xff09;&#xff1a; 结构化绑定…...

Andrej Karpathy提出未来计算机2.0构想: 完全由神经网络驱动!网友炸锅了

昨天凌晨&#xff0c;知名人工智能专家、OpenAI的联合创始人Andrej Karpathy提出了一个革命性的未来计算机的构想&#xff1a;完全由神经网络驱动的计算机&#xff0c;不再依赖传统的软件代码。 嗯&#xff0c;这是什么意思&#xff1f;全部原生LLM硬件设备的意思吗&#xff1f…...

用国内镜像安装docker 和 docker-compose (ubuntu)

替代方案&#xff0c;改用国内的镜像站(网易镜像&#xff09; 1.清除旧版本&#xff08;可选操作&#xff09; 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模拟抢票代码 互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁改进模拟抢票代码&#xff08;加锁&#xff09;小结对锁封装 lockGuard.hpp 互斥量实现原理探究可重入VS线程安全概念常见的线程不安全的情况常…...

os实训课程模拟考试(大题复习)

目录 一、Linux操作系统 &#xff08;1&#xff09;第1关&#xff1a;Linux初体验 &#xff08;2&#xff09;第2关&#xff1a;Linux常用命令 &#xff08;3&#xff09;第3关&#xff1a;Linux 查询命令帮助语句 二、Linux之进程管理—&#xff08;重点&#xff09; &…...

QT/QML国际化:中英文界面切换显示(cmake方式使用)

目录 前言 实现步骤 1. 准备翻译文件 2. 翻译字符串 3.设置应用程序语言 cmake 构建方式 示例代码 总结 1. 使用 file(GLOB ...) 2. 引入其他资源文件 再次生成翻译文件 5. 手动更新和生成.qm文件 其他资源 前言 在当今全球化的软件开发环境中&#xff0c;应用程…...

设计模式在Java项目中的实际应用

设计模式在Java项目中的实际应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 设计模式是软件开发中重要的思想工具&#xff0c;它提供了解决特定问题…...

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年代&#xff0c;最初专注于数学问题的基本原理&#xff1b;到了60年代和70年代&#xff0c;它以符号系统为中心&#xff0c;该领域首先开始面临复杂性问题&#xff1b;到80年代&#xff0c;随着个人计算的兴起和人机交互的问题&#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插件冲突解决描述错误描述&#xff1a;找不到模块imageio.v3解决&#xff1a;参考地址 其他文章推荐&#xff1a;专栏 &#xff1a; 人工智能基础知识点专栏&#xff1a;大语言模型LLM Stable Diffusion秋叶AnimateDiff与…...

# 状态通道实战:用Solidity实现高效链下交易与链上结算 在区块链世界中,**扩展性瓶颈**一直是开发者绕

状态通道实战&#xff1a;用Solidity实现高效链下交易与链上结算 在区块链世界中&#xff0c;扩展性瓶颈一直是开发者绕不开的话题。传统智能合约每笔交互都需上链&#xff0c;不仅成本高昂&#xff0c;还导致网络拥堵。而**状态通道&#xff08;State Channel&#xff09;**技…...

RMBG-2.0效果对比:不同光照/背景复杂度下头发分割准确率实测数据表

RMBG-2.0效果对比&#xff1a;不同光照/背景复杂度下头发分割准确率实测数据表 头发&#xff0c;无疑是图像背景去除&#xff08;抠图&#xff09;领域公认的“硬骨头”。无论是电商商品图、人像写真还是短视频素材&#xff0c;发丝边缘的精细度直接决定了最终效果的成败。今天…...

保姆级教程:用SSC Tool 5.13为先楫HPM6E00EVK生成8轴EtherCAT从站代码(附XML配置避坑点)

先楫HPM6E00EVK实现8轴EtherCAT从站开发实战指南 在工业自动化领域&#xff0c;多轴协同控制的需求日益增长。对于嵌入式开发者而言&#xff0c;如何快速搭建一个稳定可靠的EtherCAT从站系统成为关键挑战。本文将基于先楫HPM6E00EVK开发板&#xff0c;详细解析从代码生成到实际…...

从一道CTF赛题出发:手把手教你用火眼取证分析手机APP数据(附雷电模拟器实战)

从一道CTF赛题出发&#xff1a;手把手教你用火眼取证分析手机APP数据&#xff08;附雷电模拟器实战&#xff09; 在网络安全竞赛和电子数据取证领域&#xff0c;手机取证一直是技术含量高且实用性强的核心技能。本文将从一个真实的CTF赛题切入&#xff0c;带您完整走通手机镜像…...

掌握BepInEx:Unity游戏扩展全家桶的零门槛实践指南

掌握BepInEx&#xff1a;Unity游戏扩展全家桶的零门槛实践指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx &#x1f50d; 游戏模组管理的行业痛点与解决方案 在Unity游戏生态…...

OpenClaw技能市场巡礼:百川2-13B-4bits模型适配的10个实用插件

OpenClaw技能市场巡礼&#xff1a;百川2-13B-4bits模型适配的10个实用插件 1. 为什么选择百川2-13B-4bits作为OpenClaw的推理引擎 去年冬天我第一次尝试将量化模型接入OpenClaw时&#xff0c;显存不足的报错让我在MacBook Pro前坐了整整三个晚上。直到遇到百川2-13B-4bits这个…...

163MusicLyrics:音乐数据智能解析引擎如何重构歌词获取体验

163MusicLyrics&#xff1a;音乐数据智能解析引擎如何重构歌词获取体验 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 深夜&#xff0c;一位音乐制作人正在为即将发布的…...

5G NR PUSCH实战:手把手教你理解Type A/B时域映射与SLIV计算(附避坑指南)

5G NR PUSCH实战&#xff1a;Type A/B时域映射与SLIV计算全解析 从理论到实践&#xff1a;PUSCH时域资源分配的核心逻辑 在5G NR系统中&#xff0c;物理上行共享信道&#xff08;PUSCH&#xff09;的时域资源分配直接决定了上行数据传输的效率和可靠性。对于物理层开发工程师而…...

百川2-13B模型微调实战:提升OpenClaw中文邮件处理准确率

百川2-13B模型微调实战&#xff1a;提升OpenClaw中文邮件处理准确率 1. 问题背景与挑战 去年在尝试用OpenClaw自动化处理公司内部邮件时&#xff0c;我发现了一个棘手的问题&#xff1a;当邮件内容涉及复杂业务术语或非标准表达时&#xff0c;基于通用大模型的OpenClaw经常出…...

霍尔电流传感器原理与应用全解析

霍尔电流传感器测量原理深度解析 1. 霍尔效应电流测量基础 1.1 霍尔效应原理 霍尔效应是电流测量的基础物理现象&#xff0c;当导体或半导体薄片置于磁场中&#xff0c;并在其两端施加控制电流时&#xff0c;垂直于电流和磁场方向的两侧会产生电势差&#xff0c;这种现象称为…...