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

SpringMvc进阶

SpringMvc进阶

  • SpringMVC引言
  • 一、常用注解
  • 二、参数传递
  • 三、返回值

SpringMVC引言

在Web应用程序开发中,Spring MVC是一种常用的框架,它基于MVC(Model-View-Controller)模式,提供了一种结构化的方式来构建可维护和可扩展的应用程序。本文将介绍Spring MVC框架的基础知识和常用注解,以及参数传递、返回值处理和页面跳转等相关内容。

一、常用注解

1.1. @RequestMapping

@RequestMapping注解用于将HTTP请求映射到控制器方法上,通过指定URL路径和请求的方法类型来定义请求的处理。这是一个非常常用的注解,它可以灵活地匹配多种URL路径和请求方法,为控制器方法提供请求映射规则。

@RequestMapping("/hello1")public String index(String bname,Integer bid ){
//        System.out.println("hello springMvc..");log.info("简单类型参数:bname:{},bid{}",bname,bid);return "index";}

在这里插入图片描述

1.2. @RequestParam

@RequestParam注解用于获取请求参数的值,可以指定参数名和默认值。它可以用于获取基本类型和包装类的参数,并支持参数的必填和可选设置。通过@RequestParam注解,我们可以方便地获取和处理请求中的参数数据。

  @RequestMapping("/hello3")public String hello3(@RequestParam String bname,@RequestParam(required = false) Integer bid){
//        System.out.println("hello springMvc..");log.info("@requestParam:bname:{},bid{}",bname,bid);return "index";};

在这里插入图片描述

1.3. @RequestBody

@RequestBody注解用于接收请求体的数据,并将其转换为对应的Java对象。通常在处理POST请求时使用,通过该注解,我们可以简化获取请求体数据的过程,直接将数据转换为Java对象,方便后续的业务处理。

 @RequestMapping("/hello4/{bid}")public String hello4(@PathVariable("bid") Integer bid){
//        System.out.println("hello springMvc..");log.info("@PathVariable:bname:{},bid{}",bid);return "index";}

在这里插入图片描述

1.4. @RequestHeader

@RequestHeader注解用于获取请求头的值,可以指定头部名称和默认值。通过该注解,我们可以方便地获取请求中的头部信息,并根据需要进行相应的处理。例如,可以获取用户的认证信息、浏览器类型等数据。

@RequestMapping("/hello7")public String hello7( @RequestHeader("jwt") String jwt){
//        System.out.println("hello springMvc..");log.info("@RequestHeader:jwt:{}",jwt);return "index";};

在这里插入图片描述

二、参数传递

在Spring MVC中,控制器方法可以接收不同类型的参数,包括基础类型、字符串、复杂类型等。

2.1. 基础类型+String

控制器方法可以直接将基本类型和字符串作为参数,Spring MVC会自动进行类型转换。例如,可以直接传递整型、字符型、布尔型等参数,并在方法中进行相应的业务处理。

 @ResponseBody@RequestMapping("/hello2")public  Map hello2(HttpServletResponse response) throws Exception {Map<String,Object>map=new HashMap<>();map.put("code",200);map.put("msg","成功添加");
return map;}

在这里插入图片描述

2.2. 复杂类型

如果请求中包含复杂的参数结构,我们可以定义一个与之对应的Java类,并将其作为控制器方法的参数。Spring MVC将自动将请求参数映射到该Java对象的属性上,提供了一种方便的方式来处理复杂的参数传递。

 @RequestMapping("/hello2")public String index(Book book, HttpServletRequest request){
//        System.out.println("hello springMvc..");log.info("复杂类型参数:bname:{},bid{}",request.getParameter("bname"),request.getParameter("bid"));log.info("复杂类型参数:bname:{},bid{}",book.toString());return "index";}

在这里插入图片描述

2.3. @RequestParam

使用@RequestParam注解可以获取请求参数的值,可以指定参数名和默认值。这个注解适用于获取单个参数的值,可以用于基本类型、字符串等参数的获取。

 @RequestMapping("/hello3")public String hello3(@RequestParam String bname,@RequestParam(required = false) Integer bid){
//        System.out.println("hello springMvc..");log.info("@requestParam:bname:{},bid{}",bname,bid);return "index";};

2.4. @PathVariable

使用@PathVariable注解可以获取URL路径中的变量值,将路径变量绑定到方法参数上。这个注解适用于RESTful风格的URL处理,可以方便地获取URL中的动态参数。

@RequestMapping("/hello4/{bid}")public String hello4(@PathVariable("bid") Integer bid){
//        System.out.println("hello springMvc..");log.info("@PathVariable:bname:{},bid{}",bid);return "index";};

2.5. @RequestBody

使用@RequestBody注解可以将请求体的数据转换为对应的Java对象,并作为方法的参数。通过该注解,我们可以直接获取请求体中的数据,并进行后续的业务处理。

  @RequestMapping("/hello6")public String hello6( @RequestBody Map map){
//        System.out.println("hello springMvc..");log.info("@RequestBody:map:{}",map);return "index";};

2.6. @RequestHeader

使用@RequestHeader注解可以获取请求头的值,可以指定头部名称和默认值。通过该注解,我们可以方便地获取请求头中的信息,并根据需要进行相应的处理。

  @RequestMapping("/hello7")public String hello7( @RequestHeader("jwt") String jwt){
//        System.out.println("hello springMvc..");log.info("@RequestHeader:jwt:{}",jwt);return "index";};

三、返回值

在Spring MVC中,控制器方法可以返回不同类型的值作为响应结果,根据业务需求选择合适的返回类型。

3.1. void

如果控制器方法返回值为void,则表示该方法没有返回值。这种情况下,通常是直接向客户端写入数据或者通过其他方式进行响应处理。

 public  void hello1(HttpServletResponse response) throws Exception {Map<String,Object>map=new HashMap<>();map.put("code",200);map.put("msg","成功添加");ResponseUtil.writeJson(response,map);};

3.2. String

控制器方法可以返回一个字符串作为响应结果,这个字符串可以表示视图的名称或者响应的内容。当返回视图名称时,Spring MVC会根据视图解析器的配置找到对应的视图并渲染返回给客户端。

 @ResponseBody@RequestMapping("/hello2")public  Map hello2(HttpServletResponse response) throws Exception {Map<String,Object>map=new HashMap<>();map.put("code",200);map.put("msg","成功添加");
return map;};

3.3. String+Model

控制器方法可以返回一个字符串和一个Model对象。这种情况下,字符串表示视图的名称,而Model对象用于在视图中传递数据。通过Model对象,我们可以将数据传递到视图中进行展示或者其他业务处理。

@RequestMapping("/hello4")public  String hello4(Model model, HttpServletRequest request) throws Exception {
model.addAttribute("currentName","鸭");request.setAttribute("location","鸡");return "index";};

3.4. ModelAndView

控制器方法可以返回一个ModelAndView对象,它包含了视图名称和数据模型。ModelAndView是一种更加灵活的方式来处理视图和数据的传递,可以同时指定视图名称和数据模型,并在需要的时候进行相应的操作。

 @RequestMapping("/hello5")public ModelAndView hello5(Model model, HttpServletRequest request) throws Exception {ModelAndView mv=new ModelAndView();mv.addObject("sign","h");
mv.setViewName("index");return mv;};

四、页面跳转
在Spring MVC中,页面跳转可以通过转发(forward)或重定向(redirect)来实现。

@RequestMapping("/hello6")public String hello6() throws Exception {System.out.println("hello6");return "forward:hello2";};

4.1. 转发(forward)

使用请求转发将请求发送到另一个URL路径上进行处理,客户端的URL地址不会变化。这种方式适用于不同请求之间的跳转和处理,可以共享请求的上下文数据。

 @RequestMapping("/hello7")public String hello7() throws Exception {System.out.println("hello6");return "forward:/param//hello1";};

4.2. 重定向(redirect)

使用重定向将请求发送到另一个URL路径上进行处理,客户端的URL地址会改变。这种方式适用于不同请求之间的跳转和处理,可以避免表单重复提交等问题。

 @RequestMapping("/hello9")public String hello9() throws Exception {System.out.println("hello6");return "redirect:/param//hello1";};

总结:

本文介绍了Spring MVC框架的基础知识和常用注解,以及参数传递、返回值处理和页面跳转等相关内容。掌握了这些知识,我们可以更加灵活地开发Web应用程序,实现不同功能和业务需求。在后续的文章中,我们将深入讨论Spring MVC的更多特性和用法,帮助读者更好地理解和应用该框架。

相关文章:

SpringMvc进阶

SpringMvc进阶 SpringMVC引言一、常用注解二、参数传递三、返回值 SpringMVC引言 在Web应用程序开发中&#xff0c;Spring MVC是一种常用的框架&#xff0c;它基于MVC&#xff08;Model-View-Controller&#xff09;模式&#xff0c;提供了一种结构化的方式来构建可维护和可扩…...

SpringCloud Alibaba 入门到精通 - Nacos

SpringCloud Alibaba 常用组件 一、基础结构搭建1.父工程创建2.子工程创建 二、Nacos&#xff1a;注册中心1.服务端搭建2.注册中心-客户端搭建3.注册中心-管理页面4.注册中心-常用配置5.注册中心-核心功能总结 三、Nacos注册中心集成Load Balancer 、OpenFeign1.Nacos客户端集成…...

new/delete, malloc/free

区别&#xff1a; 首先new/delete是运算符&#xff0c;malloc/free是库函数。malloc/free只开辟内存不初始化&#xff1b;new/delete及开辟内存也初始化。抛出异常的方式&#xff1a;new/delete开辟失败使用抛出bad_alloc&#xff1b;malloc/free通过返回值判断。malloc和new区…...

oracle将一个用户的表复制到另一个用户

注&#xff1a;scott用户和scott用户下的源表&#xff08;EMP&#xff09;本身就有&#xff0c;无需另行创建。 GRANT SELECT ON SCOTT.emp TO BI_ODSCREATE TABLE ODS_EMP AS SELECT * FROM SCOTT.emphttp://www.bxcqd.com/news/77615.html SQL语句查询要修改密码的用户…...

C#知识点、常见面试题

相关源码 https://github.com/JackYan666/CSharpCode/blob/main/CSharpCode.cs 0.简要概括 1.For循环删除集合元素可能漏删:从后面往前删除 2.Foreach不能直接修改集合元素:用递归的思想,删除完了的集合重新遍历 3.闭包问题:for循环存在闭包,可以通过使用临时变量解决…...

【STM32】锁存器

问题背景 在学习FSMC控制外部NOR存储器时&#xff0c;看到在NOR复用接口模式下&#xff0c;AD信号[15:0]是复用的。也就是说&#xff0c;若不使用锁存器:当NADV为低时&#xff0c;ADx(x0…15)上出现地址信号Ax&#xff0c;当NADV变高时&#xff0c;ADx上出现数据信号Dx。若使用…...

DGIOT-Modbus-RTU控制指令05、06的配置与下发

[小 迪 导 读]&#xff1a;伴随工业物联网在实际应用中普及&#xff0c;Modbus-RTU作为行业内的标准化通讯协议。在为物联网起到采集作用的同时&#xff0c;设备的控制也是一个密不可分的环节。 场景解析&#xff1a;在使用Modbus对设备进行采集后&#xff0c;可以通过自动控制…...

机器学习实战-系列教程8:SVM分类实战3非线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读

&#x1f308;&#x1f308;&#x1f308;机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1之简单SVM分类 SVM分类实战2线性SVM SVM分类实战3非线性SVM 4、非线性SVM 4.1 创建非线性数据 from sklearn.data…...

计算机网络-谢希任第八版学习笔记总结

一.计算机网络概述 21世纪三个特点 数字化 信息化 智能化&#xff0c;其中主要是围绕智能化。 网络的常见分类&#xff1a; 电话网络 有线电视网络 计算机网络 互联网&#xff1a;Internet 由数量极大的计算机网络相连接 特点&#xff1a; 共享性 连通性 互联网&…...

手写Spring:第5章-注入属性和依赖对象

文章目录 一、目标&#xff1a;注入属性和依赖对象二、设计&#xff1a;注入属性和依赖对象三、实现&#xff1a;注入属性和依赖对象3.0 引入依赖3.1 工程结构3.2 注入属性和依赖对象类图3.3 定义属性值和属性集合3.3.1 定义属性值3.3.2 定义属性集合 3.4 Bean定义补全3.5 Bean…...

初识集合框架 -Java

目录 一、集合框架的概念 二、集合框架的重要性 三、涉及的数据结构和算法 3.1 什么是数据结构 3.2 集合框架&#xff08;容器&#xff09;背后对应的数据结构 3.3 相关的Java知识 3.4 什么是算法 3.5 如何学好数据结构和算法 一、集合框架的概念 Java 集合框架&#xff0c;…...

目标检测笔记(十五): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOX介绍三、源码获取四、环境搭建4.1 环境检测 五、数据集准备六、模型训练七、模型验证八、模型测试 一、目标检测介绍 目标检测&#xff08;Object Detection&#xff09;是计算机视觉领域的一项重要技术&#xff0c;旨在识别图像或视频中的…...

深眸科技自研轻辙视觉引擎,以AI机器视觉赋能杆号牌识别与分拣

电线杆号牌作为电力行业标识的一种&#xff0c;相当于电线杆的“身份证”&#xff0c;担负着宣传电力知识、安全警示的作用&#xff0c;用于户外使用标记输电线路电压等级、线路名称、杆塔编号等&#xff0c;能够清晰地记录电力线路杆的信息&#xff0c;并为电力线路的更改以及…...

Shell命令管理进程

Shell命令管理进程 列出进程 ps命令 top命令 管理后台进程 启动后台进程 查看后台进程 jobs和ps的区别 停止进程 Linux除了是一种多用户操作系统之外&#xff0c;还是一种多任务系统。多任务意味着可以同时运行多个程序。Linux 提供了相关的工具来列出运行中的进程,监视…...

python创建exe文件

1、搭建环境 pip install pyinstaller 2、准备测试代码 exe_test.py import timeprint("hello") print("hello") print("hello") print("hello")time.sleep(5) 注&#xff1a;添加sleep以便在执行exe文件的时候能看到结果 3、生…...

【数据结构】AVL树的插入与验证

文章目录 一、基本概念1.发展背景2.性质 二、实现原理①插入操作1.平衡因子1.1平衡因子的更新1.1.1树的高度变化1.1.2树的高度不变 2. 旋转2.1左旋2.2右旋2.3右左双旋2.4 左右双旋 ②验证1.求二叉树高度2. 判断是否为AVL树 源码总结 一、基本概念 1.发展背景 普通的二叉搜索树…...

9.3.3网络原理(网络层IP)

一.报文: 1.4位版本号:IPv4和IPv6(其它可能是实验室版本). 2.4位首部长度:和TCP一样,可变长,带选项,单位是4字节. 3.8位服务类型 4.16位总长度:IP报头 IP载荷 传输层是不知道载荷长度的,需要网络层来计算. IP报文 - IP报头 IP载荷 TCP报文 TCP载荷 IP载荷(TCP报文) …...

代码随想录算法训练营第四十八天| LeetCode121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

121. 买卖股票的最佳时机 题目描述: 121. 买卖股票的最佳时机. 解法 dp class Solution(object):def maxProfit(self, prices):if not prices:return 0dp0 0# 0表示不持有股票&#xff0c;1表示持有股票dp1 0-prices[0]for i in range(1,len(prices)):# 当前没有股票# 两…...

C++新经典10--vector以及其使用

vector vector类型是一个标准库中的类型&#xff0c;代表一个容器、集合或者动态数组这样一种概念。既然是容器&#xff0c;那就可以把若干个对象放到里面。当然&#xff0c;这些对象的类型必须相同。简单来说&#xff0c;可以把一堆int型数字放到vector容器中去&#xff0c;复…...

std : : vector

一.简介 std::vector 的底层实现通常基于动态数组&#xff08;dynamic array&#xff09;&#xff0c;它是一种连续分配的内存块&#xff0c;允许元素的快速随机访问。下面是 std::vector 的一些关键特点和底层实现细节&#xff1a; 连续内存块&#xff1a;std::vector 内部使…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...