SpringMVC的基本使用

news2025/4/15 23:07:41

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 学生对象
	 */
	@GetMapping
	public Student getStudent(@RequestParam("id") int id) {
		// System.out.println(1/0); => 遇到异常会被带有@RestControllerAdvice注解的ExceptionController处理
		return new Student();
	}

	/**
	 * 添加一个学生
	 *
	 * @param student 学生对象的JSON数据
	 * @return 状态码
	 */
	@PostMapping
	public int addStudent(@RequestBody Student student) {
		System.out.println("student = " + student);
		return 0;
	}

	/**
	 * 更新一个学生的信息
	 *
	 * @param student 更新后的学生信息
	 * @return 状态码
	 */
	@PutMapping
	public 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1886398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言+ MSSQL技术开发的 PACS系统源码:CT后处理技术之仿真内镜CTVE

C语言 MSSQL技术开发的 PACS系统源码&#xff1a;CT后处理技术之仿真内镜CTVE 仿真内窥镜VE VE是利用医学影像作为原始数据&#xff0c;融合图像处理、计算机图形学、科学计算可视化、虚拟现实技术&#xff0c;模拟传统光学内镜的一种技术。 又叫做腔内重建技术&#xff0c;是…

使用瀚高数据库开发管理工具进行数据的备份与恢复---国产瀚高数据库工作笔记008

使用瀚高数据库,备份 恢复数据 然后找到对应的目录 其实就是hgdbdeveloper,瀚高的数据库开发管理工具 对应的包中有个dbclient 这个目录,选中这个目录以后,就可以了,然后 在对应的数据库,比如 data_middle 中,选中 某个模式,比如bigdata_huiju 然后右键进行,点击 恢复,然…

入门Salesforce:必须掌握的20+基础专业术语!

Salesforce的发展令人印象深刻。在过去的20年中&#xff0c;Salesforce创建了一个由管理员、开发人员、顾问和用户组成的生态系统&#xff0c;不断颠覆创新CRM&#xff0c;促进平等和多样性。 作为初学者&#xff0c;探索Salesforce领域就像学习一门新语言。Salesforce中有着大…

最新CRMEB商城多商户java版源码v1.6版本+前端uniapp

CRMEB 开源商城系统Java版&#xff0c;基于JavaVueUni-app开发&#xff0c;在微信公众号、小程序、H5移动端都能使用&#xff0c;代码全开源无加密&#xff0c;独立部署&#xff0c;二开很方便&#xff0c;还支持免费商用&#xff0c;能满足企业新零售、分销推广、拼团、砍价、…

【设计模式】【行为型模式】【责任链模式】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…

Android SQLite 数据库存学习与总结

Android 系统内置了一个名为 SQLite 数据库。那么 SQLite 是一种什么样的数据库&#xff0c;它有那些特点&#xff0c;应该怎么操作它&#xff1f;下面&#xff0c;让我们就来认识一下它吧。 1、概念&#xff1a; SQLite 是一种轻量级的关系型数据库&#xff0c;它不仅支持标准…

【实战】EasyExcel实现百万级数据导入导出

文章目录 前言技术积累实战演示实现思路模拟代码测试结果 前言 最近接到一个百万级excel数据导入导出的需求&#xff0c;大概就是我们在进行公众号API群发的时候&#xff0c;需要支持500w以上的openid进行群发&#xff0c;并且可以提供发送openid数据的导出功能。可能有的同学…

电脑录歌用什么软件好?分享电脑录音软件:6款

短视频普遍的今天&#xff0c;越来越多的人喜欢通过电脑进行音乐创作和录制。然而&#xff0c;面对市面上琳琅满目的电脑录音软件&#xff0c;很多人可能会感到困惑&#xff1a;电脑录歌用什么软件好呢&#xff1f;本文将为大家分享六款精选的录音软件&#xff0c;帮助大家找到…

主从同步binlog

主从同步的原理是怎样的 提到主从同步的原理&#xff0c;我们就需要了解在数据库中的一个重要日志文件&#xff0c;那就是 Binlog 二 进制日志&#xff0c;它记录了对数据库进行更新的事件。实际上主从同步的原理就是基于 Binlog 进 行数据同步的。在主从复制过程中&#xff…

KVM性能优化之CPU优化

1、查看kvm虚拟机vCPU的QEMU线程 ps -eLo ruser,pid,ppid,lwp,psr,args |awk /^qemu/{print $1,$2,$3,$4,$5,$6,$8} 注:vcpu是不同的线程&#xff0c;而不同的线程是跑在不同的cpu上&#xff0c;一般情况&#xff0c;虚拟机在运行时自身会点用3个cpus&#xff0c;为保证生产环…

第二篇——始计篇:“计”是最早的SWOT分析

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 第二次详读孙子兵法&#xff0c;当初听讲解的时候&#xff0c;就觉得自己…

短剧系统开发:如何让你的创意变成现实

短剧系统开发是一个将创意转化为现实的过程&#xff0c;它涉及多个方面&#xff0c;包括需求分析、系统设计、开发环境搭建、前后端开发、测试与发布等。 1. 需求分析 &#xff08;1&#xff09;明确目标&#xff1a;首先&#xff0c;明确短剧系统的目标和定位&#xff0c;包括…

某智能装备公司如何实现多个工程师共用1台图形工作站

在当今快速发展的科技领域&#xff0c;资源共享和高效利用已成为企业提升竞争力的关键&#xff0c;特别是在工程设计和研发领域。如何最大化地利用有限的资源&#xff0c;如工作站&#xff0c;成为了许多公司面临的挑战。某智能装备公司便是在这样的背景下&#xff0c;通过云飞…

【如何使用RSA签名验签】python语言

文章目录 签名方法异步同步通知数据验签生活号响应数据验签同步响应数据验签 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的…

002-基于Sklearn的机器学习入门:基本概念

本节将继续介绍与机器学习有关的一些基本概念&#xff0c;包括机器学习的分类&#xff0c;性能指标等。同样&#xff0c;如果你对本节内容很熟悉&#xff0c;可直接跳过。 2.1 机器学习概述 2.1.1 什么是机器学习 常见的监督学习方法 2.1.2 机器学习的分类 机器学习一般包括监…

玉林师范学院宿舍管理系统的设计与实现19633

玉林师范学院宿舍管理系统设计与实现 摘要&#xff1a;随着大学生人数的增加&#xff0c;宿舍管理成为高校管理中的重要问题。本论文旨在研究玉林师范学院宿舍管理系统&#xff0c;探讨其优势和不足&#xff0c;并提出改进建议。通过对相关文献的综述和实地调研&#xff0c;我们…

【操作系统】进程管理——线程管理(个人笔记)

学习日期&#xff1a;2024.7.2 内容摘要&#xff1a;线程的概念、存在的意义、线程的属性&#xff0c;线程的实现方式&#xff0c;线程的状态与组织。 线程的概念 拿QQ来说&#xff0c;QQ既可以打视频电话&#xff0c;也可以在这同时进行文字聊天或传送文件&#xff0c;进程是…

java基于ssm+jsp 二手交易平台网站

1商家能模块 商家首页&#xff0c;在商家首页页面可以查看个人中心、商品分类管理、商品信息管理、订单信息管理、订单配送管理信息&#xff0c;如图1所示。 图1商家首页界面图 个人中心&#xff0c;用户通过个人中心可以查看用户名、用户姓名、头像、性别、手机号码、邮箱等信…

MySQL数据库设计作业 ——《网上书店系统》数据库设计实验报告

数据库设计作业——《网上书店系统》数据库设计 一、功能需求 普通用户&#xff1a;可以进行最基础的登陆操作&#xff0c;可浏览图书、按类别查询图书、查看 图书的详细信息&#xff0c;还可以注册成为会员。会员&#xff1a;需要填写详细信息&#xff08;真实姓名、性别、手…

移动端 UI 风格简约而不凡

移动端 UI 风格简约而不凡