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

Spring MVC常用注解及用法

目录

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,则返回nullHttpSession 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 "设置状态码成功";}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 常用工具网站之Emoji
  • Java异常详解(全文干货)
  • 2024中国国际大数据博览会:引领数字变革,共创未来辉煌
  • 页面卡顿检测方案
  • 【STL】红黑树的全面探索与红黑树的实现
  • SQL SERVER日常表碎片和统计信息优化脚本
  • 构建Dubbo工程详解
  • Android Studio Koala下载并安装,测试helloworld.
  • 力扣--1657.确定两个字符串是否接近
  • 氛围感视频素材高级感的去哪里找啊?带氛围感的素材网站库分享
  • 力扣45.跳跃游戏II
  • 通过ICMP判断网络故障
  • Qt:鼠标事件
  • 最近公共祖先(LCA),树上差分,树的直径总结
  • Python优化算法12——蝴蝶优化算法(BOA)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2019年如何成为全栈工程师?
  • 4. 路由到控制器 - Laravel从零开始教程
  • canvas绘制圆角头像
  • Java小白进阶笔记(3)-初级面向对象
  • 代理模式
  • 给Prometheus造假数据的方法
  • 聊聊sentinel的DegradeSlot
  • 什么是Javascript函数节流?
  • 使用权重正则化较少模型过拟合
  • 新书推荐|Windows黑客编程技术详解
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #Linux(权限管理)
  • #NOIP 2014# day.1 T2 联合权值
  • ${ }的特别功能
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (十三)MipMap
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (顺序)容器的好伴侣 --- 容器适配器
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET 发展历程
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net7 环境安装配置
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET周刊【7月第4期 2024-07-28】