Spring MVC常用注解及用法

news2024/9/20 23:57:49

目录

1.建立连接--@RequestMapping

2.请求

2.1 传递单个参数

2.2 传递多个参数

 2.3 传递对象

2.4 参数重命名--@RequestParam

2.5 传递数组

2.6 传递集合

2.7 传递json数据--@RequestBody

2.8 获取URL中参数--@PathVariable

2.9 上传文件--@RequestPart

 2.10 获取Cookie--@CookieValue

2.11 存储和获取Session--@SessionAttribute

2.12 获取Header--@RequestHeader

3.响应

3.1 返回静态页面--@Controller

3.2 返回数据--@ResponseBody

3.3 返回HTML代码片段

3.4 返回json数据

3.5 设置状态码


作为Web框架,学习Spring MVC主要就是了解如何通过浏览器和用户程序进行交互,在这里我就来简单介绍一下Spring MVC中的常见注解以及它们各自的用法。

首先,我们将交互的过程大致分为三个部分:

• 建立连接:将用户(浏览器)和Java程序连接起来

• 请求:用户请求时会带一些参数,在程序中需要想办法获取这些参数,所以请求这块主要是获取参数的功能

• 响应:执行了业务逻辑后,把程序执行的结果返回给用户

1.建立连接--@RequestMapping

在Spring MVC中,使用@RequestMapping来实现URL路由映射,即浏览器连接Java程序(路由映射:当用户访问一个URL时,将用户的请求对应到程序中的某个类的某个方法)

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
    @RequestMapping("/hello")
    public String hello(){//方法名称无需与@RequestingMapping括号内的名称相同
        return "Hello,Spring MVC";
    }
}

执行这段代码后访问http://127.0.0.1:8080/hello(/hello就是@RequestMapping括号中内容)就能看到程序返回的数据

除了@RequestMapping外,我们会发现上述代码中还有另外一个注解@RestController,当我们去掉它时,上面的网页就无法正常访问,在这里它的作用可以简单理解为给类加上特定的标识,从而让Spring更快知道哪些类中的方法可能要执行,当然,这个注解的功能不止一点,这里先不做过多的介绍


@RequestingMapping既可以修饰方法,也可以修饰类。当同时修饰类和方法时,访问的地址是类路径+方法路径

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("/hello")
    public String hello(){
        return "Hello,Spring MVC";
    }
}

执行这段代码后访问的地址是http://127.0.0.1:8080/test/hello(类路径/test+方法路径/hello)


@RequestingMapping既支持GET请求,也支持POST请求,PUT请求等,我们可以通过设置参数来指定请求的类型,或者使用特定的注解

@RequestMapping(value = "/hello",method = RequestMethod.GET)//仅支持GET请求
@RequestMapping(value = "hello",method = RequestMethod.POST)//仅支持POST请求
@RequestMapping(value = "hello",method = {RequestMethod.DELETE,RequestMethod.GET,RequestMethod.POST})//支持多种请求
@GetMapping("hello")//仅支持GET请求
@PostMapping("hello")//仅支持POST请求

注:当多个URL相同时(同一个访问路径下有多个方法),如果支持的请求类型不同,那么访问网页时不会报错,反之,如果支持的请求类型相同,那么访问网页时就会报错

2.请求

访问不同的网页路径,其实就是在发送不同的请求。在发送请求的时候,可能会带有一些参数,这里我们使用Postman这个软件来传递参数(发送带参数的请求)

2.1 传递单个参数

当传递单个参数时,Postman中的key值与对应方法中参数的名称相同(可以不相同,但是需要使用注解,后面会说到),Spring MVC就会将key值对应的value赋值给该参数

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
     public String method1(String name){
         return "接收到参数:"+name;
     }
}

传递参数会出现几种特殊情况

• key值与对应参数名称不同:获取不到参数,接收到的参数为null

• 传递参数类型不匹配:访问网页报错

• 参数为基本类型时不传递参数:当参数类型为基本类型(int,char等),由于基本类型不能转换为空值null,访问网页会报错,而包装类型(Integer等)可以为空值null,所以可以使用包装类型去声明参数

2.2 传递多个参数

传递多个参数和传递单个参数过程类似,在Postman中要使用多个key传递参数

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
     public String method1(String name,Integer age){
         return "name:"+name+" age:"+age;
     }
}

 2.3 传递对象

当参数比较多时,方法声明时就需要很多形参,并且后续每次增加一个参数时都需要修改方法声明,我们就可以把这些参数封装成一个对象,Spring MVC会自动实现对对象参数的赋值

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
     public UserInfo method1(UserInfo userInfo){
         return userInfo;
     }
}

2.4 参数重命名--@RequestParam

在有些特殊情况中,前端传递的参数key和后端接收的key可以不相同(即上面讲到的key和参数名称不相同的情况),这时我们可以使用@RequestParam这个注释来重命名参数

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
     public String method1(@RequestParam(value = "name1",required = false) String name,Integer age){
        //required参数决定了name这个参数是否可以为空值,默认为true(不能为空值)
         return "name:"+name+" age:"+age;
     }
}

2.5 传递数组

Spring MVC可以自动绑定数组参数的赋值

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
     public String method1(String[] str){
         return Arrays.toString(str);
     }
}

2.6 传递集合

当使用Postman传递多个参数时,会默认封装成一个数组进行传递,需要使用@RequestParam注释来绑定参数关系,从而确保传递的参数是集合类

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
     public String method1(@RequestParam List<String> list){
         return list.toString();
     }
}

2.7 传递json数据--@RequestBody

在传递参数时,主要通过正文Body中的键值对与后端参数进行绑定赋值,而当传递json数据时,后端参数没有识别到键值对,就会默认赋值为null,这时候就需要使用@RequestBody注释将请求正文中的数据与后端参数进行绑定

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
    public UserInfo method1(@RequestBody UserInfo userInfo){
        return userInfo;
    }
}

2.8 获取URL中参数--@PathVariable

@PathVariable主要作用于请求URL路径上的数据绑定

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1/{name1}/{age}")
    //@PathVariable修饰的参数不能为空值
    //如果方法参数名称和需要绑定的URL中的变量名称一致,可以不用给@PathVariable的属性赋值
    //反之,如果不一致,需要给@PathVariable的属性赋值
    public String method1(@PathVariable("name1") String name,@PathVariable Integer age){
        return "name:"+name+" age:"+age;
    }
}

2.9 上传文件--@RequestPart

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
    public String method1(@RequestPart MultipartFile file) throws IOException {
        String fileName= file.getOriginalFilename();
        file.transferTo(new File("D:/"+fileName));
        return "接受到文件:"+fileName;
    }
}

 2.10 获取Cookie--@CookieValue

package org.example.mvcdemo;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
    //获取Cookie的第一种方式
    public String method1(HttpServletRequest request) {
        Cookie[] cookies=request.getCookies();
        if(cookies != null) {
            for(Cookie cookie : cookies) {
                System.out.println(cookie.getName()+":"+cookie.getValue());
            }
        }
        return "获取cookie成功";
    }
    @RequestMapping("demo2")
    //获取Cookie的第二种方式
    public String method2(@CookieValue("name") String name) {
        return name;
    }
}

2.11 存储和获取Session--@SessionAttribute

存储Session:

package org.example.mvcdemo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
    public String method1(HttpServletRequest request) {
        //参数为true 如果session对象不存在,则创建一个session对象,反之直接返回
        HttpSession session=request.getSession(true);
        session.setAttribute("name","zhangsan");
        session.setAttribute("age",20);
        return "session设置成功";
    }
}

 获取Session:

package org.example.mvcdemo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
    //获取session的第一种方式
    public String method1(HttpServletRequest request) {
        //参数为false 如果不存在session,则返回null
        HttpSession session=request.getSession(true);
        if(session!=null){
            System.out.println(session.getAttribute("name"));
            System.out.println(session.getAttribute("age"));
        }
        return "session获取成功";
    }
    @RequestMapping("demo2")
    //获取session的第二种方式
    public String method2(HttpSession session) {
        System.out.println(session.getAttribute("name"));
        System.out.println(session.getAttribute("age"));
        return "session获取成功";
    }
    @RequestMapping("demo3")
    //获取session的第三种方式
    //与@RequestParam相同,required参数决定了name这个参数是否可以为空值,默认为true(不能为空值)
    public String method3(@SessionAttribute(value = "name",required = false) String name) {
        return "name:"+name;
    }
}

2.12 获取Header--@RequestHeader

package org.example.mvcdemo;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/test")
public class UserController {
    @RequestMapping("demo1")
    //获取Header的第一种方式
    public String method1(HttpServletRequest request) {
        String userAgent=request.getHeader("User-Agent");
        return userAgent;
    }
    @RequestMapping("demo2")
    //获取Header的第二种方式
    public String method2(@RequestHeader("User-Agent") String userAgent) {
        return userAgent;
    }
}

3.响应

HTTP的响应结果可以是数据,也可以是静态页面,我们可以针对响应去设置状态码,Header信息等。

3.1 返回静态页面--@Controller

@Controller用于返回页面,而一开始讲到的@RestController,是@Controller和@ResponseBody(返回数据)的结合,最终返回的是数据,所以在访问静态页面时,需要使用@Controller注释

package org.example.mvcdemo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/response")
//访问static/response(类路径)/index.html(返回页面)
public class UserController {
    @RequestMapping("demo1")
    public String method1() {
        return "/index.html";
    }
}

3.2 返回数据--@ResponseBody

@ResponseBody用于返回数据。它既是类注解,也是方法注解,当作用在类上时,表示类中的所有方法返回的都是数据,当作用在方法上时,表示该方法返回的是数据

package org.example.mvcdemo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/response")
public class UserController {
    @RequestMapping("demo1")
    @ResponseBody//method1方法返回数据
    public String method1() {
        return "/index.html";//返回字符串/index.html
    }
}

3.3 返回HTML代码片段

后端返回数据时,如果含有HTML代码,会被浏览器解析

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/response")
public class UserController {
    @RequestMapping("demo1")
    public String method1() {
        return "<h1>Hello,Spring MVC</h1>";
    }
}

3.4 返回json数据

当我们返回对象,map等数据时,Spring MVC会将其转换成json数据返回

package org.example.mvcdemo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/response")
public class UserController {
    @RequestMapping("demo1")
    public UserInfo method1() {
        UserInfo userInfo=new UserInfo("zhangsan",18,"123456");
        return userInfo;
    }
}

3.5 设置状态码

通常Spring MVC会根据方法的返回结果自动设置响应状态码,但是我们也可以通过HttpServletResponse提供的方法手动指定状态码

package org.example.mvcdemo;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/response")
public class UserController {
    @RequestMapping("demo1")
    public String method1(HttpServletResponse response) {
        response.setStatus(400);
        return "设置状态码成功";
    }
}

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

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

相关文章

bomb 实验

GDB常用命令&#xff1a; GDB调试常用命令-CSDN博客 原理&#xff1a; 编译与反汇编过程-CSDN博客 Bomb实验实现 阶段一&#xff1a; 分析 分配空间&#xff1a;sub $0x8,%rsp 为局部变量分配栈空间。设置参数&#xff1a;mov $0x402400,%esi 将字符串地址加载到 %esi。…

MMsegmentation与MMdeploy简单使用

最近涉及到了图像分割的任务&#xff0c;于是拿来写下博客加深下使用。 MMsegmentation与MMdeploy的环境配置暂不做讲解&#xff0c;在官网和其他博客中有很多说明。 MMdeploy主要是把pt转为 onnx_int8的情况。 MMsegmentation环境配置可以参考 : 安装与配置MMSegmentation 目录…

【管理型文档】软件需求管理过程(原件)

软件需求管理规程应明确需求收集、分析、确认、变更控制及验证等流程&#xff0c;确保需求准确反映用户期望&#xff0c;支撑软件开发。该规程要求系统记录需求来源&#xff0c;通过评审确保需求完整、清晰、无歧义&#xff0c;实施变更控制以维护需求基线稳定&#xff0c;并持…

后端面试真题整理

面试问题整理 本人主要记录2024年秋招、春招过程中的疑难八股真题&#xff0c;参考来源&#xff1a;牛客网、知乎等。 八股 深拷贝与浅拷贝 浅拷贝&#xff1a; 浅拷贝会在堆上创建一个新的对象&#xff08;区别于引用拷贝的一点&#xff09;&#xff0c;不过&#xff0c;如果…

井盖丢失隐患大?智慧井盖监管系统帮你解决

在现代都市中&#xff0c;我们每天行走在钢筋水泥之间&#xff0c;却很少有人注意到脚下的小小井盖。这些不起眼的圆形铁盘不仅是城市地下管网的入口&#xff0c;更是维系城市生命线的重要组成部分。然而&#xff0c;当暴雨来袭&#xff0c;或是深夜无人之时&#xff0c;井盖的…

无线麦克风什么牌子的音质效果好?一文读懂麦克风哪个牌子的好

无线领夹麦克风哪款音质最好&#xff1f;在这个追求高质量音效的年代&#xff0c;选择一款合适的无线领夹麦克风&#xff08;简称领夹麦&#xff09;对于提升录音或直播的音质至关重要。随着市场的不断扩大&#xff0c;市面上充斥着大量信号不稳定、音质差的无线领夹麦克风&…

2024年汽车零部件企业CRM研究:服务商排名、案例分析、需求分析

最近媒体上频现各车企大佬发声&#xff0c;抗议某汽车企业“不要卷价格&#xff0c;要卷长期价值”&#xff0c;还有的直接批判其打破行业规则。图穷匕现&#xff0c;汽车行业的竞争愈发激烈了。 汽车产业作为我国国民经济的重要支柱产业、经济增长和转型的重要抓手&#xff0…

微软将持续多年的 Mono 项目移交给 Wine

今天&#xff0c;微软突然决定将 Mono 项目交由 Wine 开发社区管理。自Mono项目上一次作为开源.NET框架发布以来&#xff0c;已经过去了五年时间&#xff0c;此前Wine已经使用了Mono的代码&#xff0c;而在微软专注于开源.NET和其他工作的情况下&#xff0c;此举是合理的&#…

Python编程的终极十大工具(非常详细)零基础入门到精通,收藏这一篇就够了

&#x1f91f; 基于入门网络安全打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 Python一直以来都是程序员们的首选编程语言之一&#xff0c;其灵活性和功能强大的库使其成为解决各种问题的理想选择。在本文中&#xff0c;我们将介绍Python编程的终…

fdMemTable内存表进行SQL查询

fdLocalSql可以对fdMemTable内存表进行SQL查询&#xff08;可以对多个fdMemTable内存表进行联表查询哦&#xff09;&#xff0c;fdLocalSql使用SQLITE引擎&#xff0c;而FIREDAC驱动SQLITE&#xff0c;连SQLITE驱动DLL都不需要附带的。 所有设置用FormCreate里用代码 procedure…

【C#】Visual Studio2017 MSDN离线安装

1. 运行Visual Studio Installer 在Windows的开始菜单中直接搜索 2. 单击“修改”按钮 3. 依次点击&#xff0c;单个组件 - 代码工具 - Help Viewer - 修改&#xff0c;开始安装 4. 下载速度慢解决方法 修改IPv4 DNS 参考&#xff1a;visual studio下载慢解决方法&#xf…

unity脚本

Transform.Rotate 描述 使用 Transform.Rotate 以各种方式旋转 GameObjects。通常以欧拉角而不是四元数提供旋转。 可以在世界轴或本地轴中指定旋转。 世界轴旋转使用 Scene 的坐标系&#xff0c;因此在开始旋转 GameObject 时&#xff0c;它的 x、y 和 z 轴与 x、y 和 z 世…

Leetcode 131.分割回文串 回溯 C++实现

Leetcode 131. 分割回文串 问题&#xff1a;给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 算法&#xff1a; 创建二维返回数组 ans &#xff0c;和临时数组 path 。 进入 dfs 函数&#xff0c;当 …

初识linux(1)

linux背景 1991年10月5日&#xff0c;赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组 &#xff08;comp.os.minix&#xff09;中宣布他编制出了一种类似UNIX的小操作系统&#xff0c;叫Linux。新的操作系统是受到另 一个UNIX的小操作系统——Minix的启发…

今日arXiv最热大模型论文:港大微软发布AgentGen提高大模型规划能力,8B模型接近GPT-4水平

夕小瑶科技说 原创 作者 | Richard 在大语言模型&#xff08;LLM&#xff09;问世之后&#xff0c;基于 LLM 的 Agent 引起了广泛的关注并且变得越来越流行。规划能力无论对人类还是 Agent 都是一个重要的决策步骤&#xff0c;规划的本质是通过预先设定的行动过程&#xff0c…

软件设计师全套备考系列文章20 -- UML建模(重点,15分)

软考-- 软件设计师&#xff08;20&#xff09;-- UML建模(重点&#xff0c;15分) 文章目录 软考-- 软件设计师&#xff08;20&#xff09;-- UML建模(重点&#xff0c;15分)前言一、章节考点二、概述三、类图四、用例图五、顺序图六、活动图七、状态图八、通信图九、构建图 前言…

扫码点餐系统的前景如何?

扫码点餐系统作为一种餐饮业数字化转型的关键工具&#xff0c;其发展前景广阔。随着移动支付和智能手机的普及&#xff0c;该系统在餐厅、咖啡馆、快餐店等场所得到广泛应用&#xff0c;不仅简化了顾客点餐流程&#xff0c;减轻了服务员的工作负担&#xff0c;还提高了翻台率。…

沃尔玛停止在 3 个城市使用无人机送货,将重点转移到达拉斯

沃尔玛&#xff0c;作为全球领先的零售商&#xff0c;一直在探索创新的物流解决方案以提升顾客体验。近年来&#xff0c;该公司与无人机送货服务提供商DroneUp合作&#xff0c;尝试通过无人机技术实现快速配送服务。然而&#xff0c;经过一段时间的试点运营后&#xff0c;沃尔玛…

输电线路分布式故障诊断系统:分布式智慧网络的构建

输电线路分布式故障诊断系统&#xff1a;分布式智慧网络的构建 今天&#xff0c;就让深圳鼎信智慧科技陪大家一起走进输电线路分布式故障定位系统的世界&#xff1a; 1、系统架构&#xff1a;分布式智慧网络的构建 输电线路分布式故障定位系统主要由三大核心部分组成&#x…

微服务|一文带你了解无感知部署方案实战

目录 一、现有部署方案介绍 二、Nacos 介绍 三、影响时间的因素 四、方案目录结构 五、方案脚本实现 六、遇到的问题及优化 七、其他替代方案 一、现有部署方案介绍 在程序开发和运维过程中&#xff0c;会频繁地部署服务&#xff0c;并且每个服务的正常运行都依赖于其他服…