Spring MVC中的常用注解及其用法

news/2024/7/3 17:53:51 标签: spring, mvc

文章目录

  • 一、建立连接
  • 二、接收请求
    • 2.1请求中带有一个参数
    • 2.2请求中带有多个参数
    • 2.3用对象接收请求中的参数
    • 2.4对请求中的参数进行重命名
    • 2.5请求参数中带有数组
    • 2.6请求参数中带有集合
    • 2.7json字符串和Java对象互转
    • 2.8前端传递json数据给后端、json数据在请求正文中、后端接收json数据
    • 2.9获取url中的参数
    • 2.10获取url中的参数并对参数进行重命名
    • 2.11上传文件
  • 三、获取cookie和session
    • 3.1传统方式获取cookie(可以获取到所有的cookie)
    • 3.2简洁方式获取cookie(可以获取到指定的cookie)
    • 3.3传统方式设置session和获取session
    • 3.4简洁方式获取session
  • 四、获取header
    • 4.1传统方式获取header,可以获取到全部header
    • 4.2简洁方式获取header
  • 五、返回响应

一、建立连接

@RequestMappering可以作用在类上(类注解)、也可以作用在方法上(方法注解)。
@RequestMappering后面的括号中:双引号的值会赋值给value这个属性。只有一个属性且属性名为value时这个属性名可以省略不写。
@RequestMappering默认支持get/post请求,可以使用method属性来限制请求方式。

@RequestMapping(value = "/hello/t1", method = RequestMethod.GET)    
public String hello(){       
    return "hello";    
}

二、接收请求

2.1请求中带有一个参数

@RequestMapping("/r1")
public String r1(String name){
    return "接收到参数 name:"+name;
}
@RequestMapping("/r2")
public String r2(Integer age){
    return "接收到参数 age:"+age;
}

2.2请求中带有多个参数

@RequestMapping("/r3")    
public String r3(String name,Integer age){//注意参数类型要写Integer不要写int,因为请求中没有传参数时则传的参数是null,int类型的变量不能接收null
    return "name:"+name+",age:"+age;    
}

2.3用对象接收请求中的参数

public class UserInfo {//假设代码中定义了UserInfo类
    private int id;    
    private String name;    
    private Integer age;       
    public UserInfo() {    
    }    
    public UserInfo(int id, String name, Integer age) {        
        this.id = id;       
        this.name = name;       
        this.age = age;  
    }   
    public int getId() {        
        return id;    
    }   
   ...
}
@RequestMapping("/r4")    
public String r4(UserInfo user){        
    return user.toString();    
}

2.4对请求中的参数进行重命名

从请求中获取name参数的值并赋值给代码中的username参数。@RequestParam注解里加required = false则表示这个注解修饰的参数可以不传(否则这个注解修饰的参数一定要传),不传时这个参数的值为null。required默认为true。

@RequestMapping("/r5")    
public String r5(@RequestParam(value = "name",required = false) String username, @RequestParam("age") Integer userage){        
    return "username:"+username+",age:"+userage;    
}

2.5请求参数中带有数组

@RequestMapping("/r6")    
public String r6(String[] arr){        
    return Arrays.toString(arr)+",length:"+arr.length;    
}

2.6请求参数中带有集合

默认情况下,请求中参数名相同的多个值,是封装到数组中的。如果要封装到集合,要使⽤@RequestParam绑定参数关系。
以下为绑定参数关系的同时对参数中的集合名进行重命名:

  @RequestMapping("/r7")
    public String r7(@RequestParam(value = "list", required = false) List<String> list1){
        if (list1!=null){
            return list1.toString()+",size:"+list1.size();
        }
        return "list为空";
    }

2.7json字符串和Java对象互转

以下这种转换方式:拿到json字符串把这个json字符串转换为java对象的时候,会调用java对象无参的构造函数构造成一个空的对象,再对字符串进行解析对空对象的属性进行赋值。所以java对象所属的类中如果我们自己写了有参的构造方法则要把无参的构造方法加上。

public static void main(String[] args) throws JsonProcessingException {        ObjectMapper objectMapper = new ObjectMapper();        
    UserInfo userInfo = new UserInfo();          
    userInfo.setName("lingliang");          
    userInfo.setAge(16);        
    userInfo.setId(1);       
    //对象转json        
    String s = objectMapper.writeValueAsString(userInfo);          
    System.out.println(s);          
    //json字符串转成Java对象      
    UserInfo userInfo1 = objectMapper.readValue(s, UserInfo.class);  
    System.out.println(userInfo1);    
}

2.8前端传递json数据给后端、json数据在请求正文中、后端接收json数据

@RequestMapping("/r8")    
public String r8(@RequestBody UserInfo userInfo){        
    return userInfo.toString();    
}

2.9获取url中的参数

@RequestMapping("/r9/{articleId}")    
public String r9(@PathVariable Integer articleId){        
    return "articleId:"+articleId;   
}

2.10获取url中的参数并对参数进行重命名

将url中的参数name重命名为userName:

@RequestMapping("/r10/{name}/{age}")    
public String r10(@PathVariable("name") String userName, @PathVariable Integer age){        
    return "name:"+userName+",age:"+age;    
}

2.11上传文件

即获取请求中的文件。@RequestPart这个注解不写也行,这个注解可以对file进行重命名。

@RequestMapping("/r11")    
public String r11(@RequestPart MultipartFile file) throws IOException {        
    String fileName = file.getOriginalFilename();        
    file.transferTo(new File("D:/temp/"+fileName));          
    return "获取上传文件: "+file.getOriginalFilename();    
}

三、获取cookie和session

3.1传统方式获取cookie(可以获取到所有的cookie)

@RequestMapping("/getCookie1")    
public String getCookie(HttpServletRequest request){        
    Cookie[] cookies = request.getCookies();
    //Arrays.stream(cookies).forEach(x -> System.out.println(x.getName()+":"+x.getValue()));        
    if (cookies!=null){            
        for (Cookie c: cookies){                
            System.out.println(c.getName()+":"+c.getValue());         
        }           
         return "获取Cookie成功";      
    }          
    return "Cookie 为空";    
}

3.2简洁方式获取cookie(可以获取到指定的cookie)

@RequestMapping("/getCookie2")    
public String getCookie2(@CookieValue("byte") String byte){   
    return "byte:" + byte;    
}

3.3传统方式设置session和获取session

@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
    HttpSession session = request.getSession();
    session.setAttribute("userName","zhangsan");
    return "设置Session成功";
}

@RequestMapping("/getSession1")
public String getSession(HttpServletRequest request){
    HttpSession session = request.getSession();
    String userName = (String)session.getAttribute("userName");
    return "登录用户:"+ userName;
}

3.4简洁方式获取session

简洁方式1获取session:

@RequestMapping("/getSession2")
public String getSession(HttpSession session){//如果后端还没有session则HttpSession session会帮我们创建一个session,只是这个session里面没有内容。这预防了空指针异常的出现。
    String userName = (String)session.getAttribute("userName");
    return "登录用户:" + userName;
}

简洁方式2获取session:

@RequestMapping("/getSession3")
public String getSession(@SessionAttribute(value = "userName", required = false) String userName){
    return "登录用户:" + userName;
}

四、获取header

4.1传统方式获取header,可以获取到全部header

@RequestMapping("/getHeader")    
public String getHeader(HttpServletRequest request){        
    String userAgent = request.getHeader("User-Agent");        
    return "userAgent:"+userAgent;    
}

4.2简洁方式获取header

这种方式想获取到全部header则参数声明要写得非常长。

@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent){
    return "userAgent:"+userAgent;
}

五、返回响应

(1)返回静态页面。
(2)返回数据。
(3)返回HTML片段。
(4)返回json。
(5)设置状态码、编码方式、header。

元注解(即可以注解到其它注解的注解):
1)@Target({ElementType}.TYPE):表示注解的使用范围,TYPE表示注解的使用范围是类。
2)@Retention(RetentionPolicy.RUNTIME):表示注解的生命周期。
3)@Documented。

@RestController=@Controller+@ResponseBody。
@Controller是在告诉Spring,Spring要帮我们管理哪些程序,用@Controller修饰则默认返回的是页面。
@ResponseBody表示返回数据,其既可以修饰类又可以修饰方法,修饰类表示该类内的所有方法返回的都是数据,修饰方法表示该方法返回的是数据。

@Controller
//@RestController
@RequestMapping("/return")
public class ReturnController {
    @RequestMapping("/r1")
    public String r1(){
        return "/index.html";//返回静态页面
    }

    @ResponseBody
    @RequestMapping("/r2")
    public String r2(){
        return "hello, spring";//返回数据
    }

    @ResponseBody
    @RequestMapping("/r3")
    public String r3(){
        return "<h1>我是返回的html片段</h1>";//返回html片段
    }

    @ResponseBody
    @RequestMapping("/r4")
    public UserInfo r4(){
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setName("lingliang");
        userInfo.setAge(16);
        return userInfo;//返回json。当方法返回值类型为对象的时候,Spring会把响应的Content-Type自动设置为application/json。当返回的是数据,方法返回值类型为String的时候,默认情况下,Spring会把响应的Content-Type自动设置为text/html。
    }

    @ResponseBody
    @RequestMapping("/r5")
    public Map<String,String> r5(){
        HashMap map = new HashMap();
        map.put("k1","v1");
        map.put("k2","v2");
        return map;//Spring会把响应的Content-Type自动设置为application/json。
    }

    @RequestMapping("/r6")
    public String r6(){
        return "/a.js";//Spring会把响应的Content-Type自动设置为application/javascript。
    }

    @RequestMapping("/r7")
    public String r7(){
        return "/b.css";//Spring会把响应的Content-Type自动设置为text/css。
    }

    @ResponseBody
    @RequestMapping("/r8")
    public String r8(HttpServletResponse response){
        response.setStatus(401);
        return "设置状态码成功";//设置状态码。状态码不影响界面的展示。
    }

    @ResponseBody
    //@RequestMapping("/r9")
    @RequestMapping(value = "/r9", produces = "application/json; charset=utf8")//设置响应的Content-Type,因为当返回的是数据,方法返回值类型为String的时候,默认情况下,Spring会把响应的Content-Type自动设置为text/html。
    public String r9(){
        return "{\"OK\":1}";//返回的是一个json数据。
    }

    @ResponseBody
    @RequestMapping(value = "/r10")
    public String r10(HttpServletResponse response){
      response.setHeader("myHeader","myHeaderValue");//设置自定义的header。
        return "设置header成功";
    }
}

http://www.niftyadmin.cn/n/5325262.html

相关文章

宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新

来源&#xff1a;宏集科技 工业物联网 宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新 原文链接&#xff1a;https://mp.weixin.qq.com/s/DwzVzifUiidNr-FT3Zfzpg 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 01 前言 近年来&#xff0c;中国食品行业…

Golang 三数之和+ 四数之和 leetcode15、18 双指针法

文章目录 三数之和 leetcode15map记录 失败&#xff01;超出限制双指针法 四数之和 leetcode18 三数之和 leetcode15 知识补充&#xff1a; map的key值必须是可以比较运算的类型&#xff0c;不可以是函数、map、slice map记录 失败&#xff01;超出限制 //得到结果后再去重 失…

【RT-DETR改进涨点】为什么YOLO版本的RT-DETR训练模型不收敛的问题

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 其中提到的多个版本ResNet18、ResNet34、ResNet50、ResNet101为本人根据RT-…

Echarts折线图中数据根据正负数显示不同区域背景色-配置

示例 Echarts折线图中数据根据正负数显示不同区域背景色 Piecewise 分段类型Continuous 连续类型 Echarts配置 option {backgroundColor: "#030A41",xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun],axisTick: {show: false,},axisLabel: { /…

【leetcode100-035】【链表/哈希链表】LRU缓存

【题干】 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;…

流星全自动网页生成系统重构版源码

流星全自动网页生成系统重构版源码分享&#xff0c;所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 为用户使用方便考虑&#xff0c;全自动网页制作系统无需繁琐…

go语言开发工作中常用命令

Go 编程语言中的常用命令主要用于构建、测试、运行和管理项目。以下是一些常见的 Go 命令&#xff0c;以及它们对项目的用途&#xff1a; go run 用途&#xff1a; 编译并运行 Go 程序。 示例&#xff1a; go run main.gogo build 用途&#xff1a; 编译 Go 程序&#xf…

01-k8s学习笔记之认识 Kubernetes

1、什么是 Kubernetes&#xff1f; Kubernetes 是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c; Kubernetes 的目标是让部署容器化的应用简单并且高效&#xff08;powerful&#xff09;&#xff0c; Kubernetes 提供了应用部署&#xff0c;规划…