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

Spring_MVC 快速入门指南

Spring_MVC 快速入门指南

一、Spring_MVC 简介

1. 什么是 Spring_MVC?

Spring_MVC 是 Spring 框架的一个模块,用于构建 Web 应用程序。它基于 MVC(Model-View-Controller)设计模式,将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,使代码结构更加清晰,便于维护和扩展。

2. Spring_MVC 的优势

清晰的分离:将业务逻辑、数据和视图分离,使代码更易于管理和测试。

灵活的配置:支持多种配置方式,包括 XML 和注解。

丰富的功能:提供了许多内置功能,如数据绑定、类型转换、国际化等。

与其他 Spring 模块集成:可以无缝地与其他 Spring 模块(如 Spring Data、Spring Security)集成。

二、创建 Spring_MVC 应用

1. 依赖导入

在项目的 pom.xml 文件中添加以下依赖:

<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.1.0</version><scope>provided</scope>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.1.12</version>
</dependency>

2. 创建配置类

创建一个配置类 SpringMvcConfig.java,用于替代传统的 XML 配置:

package com.itheima.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@ComponentScan("com.itheima.Controller") // 指定要扫描的包
@EnableWebMvc // 启用 Spring_MVC 的功能
public class SpringMvcConfig {
}

3. 创建启动类

创建一个继承自 AbstractDispatcherServletInitializer 的类 ServletConfig.java,用于配置和启动 Spring_MVC 应用:

package com.itheima.config;import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
import org.springframework.web.servlet.support.AnnotationConfigWebApplicationContext;import javax.servlet.Filter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;public class ServletConfig extends AbstractDispatcherServletInitializer {@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(SpringMvcConfig.class); // 注册配置类return context;}@Overrideprotected String[] getServletMappings() {return new String[]{"/"}; // 所有请求都由 Spring_MVC 处理}@Overrideprotected WebApplicationContext createRootApplicationContext() {return null;}@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();characterEncodingFilter.setEncoding("UTF-8");characterEncodingFilter.setForceEncoding(true);return new Filter[]{characterEncodingFilter};}
}

4. 创建控制器

创建一个控制器类 UserController.java,使用 @Controller 注解标记,并通过 @RequestMapping 注解设置请求路径:

package com.itheima.Controller;import org.springframework.web.bind.annotation.*;@Controller
public class UserController {@RequestMapping("/hello")@ResponseBodypublic String sayHello() {return "Hello, Spring_MVC!";}@RequestMapping(value = "/user/save", method = RequestMethod.POST)@ResponseBodypublic String saveUser() {System.out.println("User saved successfully");return "{\"status\": \"success\", \"message\": \"User saved\"}";}@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)@ResponseBodypublic String getUserById(@PathVariable Integer id) {System.out.println("Retrieving user with ID: " + id);return "{\"id\": " + id + ", \"name\": \"John Doe\"}";}
}

构造形式:

在这里插入图片描述

三、请求路径设置与控制器注解详解

1. @Controller 注解

  • 用于标记一个类为控制器类。
  • Spring 容器会扫描带有 @Controller 注解的类,并将其注册为 Spring Bean。

2. @RequestMapping 注解

  • 用于映射 HTTP 请求到处理方法。
  • 可用于类级别(设置基础路径)和方法级别(设置具体路径)。
  • 支持多种 HTTP 方法(GET、POST、PUT、DELETE)。
@Controller
@RequestMapping("/api") // 类级别的基础路径
public class ApiController {@RequestMapping(value = "/user", method = RequestMethod.GET)public String getUser() {return "User data";}
}

3. @ResponseBody 注解

  • 用于指定方法的返回值将直接作为响应体返回给客户端。
  • 常用于返回 JSON 或 XML 数据。
@RequestMapping(value = "/user", method = RequestMethod.GET)
@ResponseBody
public String getUser() {return "{\"id\": 1, \"name\": \"John Doe\"}";
}

4. @RequestBody 注解

  • 用于将请求体中的数据绑定到方法参数。
  • 常用于处理 POST 或 PUT 请求中的 JSON 或 XML 数据。
@RequestMapping(value = "/user", method = RequestMethod.POST)
@ResponseBody
public String saveUser(@RequestBody User user) {return "{\"status\": \"success\"}";
}

5. @PathVariable 注解

  • 用于从 URL 中提取占位符参数。
  • 常用于动态获取路径中的参数。
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
@ResponseBody
public String getUserById(@PathVariable Integer id) {return "{\"id\": " + id + ", \"name\": \"John Doe\"}";
}

四、运行应用

完成上述步骤后,启动应用服务器(如 Tomcat),可以通过以下 URL 访问您的应用:

  • http://localhost:8080/hello:返回 “Hello, Spring_MVC!”。
  • http://localhost:8080/user/save:返回用户保存成功的 JSON 数据。
  • http://localhost:8080/user/1:返回用户信息的 JSON 数据。

五、常见问题与解决方案

1. 无法访问控制器方法

  • 可能原因:控制器类或方法未正确标注注解,或注解路径配置错误。
  • 解决方案:检查控制器类是否使用 @Controller 注解,方法是否使用 @RequestMapping 注解,以及路径是否正确。

2. 返回 JSON 数据时出现 406 错误

  • 可能原因:客户端不接受应用返回的 JSON 数据类型。
  • 解决方案:确保在控制器方法上添加 @ResponseBody 注解,并在请求头中设置 Accept: application/json

3. 中文乱码问题

  • 可能原因:请求或响应的编码设置不正确。

  • 解决方案

    ServletConfig 类中添加字符编码过滤器:

    @Override
    protected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();characterEncodingFilter.setEncoding("UTF-8");characterEncodingFilter.setForceEncoding(true);return new Filter[]{characterEncodingFilter};
    }
    

    在 Tomcat 启动配置中添加 JVM 参数:

-Dfile.encoding=UTF-8

相关文章:

Spring_MVC 快速入门指南

Spring_MVC 快速入门指南 一、Spring_MVC 简介 1. 什么是 Spring_MVC&#xff1f; Spring_MVC 是 Spring 框架的一个模块&#xff0c;用于构建 Web 应用程序。它基于 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;将应用程序分为模型&#xff08;M…...

L38.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因

目录 1.题目 2.分析 去重的代码 错误代码 3.完整代码 提交结果 1.题目 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元…...

字符串系列一>最长回文子串

目录 题目&#xff1a;解析&#xff1a;代码&#xff1a; 题目&#xff1a; 链接: link 解析&#xff1a; 代码&#xff1a; class Solution {public String longestPalindrome(String s) {char[] ss s.toCharArray();int n ss.length;int begin 0;//返回结果的起始字符串…...

双击热备方案及不同方案的需求、方案对比

双击热备方案概述 一般实现双机热备的方案有三种,分别是共享存储双机热备方案、镜像双机热备方案、双机双柜双机热备方案,这三种方案对硬件要求不同,大家可以根据自身的业务应用特性来选择具体的双机热备方案以及对应的ServHA双机热备软件产品。 1、镜像双机热备 1.1镜像…...

Antd中使用Form.List且有Select组件,过滤问题

当在使用Form.List组件&#xff0c;且组件中有Select选项时&#xff0c;针对每一次选择&#xff0c;都要过滤掉那些已经选择过的选项&#xff0c;可能遇到的问题&#xff1a; 直接过滤会将每一个Select中的options选项都过滤掉&#xff0c;无法正常展示选择的选项 解决办法&a…...

VSCODE插值表达式失效问题

GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_-CSDN博客 更换正确的vue域名 GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_ <script src"https://unpkg.com/vue2.6.14/dist/vue.js"></sc…...

【失败】Gnome将默认终端设置为 Kitty

起因 一会儿gnome-terminal一会儿kitty终端&#xff0c;实在是受不了&#xff0c;决定取缔默认的gnome-terminal。 过程 在 Ubuntu 或 Debian 系统上&#xff1a; 确保 Kitty 已经安装。如果未安装&#xff0c;可以在终端中运行命令sudo apt install kitty -y进行安装。 使用系…...

蓝桥杯:连连看

本题大意要我们在一个给定的nxm的矩形数组中找出符合条件的格子 条件如下&#xff1a; 1.数值相同 2.两个横坐标和纵坐标的差值相等&#xff08;由此可得是一个对角线上的格子&#xff09; 那么根据以上条件我们可以用HashMap来解决这个问题&#xff0c;统计对角线上数值相同…...

Ext系列⽂件系统

Ext系列⽂件系统 1. 理解硬件1.1 磁盘的物理结构1.2 磁盘的存储结构1.3 磁盘的逻辑结构理解过程实际过程 1.4 CHS&&LBA地址 2. 引入文件系统块分区innode 3. Ext2文件系统3.1 宏观认识3.2 block group3.3 块组内部3.3.1 GDT&#xff08;Group Descriptor Table&#xf…...

JavaScript 对象复制:浅拷贝与深拷贝

JavaScript 对象复制&#xff1a;浅拷贝与深拷贝使用说明 在 JavaScript 中&#xff0c;对象复制分为 浅拷贝 和 深拷贝&#xff0c;两者的核心区别在于是否递归复制嵌套的引用类型属性。以下是详细说明和示例&#xff1a; 一、浅拷贝&#xff08;Shallow Copy&#xff09; 特…...

MTK-Android12 13 屏蔽掉Viewing full screen

去掉ROOM 开机第一次提示全屏弹框 文章目录 需求参考资料修改文件实现方案 解决思路grep 源码查找信息grep 查找 grep -rn "Viewing full screen" 找string 字段grep 查找 grep -rn immersive_cling_title 布局grep 查找 grep -rn layout.immersive_mode_cling 对应的…...

mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置

mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 https://www.modb.pro/db/1784385883449397248 mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 SQL命令行临时设置操作 #查看mysql数据库的线程连接数&#xff1a; mysql> show global statu…...

OpenGauss 数据库介绍

OpenGauss 数据库介绍 OpenGauss 是华为基于 PostgreSQL 开发的企业级开源关系型数据库&#xff0c;现已成为开放原子开源基金会的项目。以下是 OpenGauss 的详细介绍&#xff1a; 一 核心特性 1.1 架构设计亮点 特性说明优势多核并行NUMA感知架构充分利用现代CPU多核性能行…...

GitHub创建远程仓库

使用GitHub创建远程仓库&#xff1a;从零开始实现代码托管与协作 前言 在当今软件开发领域&#xff0c;版本控制系统已成为开发者必备的核心工具。作为分布式版本控制系统的代表&#xff0c;Git凭借其强大的分支管理和高效的协作能力&#xff0c;已成为行业标准。而GitHub作为…...

【AI部署】腾讯云GPU -—SadTalker的AI数字人访问web服务—未来之窗超算中心

访问部署在Cloud Studio上的web服务 当你把该项目部署在本地时&#xff0c;访问该服务的请求地址为http://localhost:8080/hello&#xff1b;当你把该项目部署在Cloud Studio工作台启动时&#xff0c;要想访问到该服务&#xff0c;需要先在工作台右侧打开访问链接面板&#xff…...

基于spring boot 集成 deepseek 流式输出 的vue3使用指南

本文使用deepseek API接口流式输出的文章。 环境要求 jdk17 spring boot 3.4 代码如下: package com.example.controller;import jakarta.annotation.PostConstruct; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.mes…...

fastdds:传输层SHM和DATA-SHARING的区别

下图是fastdds官方的图&#xff0c;清晰地展示了dds支持的传输层: 根据通信双方的相对位置(跨机器、同机器跨进程、同进程)的不同选择合适的传输层&#xff0c;是通信中间件必须要考虑的事情。 跨机器&#xff1a;udp、tcp 跨机器通信&#xff0c;只能通过网络&#xff0c; f…...

堆栈溢出 StackOverflowError 排查

报错&#xff1a; exHandler dispatch failed; nested exception is java.lang.StackOverflowError org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError at org.springframework.web.servlet.D…...

树莓派_利用Ubuntu搭建gitlab

树莓派_利用Ubuntu搭建gitlab 一、给树莓派3A搭建基本系统 1、下载系统镜像 https://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ 2、准备系统SD卡 二、给树莓派设备联网 1、串口后台登录 使用串口登录后台是最便捷的&#xff0c;因为前期网络可能不好直接成功 默…...

ARINC818协议(三)

源特定参数 源特定参数被定义&#xff0c;用于在源和目的之间进行传输 源特定参数包括初始化&#xff0c;合适的解释&#xff0c;周期性的验证。 gamma or palette tables&#xff1a;伽马或者调色板 color format:颜色格式 Brightness and backlight control &#xff1a;亮度…...

得佳胜哲讯科技 SAP项目启动会:胶带智造新起点 数字转型新征程

在全球制造业加速向数字化、智能化转型的浪潮中&#xff0c;胶带制造行业正迎来以“自动化生产、数据化运营、智能化决策”为核心的新变革。工业互联网、大数据分析与智能装备的深度融合&#xff0c;正推动胶带制造从传统生产模式向“柔性化生产精准质量控制全链路追溯”的智慧…...

万字解析TCP

通过学习视频加博客的组合形式&#xff0c;整理了一些关于TCP协议的知识。 *图源&#xff1a;临界~的csdn博客。 一、TCP建立连接 TCP的建立连接&#xff0c;大致可以分为面向连接、TCP报文结构、TCP的三次握手、TCP的建立状态、SYN泛洪攻击。 1.1、面向连接 面向连接 --- …...

PyTorch 浮点数精度全景:从 float16/bfloat16 到 float64 及混合精度实战

PyTorch 在深度学习中提供了多种 IEEE 754 二进制浮点格式的支持&#xff0c;包括半精度&#xff08;float16&#xff09;、Brain‑float&#xff08;bfloat16&#xff09;、单精度&#xff08;float32&#xff09;和双精度&#xff08;float64&#xff09;&#xff0c;并通过统…...

2025年大数据实训室建设及大数据实训平台解决方案

一、引言 在数字化浪潮中&#xff0c;大数据技术已成为推动各行业创新发展的核心驱动力。从金融领域的风险预测到医疗行业的精准诊断&#xff0c;从电商平台的个性化推荐到交通系统的智能调度&#xff0c;大数据的应用无处不在。据权威机构预测&#xff0c;到 2025 年&#xf…...

我的机器学习之路(初稿)

文章目录 一、机器学习定义二、核心三要素三、算法类型详解1. 监督学习&#xff08;带标签数据&#xff09;2. 无监督学习&#xff08;无标签数据&#xff09;3. 强化学习&#xff08;决策优化&#xff09;(我之后主攻的方向) 四、典型应用场景五、学习路线图六、常见误区警示七…...

Python 高阶函数:日志的高级用法

日志装饰器的 **7 个高阶优化方案**&#xff0c;结合了生产环境最佳实践和调试深度需求&#xff1a; --- ### 一、**智能动态采样装饰器** 解决高频函数日志过多问题&#xff0c;自动根据错误率调整日志频率 python from collections import defaultdict import time cla…...

贪心、动态规划、其它算法基本原理和步骤

目录 1. 贪心1.1 贪心算法的基本步骤1.2 贪心算法实战1.2.1 贪心的经典问题1.2.2 贪心解决数组与子序列问题1.2.3 贪心解决区间调度问题1.2.4 贪心解决动态决策问题1.2.5 贪心解决一些复杂场景应用 2. 动态规划2.1 动态规划的基本步骤和一些优化2.2 动态规划实战2.2.1 斐波那契…...

python-各种文件(txt,xls,csv,sql,二进制文件)读写操作、文件类型转换、数据分析代码讲解

1.文件txt读写标准用法 1.1写入文件 要读取文件&#xff0c;首先得使用 open() 函数打开文件。 file open(file_path, moder, encodingNone) file_path&#xff1a;文件的路径&#xff0c;可以是绝对路径或者相对路径。mode&#xff1a;文件打开模式&#xff0c;r 代表以…...

[250418] 智谱 AI 发布新一代模型,同时推出新域名 Z.ai

目录 智谱开源 GLM-4-32B-0414 系列 AI 模型开源赋能&#xff0c;加速 AI 应用落地性能卓越&#xff0c;比肩顶尖模型应用广泛&#xff0c;赋能各行各业 智谱开源 GLM-4-32B-0414 系列 AI 模型 国内人工智能领军企业智谱华章正式开源新一代 GLM-4-32B-0414 系列大语言模型&…...

ctfshow-大赛原题-web702

因为该题没有理解到位&#xff0c;导致看wp也一直出错&#xff0c;特此反思一下。 参考yu22x师傅的文章 &#xff1a;CTFSHOW大赛原题篇(web696-web710)_ctfshow 大赛原题-CSDN博客 首先拿到题目&#xff1a; // www.zip 下载源码 我们的思路就是包含一个css文件&#xff0c;…...