209、SpringMVC学习笔记(三)【RequestMapping注解】2019.09.12

17 篇文章 0 订阅

1、RequestMapping注解使用的介绍

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。

  • 用于类上:表示类中的所有响应请求的方法都是以该地址作为父路径。
  • 用于方法上:父路径 + 该路径为请求的实际路径

2、RequestMapping注解的六个属性

2.1 RequestMapping接口的源码

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {

    // 指定映射的名称
    String name() default "";
    
    // 指定请求路径的地址
    @AliasFor("path")
    String[] value() default {};
    
    // 指定请求路径的地址
    @AliasFor("value")
    String[] path() default {};
    
    // 指定请求的方式,是一个RequsetMethod数组,可以配置多个方法
    RequestMethod[] method() default {};
    
    // 指定参数的类型
    String[] params() default {};
    String[] headers() default {};
    
    // 指定数据请求的格式
    String[] consumes() default {};
    
    // 指定返回的内容类型
    String[] produces() default {};
}

2.2 Value属性

指定请求的实际地址,指定的地址可以是URI Template 模式。

@RequestMapping("/hello1")
@RequestMapping(value="/hello2")
@RequestMapping(value={"/hello3","/hello4"})

value值可以分为类

  • 值为普通的具体字符串
@RequestMapping(value="/hello")
  • 含有变量的一类值
@RequestMapping(value="/hello/{userId}")
public String sayHello1(@PathVariable String userId) {
  System.out.println(userId);
  return "index"; 
}
  • 正则表达式类型的值
@RequestMapping(value="/{textualPart:[a-z-]+}.{numericPart:[\\d]+}")  
public void sayHello2(@PathVariable String textualPart, @PathVariable String numericPart) {    
        System.out.println("Textual part: " + textualPart +   
      ", numeric part: " + numericPart);  
  }
}

比如访问:http://localhost:8080/projectName/hello.888
则输出:Textual part: hello, numeric part: 888.

  • 定义位置
    若将该属性定义在类上面,则表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestMapping("/clazz")
@Controller
public class HelloController{

    @RequestMapping("hello")
    public String hello(){
        return "hello";
    }
}

如上,访问地址为http://localhost:8080/projectName/clazz/hello

2.3 Method属性

指定请求的method类型, GET、POST、PUT、DELETE等,如果此属性定义了多个值,那么可以适应多种请求方式。

@RequestMapping(value="/hello" , method={RequestMethod.POST, RequestMethod.GET})
public String sayHello1(@PathVariable String userId) {
  System.out.println(userId);
  return "index"; 
}

如果声明了方法的访问方式,那么就只支持所声明的方式访问,否则将出现405请求异常(HTTP状态码405,指客户端请求中的方法被禁止)

2.4 MediaType

MediaType,也叫Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。

例如: Content-Type: text/html;charset:utf-8;

Headers里常见Content-Type一般有以下4种:

  • application/x-www-form-urlencoded
    • 数据被编码为名称/值对。这是标准的编码格式。
    • form表单默认提交的content-type。
    • 当请求为get时,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串追加到url后面,用?分割,加载这个新的url,此时请求头中的content-type这一属性以具体浏览器为准。
    • get请求无需人工设置content-type。
    • 当请求为post时,浏览器采用x-www-form-urlencoded提交数据,form数据将以key:value键值对的方式传给server。
  • multipart/form-data
    • 用于文件上传,此时form的enctype属性必须指定为multipart/form-data。
  • application/json
    • 将数据以json对象的格式传递。
    • 随着json规范的流行,以及前后端分离趋势所致,该编码方式被越来越多人接受。
  • text/plain:数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。

2.5 Consumes属性

指定处理请求的提交内容类型(Content-Type),例如application/json, text/html,只有命中了才会接受该请求。

//方法仅处理request Content-Type为“application/json”类型的请求。
@RequestMapping(value = "/hello", method = RequestMethod.POST, consumes="application/json")
public void addPet() {    
    // implementation omitted
}

HTTP请求415状态,Unsupported Media Type(HTTP状态码415,指服务器无法处理请求附带的媒体格式。)

2.6 Produces属性

指定返回的内容类型,如果返回的是JSON数据一般使用application/json;charset=UTF-8。

//指定了返回的内容类型为application/json;
@RequestMapping(value = "/produces", method = RequestMethod.GET, produces="application/json;charset=utf-8")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {    
    // implementation omitted
}

2.7 Params属性

指定request中必须包含某些参数值,才让该方法处理。否则会报HTTP Status [400 - Bad Request]的错误。

//仅处理请求中包含了名为“myParam”,值为“myValue”的请求;
@RequestMapping(value = "/params", method = RequestMethod.GET, params="myParam=myValue")
public void findPet() {    
    // implementation omitted
}

2.8 Headers属性

指定request中必须包含某些指定的header值,才能让该方法处理请求。否则会报错误。

@RequestMapping(value = "/headers", method = RequestMethod.GET, headers={"content-type=text/plain","content-type=text/html"})
public void findPet() {    
    // implementation omitted
}

仅处理request的header中包含了指定“content-type”请求头和对应值为“text/plain”的请求;

2.9 其他处理

(1)默认的处理方法

在控制器类中,你可以有一个默认的处理方法,它可以在有一个向默认 URI 发起的请求时被执行。 下面是默认处理方法的示例:

@RestController  
@RequestMapping("/home")  
public class IndexController {  
    @RequestMapping()  
    String default () {  
        return "This is a default method for the class";  
    }

在这段代码中,向 /home 发起的一个请求将会由 default() 来处理,因为注解并没有指定任何值。

(2)变体注解

Spring 4.3 引入了方法级注解的变体,也被叫做 @RequestMapping 的组合注解。组合注解可以更好的表达被注解方法的语义。它们所扮演的角色就是针对 @RequestMapping 的封装,而且成了定义端点的标准方法。 方法级别的注解变体有如下几个:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
例如,@GetMapping 是一个组合注解,它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。

@Controller  
@RequestMapping("/home")  
public class IndexController {  
    @GetMapping("/person/{id}")  
    public String getPersonById(@PathVariable String id) {  
        return "page"; 
    }
    @PostMapping("/person/post")  
    public String postPerson() {  
        return "page"; 
    }
    @PutMapping("/person/put")  
    public String putPerson() {  
        return "page"; 
    }  
    @DeleteMapping("/person/delete")  
    public String deletePerson() {  
        return "page";
    }  
    @PatchMapping("/person/patch")  
    public String patchPerson() {  
        return "page";
    }

在工作中, @RequestMapping 的组合变体注解更加常用,因为组合注解减少了在应用程序上要配置的元数据,并且代码也更易读。

2.10 REST风格URL

(1)概述
REST是一个架构风格,用url来访问网络上的任何资源。REST的一种思想就是用不同的 HTTP 请求(GET,POST,PUT,DELETE)描述对资源的操作,通过 HTTP 的状态码来判断此次对资源操作的结果,这就是 Restful风格。或通俗理解为用http中的请求动作get,post,put,delete,来进行增删改查。

REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。

Fielding是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。所以,他的这篇论文一经发表,就引起了关注,并且立即对互联网开发产生了深远的影响。

  • Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写。
  • 中文翻译过来是:表现层状态转化
  • 状态转化:客户端通过 http 协议访问服务端资源,通过 http 协议里面定义好的四个动词:GET、POST、PUT、DELETE 来将资源进行状态转化。
  • 如果一个架构符合REST原则,就称它为RESTful架构。

(2)风格设计
RESTful 的核心思想就是,客户端发出的数据操作指令都是"动词 + 宾语"的结构。比如,GET /users这个命令,GET是动词,/users是宾语。
动词
通常就是五种 HTTP 方法,对应 CRUD 操作。

  • GET:读取(Read)
  • POST:新建(Create)
  • PUT:更新(Update)
  • PATCH:更新(Update),通常是部分更新
  • DELETE:删除(Delete)

根据 HTTP 规范,动词一律大写。

那到底什么样url才算是rest风格呢?
传统风格:

| 操作 | 请求 | 访问URL1 | 访问URL2 | | -------- | ---- | ---------------------- | ------------------------ | | 获取列表 | GET | ip/ssm/getUsers | ip/ssm/getOrders | | 获取单条 | GET | ip/ssm/getUser?id=1001 | ip/ssm/getOrder?id=20100 | | 新增数据 | POST | ip/ssm/addUser | ip/ssm/addOrder | | 修改数据 | POST | ip/ssm/updateUser | ip/ssm/updateOrder | | 删除数据 | POST | ip/ssm/deleteUser | ip/ssm/deleteOrder |

REST风格:
| 操作 | 请求 | 访问URL1 | 访问URL2 | | -------- | --------- | ---------------- | ------------------ | | 获取列表 | GET | ip/ssm/users | ip/ssm/orders | | 获取单条 | GET | ip/ssm/user/1002 | ip/ssm/order/20100 | | 新增数据 | POST | ip/ssm/user | ip/ssm/order | | 修改数据 | PUT/PATCH | ip/ssm/user | ip/ssm/order | | 删除数据 | DELETE | ip/ssm/user/1002 | ip/ssm/order/20100 |

后台先开发程序,查询功能(GET,ip/ssm/user/1002),是不是要告诉前端?

(3)REST API
API(Application Programming Interface)应用程序接口,但该接口并非Java中的interface,而是指一个请求路径,比如

http://www.baidu.com/user/1
http://www.baidu.com/order/1
http://www.baidu.com/getUser?id=1

API在开发中是前端和后端进行数据传输的一个路径,通过该路径,可以实现前端和后台的分离,如下:

//豆瓣的请求路径
https://api.douban.com/v2/book/2129650

所以REST API是指符合REST风格的请求路径
(4)REST是什么?
REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用。

3、参考文档

【01】RequestMapping
【02】简书-SpringMVC各个注解的使用
【03】博客园-springmvc常用注解标签详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值