【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以外的请求类型进行访问,就会报错

    	@Controller
    	public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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.mfbz.cn/a/558769.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关基网络战时代,赛宁网安电力网络攻防靶场全面提升电网安全防护力

随着网络空间成为与陆地、海洋、天空、太空同等重要的人类活动新领域&#xff0c;自网络空间向物理电网发起攻击&#xff0c;破坏电力等国家关键基础设施成为当前大国博弈、大规模战争的重要手段和常态进攻形式。同时&#xff0c;新型电力系统建设发展驱动电力系统形态和控制方…

鸢尾花数据集的KNN探索与乳腺癌决策树洞察

鸢尾花数据集的KNN探索与乳腺癌决策树洞察 今天博主做了这个KNN和决策树的实验。 一.数据集介绍 介绍一下数据集&#xff1a; 威斯康星州乳腺癌数据集&#xff1a; 威斯康星州乳腺癌数据集&#xff08;Wisconsin Breast Cancer Dataset&#xff09;是一个经典的机器学习数…

vue+node使用RSA非对称加密,实现登录接口加密密码

背景 登录接口&#xff0c;密码这种重要信息不可以用明文传输&#xff0c;必须加密处理。 这里就可以使用RSA非对称加密&#xff0c;后端生成公钥和私钥。 公钥&#xff1a;给前端&#xff0c;公钥可以暴露出来&#xff0c;没有影响&#xff0c;因为公钥加密的数据只有私钥才…

Rabbit加密算法:性能与安全的完美结合

title: Rabbit加密算法&#xff1a;性能与安全的完美结合 date: 2024/4/19 19:51:30 updated: 2024/4/19 19:51:30 tags: Rabbit加密对称加密流密码密钥调度安全分析实际应用加密算法 第一章&#xff1a;引言 1. 加密算法的基本概念和应用 加密算法是一种通过对数据进行转换…

排序算法之桶排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性桶排序O(nk )O(nk)O(n^2)O(nk)Out-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b; 不…

【Linux】进程的地址空间

一、看现象 1 #include<stdio.h>2 #include<unistd.h>3 4 int g_val 100;5 int main()6 {7 printf("father process is running!pid: %d,ppid: %d\n",getpid(),getppid( ));8 sleep(1);9 10 int id fork();11 if(id 0)12 {13 int cn…

vue快速入门(三十二)局部与全局注册组件的步骤

注释很详细&#xff0c;直接上代码 上一篇 新增内容 局部注册组件全局注册组件 文件结构 源码 MyHeader.vue <!-- 用于测试全局注册组件 --> <template><div><h1>又可以愉快的学习啦</h1></div> </template><script>export d…

go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控

Linux中的tail命令 tail 命令是一个在 Unix/Linux 操作系统上用来显示文件末尾内容的命令。它可以显示文件的最后几行内容&#xff0c;默认情况下显示文件的最后 10 行。tail 命令 非常有用&#xff0c;特别是在我们查看日志文件或者监视文件变化时。 基本用法如下&#xff1a…

LLM生成模型在生物单细胞single cell的应用:scGPT

参考&#xff1a; https://github.com/bowang-lab/scGPT https://www.youtube.com/watch?vXhwYlgEeQAs 相关算法&#xff1a; 主要是把单细胞测序出来的基因表达量的拼接起来构建成的序列&#xff0c;这里不是用的基因的ATCG&#xff0c;是直接用的基因名称 训练数据&#x…

vue+springboot+websocket实时聊天通讯功能

前言 在我的前一篇文章里 vuespringboot实现聊天功能 &#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; 实现了最最基础的聊天功能&#xff0c;可以通过聊天互相给对方发送信息 &#x1f388;&#x1f388;&#x1f388;&…

Python全栈开发前端与后端的完美融合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在当今互联网时代&#xff0c;全栈开发已经成为了一种趋势。全栈开发者具备前端和后端开发的…

KMP算法(Python)

进阶的做法就是KMP算法&#xff0c;当然暴力也能ac。 KMP主要用一个nex列表&#xff0c;nex[i]存储&#xff08;模式串needle中&#xff09;从第0个到i个字符串s中的一个相等前后缀的最大长度。比如说对于aabaa来说&#xff0c;最大长度应该是&#xff08;前缀aa&#xff09;和…

HarmonyOS开发案例:【首选项】

介绍 本篇Codelab是基于HarmonyOS的首选项能力实现的一个简单示例。实现如下功能&#xff1a; 创建首选项数据文件。将用户输入的水果名称和数量&#xff0c;写入到首选项数据库。读取首选项数据库中的数据。删除首选项数据文件。 最终效果图如下&#xff1a; 相关概念 [首…

盗梦攻击:虚拟现实系统中的沉浸式劫持

虚拟现实&#xff08;VR&#xff09;硬件和软件的最新进展将改变我们与世界和彼此互动的方式&#xff0c;VR头显有可能为用户提供几乎与现实无差别的深度沉浸式体验。它们还可以作为一种跨越遥远距离的方式&#xff0c;通过使用个性化的化身或我们的数字代表&#xff0c;促进社…

笔记-----BFS宽度优先搜索

对于BFS&#xff1a;宽搜第一次搜到就是最小值&#xff0c;并且基于迭代&#xff0c;不会爆栈。 Flood Fill 模型 如果直译的话就是&#xff1a;洪水覆盖&#xff0c;意思就是像是从一个点一圈圈的往外扩散&#xff0c;如果遇见能够连通的就扩散&#xff0c;如果遇见无法联通的…

汽车4S集团数据分析

派可数据分析--汽车4S集团。 派可数据汽车4S集团数据分析概述。派可数据汽车4S集团分析主题全面涵盖行业内各板块业务分析&#xff0c;具体包括&#xff1a;保险业务分析、客户关系分析、汽车保养情况分析、售后维修主题分析、整车销售分析、整车库存分析、装具销售分析、配件…

原型和原型链--图解

https://juejin.cn/post/7255605810453217335 prototype是函数的属性&#xff08;一个对象&#xff09;&#xff0c;不是对象的属性&#xff0c;普通函数和构造函数的prototype属性是空对象&#xff5b;&#xff5d;&#xff08;其实有2个属性&#xff0c;一个是constructor&a…

账号安全基本措施2

sudo命令 sudo(superuser do)&#xff0c;允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。 其配置在/etc/sudoers权。它允许系统管理员集中的管理用户的使用权限和使用的主机。属性必须为0440。 语法检查&#xff1a; 检查语法&#xff1a; 修改文件时&…

Excel中将单元格格式改成文本后,为何要双击数字才会改变?

将大批量的数值型数字转换成文本型数字&#xff0c;当然不能一个一个的去双击做转换了。以下说说有哪个可以将数值型数字转换成文本型数字的方法。 一、转换方法 方法1.数据分列功能 选中数据后&#xff0c;点击数据选项卡&#xff0c;分列&#xff0c; 分列向导的第一步和…

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言&#xff0c;这使我们只要生成一个可执行程序即…