springmvc中的常用注解说明及RestFul风格

1、@Controller

@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。

@Controller
public class UserLogonCotroller {
}

2、@RequestMapping:请求映射

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

当标注在方法上时,则该方法会成为一个请求处理的方法,它会在程序接收到对应的url请求时被调用

RequsestMapping有六个属性:
value:
指定请求的地址。

String[] value() default {};//可以用数组{}写多个,中间用逗号隔开。默认默认RequestMapping("/user")即为value的值;

用法1:可以指定为普通的具体值;

@RequestMapping(value = {"/hello"})
地址栏请求:(springmvc02为当前项目的部署名称)
http://localhost:8080/springmvc02/hello

用法2:可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable String ownerId, Model model) {
  Owner owner = ownerService.findOwner(ownerId);  
  model.addAttribute("owner", owner);  
  return "displayOwner"; 
}

这种用法一般配合路径变量使用。是restFul风格的请求。
RESTful的URL路径变量
URL-PATTERN:设置为/,方便拦截RESTful请求。
@PathVariable:可以解析出来URL中的模板变量({id}/{name})

在这里插入图片描述
用法三: 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);

模糊匹配:

package com.fan.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;

@Controller//将此类对象注册到容器中
public class HelloController {

    //精确匹配
    @RequestMapping(value = {"/hello"},method = RequestMethod.GET)//请求的路径
    public String hello(Model model){//形参是数据模型类型Model
        //封装数据
        model.addAttribute("msg","hello,springmvc");
        return "hello";//直接返回视图名称
    }

    //模糊匹配:?代表一个字符,0个多个字符都不行,也不能是不合法的字符/
    //模糊和精确多个匹配情况下,精确优先。
    @RequestMapping(value = {"/hello?"},method = RequestMethod.GET)//请求的路径
    public String hello2(Model model){//形参是数据模型类型Model
        //封装数据
        model.addAttribute("msg","hello2,springmvc2");
        System.out.println("hello2,springmvc2");
        return "hello";//直接返回视图名称
    }

    //*匹配任意多个字符
    @RequestMapping(value = {"/hello*"},method = RequestMethod.GET)//请求的路径
    public String hello3(Model model){//形参是数据模型类型Model
        //封装数据
        model.addAttribute("msg","hello3,springmvc3");
        System.out.println("hello3,springmvc3");
        return "hello";//直接返回视图名称
    }

    //   *可以匹配一层路径
    @RequestMapping(value = {"/a/*/hello"},method = RequestMethod.GET)//请求的路径
    public String hello4(Model model){//形参是数据模型类型Model
        //封装数据
        model.addAttribute("msg","hello4,springmvc4");
        System.out.println("hello4,springmvc4");
        return "hello";//直接返回视图名称
    }

    //  ** 可以匹配多级目录
    @RequestMapping(value = {"/a/**/hello"},method = RequestMethod.GET)//请求的路径
    public String hello5(Model model){//形参是数据模型类型Model
        //封装数据
        model.addAttribute("msg","hello5,springmvc5");
        System.out.println("hello5,springmvc5");
        return "hello";//直接返回视图名称
    }

}

method:
指定请求的method类型, GET、POST、PUT、DELETE等;默认是什么类型的请求方式都可以接收。

RequestMethod[] method() default {};//可以用{}来写多个,中间用逗号隔开。

用法:
在这里插入图片描述

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

String[] params() default {};//可以用数组{}写多个,中间用逗号隔开。

用法:
请求栏信息:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

consumes:
指定处理请求的提交内容类型(规定请求头中的Content-Type),例如application/json, text/html;

produces:
告诉浏览器指定返回的内容类型,仅当请求头中的(Accept)类型中包含该指定类型才返回;

headers:
指定request请求中中必须包含某些指定的headers(请求头)值,才能让该方法处理请求。

String[] headers() default {};

用法:
拿取浏览器的请求头的User-Agent信息:
在这里插入图片描述
使用:
在这里插入图片描述

@Controller

@RequestMapping("/user")
public class UserLogonCotroller {
@RequestMapping(value = "/logon", method = {RequestMethod.GET, RequestMethod.POST },
params = {"loginname", "username"})
public void logon(HttpServletRequest request){
}
}

扩展:
在这里插入图片描述
在这里插入图片描述

3、@PathVariable:路径变量

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

经常结合restful风格来取出请求中/{}中的变量

在这里插入图片描述

@RequestMapping(value = "/logon", method = {RequestMethod.GET, RequestMethod.POST },
                    params = {"loginname", "username"})
    public void logon(HttpServletRequest request
            ,@PathVariable("loginname") String loginname
            ,@PathVariable("username") String username){
    }

或者结合restful风格使用:

//路径上可以有占位符,占位符语法就是可以在任意路径的地方写一个{变量名}
    //  比如/user/admin和   /user/123,注意路径上的占位符{}只能占一层路径
    @RequestMapping(value = {"/user/{id}"})//请求的路径
    public String hello5(@PathVariable("id")String id, Model model){//形参是数据模型类型Model
        //封装数据
        model.addAttribute("msg","hello5,springmvc5");
        System.out.println("路径上的占位符:"+id);
        return "hello";//直接返回视图名称
    }

在这里插入图片描述

4、@RequestParam:请求参数

当前端提交的域名称和controller中处理方法的参数名不一致时,springmvc提供了@RequestParam(“前端参数名”)来进行间接数据的绑定。

代码演示:

//前台请求:http://localhost:8080/springmvc02/user?uid=2
    @RequestMapping(value = {"/user"})//请求的路径
    public String hello2(@RequestParam("uid") Integer id){//形参是数据模型类型Model
        System.out.println("id="+id);
        return "hello";//直接返回视图名称
    }

@RequestParam主要用于在SpringMVC后台控制层获取参数,用于进行前端和后端数据参数绑定转换的注解,类似一种是request.getParameter(“name”),它有三个常用参数:defaultValue , required , value ;defaultValue 表示我们可以自己设置默认值,required 通过boolean设置是否是必须要传入的参数,value 值表示指定要获取的参数的key。

或者比较老的方式:

@RequestMapping(value = "/logon", method = {RequestMethod.GET, RequestMethod.POST },
                   params = {"loginname", "username"})
    public void logon(HttpServletRequest request
            , @RequestParam(value = "loginname", required = false) String loginname
            , @RequestParam(value = "username", required = false) String username){
    }

@RequestParam和@PathVariable的区别:

@PathVariable主要用于接收http://host:port/path/{参数值}数据。@RequestParam主要用于接收http://host:port/path?参数名=参数值数据,这里后面也可以不跟参数值。

@RequestParam和@PathVariable这两者之间区别不大,主要是请求的URL不一样

用@RequestParam请求接口时,URL是:http://www.test.com/user/getUserById?userId=1

用@PathVariable请求接口时,URL是:http://www.test.com/user/getUserById/2

//@PathVariable用法
@RequestMapping(value = "/test/{id}",method = RequestMethod.DELETE)
public Result test(@PathVariable("id")String id) 

//@RequestParam用法,注意这里请求后面没有添加参数
//注意@RequestParam用法当中的参数。
@RequestMapping(value = "/test",method = RequestMethod.POST)
public Result test(@RequestParam(value="id",required=false,defaultValue="0")String id) 

在这里插入图片描述

@PathVariable主要应用场景:不少应用为了实现RestFul的风格,采用@PathVariable这种方式。
@RequestParam应用场景:这种方式应用也非常广,像CSDN或者是博客园都在用它

5、@RequestHeader:请求头参数

@RequestHeader 是获取请求头中的数据,通过指定参数 value 的值来获取请求头中指定的参数值。其他参数用法和 @RequestParam 完全一样

在这里插入图片描述
代码演示:

 @Controller
    public class handleHeader {

        @GetMapping("/getHeader")
        public String getRequestHeader(@RequestHeader(value = "User-Agent",required = false,defaultValue = "自己设置的默认值") String userAgent) {
            System.out.println(userAgent);
            return "hello";
        }
    }

6、@CookieValue获取cookie值:

@CookieValue的作用
  用来获取Cookie中的值

@CookieValue参数
1、value:参数名称

2、required:是否必须

3、defaultValue:设置默认值
在这里插入图片描述
代码演示:

@RequestMapping("/testCookie")
    public String handleCookieValue(@CookieValue(value="JSESSIONID",required = false,defaultValue = "自己设置的默认值") String cookie)
    {
        System.out.println("Cookie中 JSESSIONID的值:"+cookie);
        return "hello";
    }

7、@ResponseBody

作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

其他常用注解请参考:

https://baijiahao.baidu.com/s?
id=1666584458662693343&wfr=spider&for=pc

https://www.cnblogs.com/junjun1578/p/10790614.html

RestFul风格:

介绍:
RESTful 也称之为REST,可以将它理解为一种软件架构风格或者设计风格,而不是一个标准。

简单来说,RESTful 风格就是把请求参数变成请求路径的一种风格

在使用 RESTful 风格之前,我们通常是这样的:

/queryItems?id=1

但是使用了 RESTful 风格之后就会变成:

/items/1

从上面两个请求可以看出,RESTful 风格中的url将请求参数id=1变成了路径的一部分,并且url中的
queryItems也变成了items(RESTful 风格中的url不存在动词形式的路径,如items是名词,表示订单)

RESTful API 具体设计如下:

在这里插入图片描述
总结
我们仍然使用 @RequestMapping 注解,但不同的是,我们指定 method 属性来处理不同的 HTTP 方法,并且通过 @PathVariable 注解来将 HTTP 请求中的属性绑定到我们指定的形参上。

事实上,Spring 4.3 之后,为了更好的支持 RESTful 风格,增加了几个注解:@PutMapping、@GetMapping、@DeleteMapping、@PostMapping,从名字也能大概的看出,其实也就是将 method 属性的值与 @RequestMapping 进行了绑定而已,例如,我们对UserController中的deleteUser方法进行改造:

举例说明RESTful 风格:

在这里插入图片描述

在这里插入图片描述

代码演示:

准备工作:
浏览器form表单只支持Get和POST请求,而Delete、Put等method并不支持。Spring3.0添加了过滤器HiddenHttpMethodFilter,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT和DELETE请求

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38568503/article/details/114955302
今日推荐