【Java框架】SpringMVC(二)——SpringMVC数据交互

目录

  • 前后端数据交互
  • @RequestMapping注解
    • 基于@RequestMapping注解设置接口的请求方式
    • @RequestMapping注解的常用属性
      • 一个方法配置多个接口
      • method属性
      • params属性
      • headers属性
      • consumes属性
      • produces属性
  • SpringMVC中的参数传递
    • 默认单个简单参数
    • 默认多个简单参数
    • 默认参数中有基本数据类型
    • @RequestParam注解设置参数
      • @RequestParam注解设置参数非必传
      • @RequestParam注解设置参数名称
      • @RequestParam注解设置参数默认值
    • 传对象/Map
    • 传数组
    • 传List集合
    • 传JSON
  • SpringMVC响应数据
    • Spring MVC提供了多种方式输出模型数据
    • 思考:如果是Ajax请求,期望服务端响应的不是页面而是数据,应该怎么处理?
    • @ResponseBody生效范围
      • RestController
  • SpringMVC参数传递时的Rest风格
    • REST(Representational State Transfer),表现形式状态转换
    • 优点:
    • 分类
    • 代码示例
      • 对应的访问方式
        • 查询:
        • 删除:
        • 新增
        • 修改

前后端数据交互

  • Spring MVC框架是控制层框架,主要负责处理前后端之间的数据交互工作,包括从请求中获取入参数据,并向前端返回处理结果。
  • Spring MVC框架是如何处理数据交互问题的?

@RequestMapping注解

  • @RequestMapping注解负责把不同的请求映射到对应的控制器方法上。
  • @RequestMapping注解不仅可以作用于控制器的方法上,还可以标注到控制器类上。
  • @RequestMapping注解添加到Controller类上时,表示当前控制器下所有接口的访问路径有相同的前缀

基于@RequestMapping注解设置接口的请求方式

  • 在Web项目开发中,通常会使用GET类型请求访问查询接口,使用POST类型请求访问保存方法,@RequestMapping注解可以为接口设置访问类型

    @Controller
    public class HelloController {@RequestMapping(value = "/hello",method = {RequestMethod.GET,RequestMethod.POST})public String hello(){return "index";}
    }
    
  • 除了使用method属性设置接口访问类型外,SpringMVC框架还提供了@GetMapping、@PostMapping等注解实现类似功能。如下接口如果使用POST以外的请求类型进行访问,就会报错

    	@Controllerpublic class HelloController {@PostMapping("/hello")public String hello(){return "index";}}
    

在这里插入图片描述
浏览器url访问默认是get请求的

@RequestMapping注解的常用属性

属性名描述
value指定请求的实际访问地址,默认@RequestMapping(“url”)的值url即为value的值。指定的地址可以是 URI Template 模式。
method指定请求的method类型,主要有 GET、POST、DELETE、PUT等;
params指定request中必须包含某些参数值,包含才让该方法处理请求。
headers指定request中必须包含某些指定的header值,包含才能让该方法处理请求。
consumes指定处理请求的提交内容类型(Content-Type),例如:application/json, text/html;
produces指定返回的内容类型,当且仅当request请求头中的(Accept)类型中包含该指定类型才返回;

一个方法配置多个接口

访问/,/hello,/hi都是访问这个hello方法

@Controller
public class HelloController {@RequestMapping(value = {"/","/hello","/hi"})//@RequestMapping(path = {"/","/hello","/hi"})// path也可以public String hello(){return "index";}
}

method属性

  • 如果没有指定method属性,则表示任何形式的请求都可以访问该接口
  • 如果设置了method的值,就只能支持设置值的请求方式,其它请求方式不支持,就会报405错误 – Method Not Allowed
  • 可以指定一种或者多种(数组形式)请求方式
        //@RequestMapping(value = "/hello",method = {RequestMethod.POST,RequestMethod.GET})@RequestMapping(value = "/hello",method = RequestMethod.POST)public String hello(){return "index";}
    

params属性

指定request中必须包含某些参数值,包含才让该方法处理请求。

	//请求中的参数who值为world才执行该方法//@RequestMapping(value = "/hello",params = {"who=world"})//请求中的参数who值不为world才执行该方法@RequestMapping(value = "/hello",params = {"who!=world"})public String hello(String who){System.out.println("hello" + who);return "index";}

在这里插入图片描述

headers属性

指定request请求作用域中必须包含某些指定的header值,包含才能让该方法处理请求。

    @RequestMapping(value = "/hello",headers={"context-type=text/plain","context-type=text/html"})public String hello(){return "index";}

上述访问,如果请求头中不包含context-type=text/plain,context-type=text/html这两个属性,那么就不能访问到该方法,报404错误。

consumes属性

    @RequestMapping(value = "/hello", method = RequestMethod.POST, consumes="application/json")public String hello(){return "index";}

方法仅处理request Content-Type为“application/json”类型的请求。

produces属性

    @RequestMapping(value = "/hello",  method = RequestMethod.GET, produces="application/json")@ResponseBodypublic String hello(){return "index";}

方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json;

SpringMVC中的参数传递

  • 在前面的课程中,使用Servlet接收前端请求时,通常会用到HttpServletRequest对象接收参数,代码如下:
    String realName=request.getParameter(“realName”);
    Integer id=request.getParameter(“id”);
    
  • 每一个参数都需要编写代码进行接收,且需要手动转换参数的类型,判断参数值是否为空,给开发人员带来了很大的工作量。怎么解决?
  • Spring MVC框架提供了@RequestParam注解,可以自动完成以上绝大部分工作。

默认单个简单参数

    @RequestMapping(value = "/hello")public String hello(String who){System.out.println("hello" + who);return "index";}

此时who这个参数可传可不传,但如果传参参数名必须是who

默认多个简单参数

    @RequestMapping(value = "/hello")public String hello(String who,String count){System.out.println("hello" + who + ","+ count);return "index";}

此时who、count都可传可不传,但如果传参参数名必须是who和count,顺序无所谓

默认参数中有基本数据类型

    @RequestMapping(value = "/hello")public String hello(int count){System.out.println("hello,"+ count);return "index";}

在这里插入图片描述

  • 按理说,count可传可不传,但是不传参数,则形参默认值为null,而这个count是几本数据类型,无法将null转换,因此就会报错。
  • 因此,接口中不要用基本数据类型作为参数,尽量使用包装类

@RequestParam注解设置参数

    @RequestMapping(value = "/hello")public String hello(@RequestParam String who){System.out.println("hello" + who);return "index";}
  • 此时,访问这个接口时,就必须传参了,并且参数名只能是who

@RequestParam注解设置参数非必传

required属性,默认值true表示必传,false表示非必传

    @RequestMapping(value = "/hello")public String hello(@RequestParam(required = false) String who){System.out.println("hello" + who);return "index";}

@RequestParam注解设置参数名称

name属性

    @RequestMapping(value = "/hello")public String hello(@RequestParam(name = "paramName",required = false) String who){System.out.println("hello" + who);return "index";}
  • 此时,访问这个接口时,就必须传参了,并且参数名只能是paramName

@RequestParam注解设置参数默认值

defaultvalue属性

    @RequestMapping(value = "/hello")public String hello(@RequestParam(defaultValue = "springmvc") String who){System.out.println("hello" + who);return "index";}
  • 此时,访问这个接口时,如果不传who,那么who就会用springmvc作为默认值

传对象/Map

通常传对象都是用Post请求或者Put请求

    @PostMapping(value = "/hello")public String hello(User user){System.out.println("hello:" + user);return "index";}
  • 此时传参时只需要让参数名与对象的属性名相同,就可以将参数映射到对象中
  • 如果是form表单,只需要让表单各组件的name值与对象属性名相同即可

传数组

    @GetMapping(value = "/hello")public String hello(String[] hobbys){for (String hobby : hobbys) {System.out.println(hobby);}return "index";}
  • 此时传参时,直需要将多个参数值用逗号分割即可
    在这里插入图片描述

传List集合

需要加上@RequestParam才行,否则报错

    @GetMapping(value = "/hello")public String hello(@RequestParam List<String> hobbys){for (String hobby : hobbys) {System.out.println(hobby);}return "index";}

传JSON

示例

    @GetMapping(value = "/hello")public String hello(@RequestBody List<User> userList){userList.forEach(System.out::println);return "index";}

配置转换适配器,否则会报错HttpMediaTypeNotSupportedException: Content type 'application/json' not supp

    <!--处理器适配器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean></list></property></bean>

测试
在这里插入图片描述

SpringMVC响应数据

Spring MVC提供了多种方式输出模型数据

  • 使用ModelAndView对象
        @GetMapping(value = "/hello")public ModelAndView hello(){ModelAndView mv = new ModelAndView();mv.setViewName("index");//设置返回的逻辑视图名mv.addObject("msg","hello world");//设置后端向前端传递的数据return mv;}
    
  • 使用Model对象(推荐)
    在Model中增加模型数据,若不指定key,则默认使用对象的类型作为key
        @GetMapping(value = "/hello")public String hello(Model model){model.addAttribute("msg","Hello,SpringMVC");return "index";}
    
  • 使用Map对象
    Model其实就是一个Map的数据结构,可以使用Map作为处理方法入参
    返回的Map必须放在参数中作为形参,可以改变内容,但不能指向新的Map
        @GetMapping(value = "/hello")public String hello(Map<String,Object> returnMap){returnMap.put("msg","Hello,SpringMVC");return "index";}
    

思考:如果是Ajax请求,期望服务端响应的不是页面而是数据,应该怎么处理?

使用@ResponseBody注解

    @GetMapping(value = "/hello")@ResponseBodypublic User hello(){User user = new User();user.setUserName("周杰伦");user.setUserCode("zjl");return user;}

配置:添加消息转换器

	<mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes"><list><value>application/json;charset=UTF-8</value></list></property></bean><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/json</value></list></property><property name="features"><list><!--   Date的日期转换器 --><value>WriteDateUseDateFormat</value></list></property></bean></mvc:message-converters></mvc:annotation-driven>

在这里插入图片描述

@ResponseBody生效范围

  • 加在方法上,只对该方法生效
  • 加在Controller类上,则该Controller中的所有方法都不再返回页面,而是返回数据
    @Controller
    @ResponseBody
    public class HelloController {...
    }
    

RestController

作用不再解释了,直接看源码,一目了然
在这里插入图片描述

SpringMVC参数传递时的Rest风格

REST(Representational State Transfer),表现形式状态转换

  • 传统风格资源描述形式
  • http://localhost/user/getById?id=1
  • http://localhost/user/saveUser
  • REST风格描述形式
  • http://localhost/user/1
  • http://localhost/user

优点:

  • 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
  • 书写简化

分类

method操作类型
GET查询
POST新增
PUT修改
DELETE删除

代码示例

package cn.smbms.controller;import cn.smbms.pojo.User;
import org.springframework.web.bind.annotation.*;/*** @author: zjl* @datetime: 2024/4/19* @desc:*/
@RestController
@RequestMapping("/user")
public class UserController {@GetMapping("/{id}")public Integer getById(@PathVariable Integer id) {System.out.println("根据id查询" + id);return id;}@PostMapping("/change")public User insert(@RequestBody User user){System.out.println("新增用户" + user);return user;}@PutMapping("/change")public User update(@RequestBody User user){System.out.println("更新用户" + user);return user;}@DeleteMapping("/{id}")public Integer delete(@PathVariable Integer id){System.out.println("删除用户" + id);return id;}
}

对应的访问方式

查询:

http://localhost:9090/smbms/user/1
在这里插入图片描述

删除:

http://localhost:9090/smbms/user/1
在这里插入图片描述

新增

http://localhost:9090/smbms/user/change
在这里插入图片描述

修改

http://localhost:9090/smbms/user/change
在这里插入图片描述

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

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

相关文章

山与路远程控制 一个基于electron和golang实现的远控软件

山与路远程控制 &#x1f3a5;项目演示地址 还在制作… ♻️项目基本介绍 山与路远程控制是基于electron(vue3)和golang实现的远程控制软件(项目界面主要模仿向日葵远程软件,如有侵权请告知),代码可能有点臃肿毕竟只花了一周左右写的无聊项目,如果对其感兴趣的大佬可以fork自…

【JavaScriptThreejs】判断路径在二维平面上投影的方向顺逆时针

原理分析 可以将路径每个连续的两点向量叉乘相加&#xff0c;根据正负性判断路径顺逆时针性 当我们计算两个向量的叉积时&#xff0c;结果是一个新的向量&#xff0c;其方向垂直于这两个向量所在的平面&#xff0c;并且其大小与这两个向量构成的平行四边形的面积成正比。这个新…

爱普生RX-8130CE内置电池控制 RTC

特点&#xff1a;(1)封装极小&#xff0c;集成度高RX-8130CE是一个带|2C接口的实时时钟模块&#xff0c;内部集成32.768KHz晶体振荡器。实时时钟功能不仅集成了年、月、日、星期、小时、分、秒的日历和时钟计数器&#xff0c;同时也有时间闹钟、间隔定时器、时间更新中断等功能…

算法练习|Leetcode49字母异位词分词 ,Leetcode128最长连续序列,Leetcode3无重复字符的最长子串,sql总结

目录 一、Leetcode49字母异位词分词题目描述解题思路方法:哈希总结 二、Leetcode128最长连续序列题目描述解题思路方法:总结 三、Leetcode3无重复字符的最长子串题目描述解题思路方法:双指针法总结sql总结 一、Leetcode49字母异位词分词 题目描述 给你一个字符串数组&#xf…

编译支持播放H265的cef控件

接着在上次编译的基础上增加h265支持编译支持视频播放的cef控件&#xff08;h264&#xff09; 测试页面&#xff0c;直接使用cef_enhancement,里边带着的那个html即可&#xff0c;h265视频去这个网站下载elecard,我修改的这个版本参考了里边的修改方式&#xff0c;不过我的这个…

大语言模型(LLM)漏洞爆发,AI模型无一幸免

本文概述了人工智能初创公司Anthropic于2024年04月03日发表的一篇针对人工智能安全的论文&#xff0c;该公司在本论文中宣布的一种新的“越狱”技术&#xff0c;名为Many-shot Jailbreaking&#xff08;多轮越狱&#xff09;。文章详细描述了目前大语言模型&#xff08;LLM&…

CMake 编译项目

一、概述 cmake 是C一个很重要的编译和项目管理工具&#xff0c;我们在git 上以及常见的项目现在多数都是用cmake 管理的&#xff0c;那么我们今天就做一个同时有Opencv和CGAL 以及PCL 的项目。 二、项目管理 重点是CMakeList.txt 1、CMakeList.txt cmake_minimum_requir…

Springboot3集成Web、RedisTemplate、Test和knife4j

本例将展示&#xff0c;如何在Springboot3中完成&#xff1a; Redis功能的Web接口实现构建Redis功能的单元测试knife4j自动化生成文档 Redis功能 Pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

windows SDK编程 --- 消息(3)

前置知识 一、消息的分类 1. 鼠标消息 处理与鼠标交互相关的事件&#xff0c;比如移动、点击和滚动等。例如&#xff1a; WM_MOUSEMOVE: 当鼠标在窗口客户区内移动时发送。WM_LBUTTONDOWN: 当用户按下鼠标左键时发送。WM_LBUTTONUP: 当用户释放鼠标左键时发送。WM_RBUTTOND…

区块链交易所技术开发架构解析 交易所开发团队

区块链交易所是加密货币市场中的关键基础设施之一&#xff0c;它提供了一个平台&#xff0c;让用户可以买卖各种数字资产。而搭建一个功能完善、安全可靠的交易所需要一个复杂的技术开发架构&#xff0c;以及一个协调配合的交易所开发团队。下面我们将分析交易所的技术架构以及…

Elasticsearch:崭新的打分机制 - Learning To Rank (LTR)

警告&#xff1a;“学习排名 (Learning To Rank)” 功能处于技术预览版&#xff0c;可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题&#xff0c;但此功能不受官方 GA 功能的支持 SLA 的约束。 注意&#xff1a;此功能是在版本 8.12.0 中引入的&#xff0c;并且仅适…

Ghost Buster Pro for Mac:强大的系统优化工具

Ghost Buster Pro for Mac是一款功能强大的系统优化工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供全方位的系统清理、优化和维护服务。 Ghost Buster Pro for Mac v3.2.5激活版下载 这款软件拥有出色的垃圾清理能力&#xff0c;能够深度扫描并清除Mac上的无效目录、文件…

个人网站的SEO优化系列——如何实现搜索引擎的收录

如果你自己做了一个网站&#xff0c;并且想让更多的人知道你的网站&#xff0c;那么无非就是两种途径 一、自己进行宣传&#xff0c;或者花钱宣传 二、使用搜索引擎的自然流量 而如果搜索引擎都没有收录你的站点&#xff0c;别说是自然流量&#xff0c;就算是使用特定语句【sit…

文件上传服务器、文件展示等异步问题

问题&#xff1a; 文件上传模块&#xff1a;当文件已经上传完成&#xff0c;文件进度已经走完了&#xff0c;但是服务器响应还没有返回结果&#xff0c;出现了&#xff0c;获取不到上传后的文件路径&#xff0c;需要等待服务器返回结果后&#xff0c;才能获取文件路径并点击跳…

excel中怎么用乘法、加法来替代AND和OR函数

你可以使用乘法和加法来替代Excel中的AND和OR函数&#xff0c;虽然这样做可能会增加公式的复杂度&#xff0c;但在某些情况下是可行的。 1. 使用乘法替代AND函数&#xff1a;AND函数用于判断一系列条件是否同时成立&#xff0c;如果所有条件都为TRUE&#xff0c;则返回TRUE&…

IOMMU和SMMU详解

前言&#xff1a; IOMMU&#xff08;输入输出内存管理单元&#xff09;的原理与CPU中的MMU&#xff08;内存管理单元&#xff09;相似。它的作用是管理设备的内存访问请求&#xff0c;允许安全、高效地在设备和内存之间直接传输数据。IOMMU通常用于支持高速数据传输的设备&…

java生成数据库数据到excel当做下拉选择,copy就完事~

背景&#xff1a;由于需要下载模板&#xff0c;模板包含下拉选择框&#xff0c;但是下拉选择框不想手写&#xff0c;并且需要从数据库读取&#xff0c;由于直接设置excel会有单元格最大255个字符长度限制&#xff0c;所以用到以下部分代码。 思路&#xff1a;由于数据模板在sh…

怎么通过Javascript脚本实现远程控制一路开关

怎么通过Javascript脚本实现远程控制一路开关呢&#xff1f; 本文描述了使用Javascript脚本调用HTTP接口&#xff0c;实现控制一路开关。一路开关可控制一路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称1智能WiFi…

JSON Web Token 入门

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案&#xff0c;本文介绍它的原理和用法。 一、跨域认证的问题 互联网服务离不开用户认证。一般流程是下面这样。 1、用户向服务器发送用户名和密码。 2、服务器验证通过后&#xff0c;在当前对话&…

基于微信小程序的宠物寄养小程序,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…