当前位置: 首页 > 编程笔记 >

Spring MVC温故而知新系列教程之请求映射RequestMapping注解

宋经赋
2023-03-14
本文向大家介绍Spring MVC温故而知新系列教程之请求映射RequestMapping注解,包括了Spring MVC温故而知新系列教程之请求映射RequestMapping注解的使用技巧和注意事项,需要的朋友参考一下

RequestMapping注解说明

@RequestMapping注解的作用将Web请求映射到特定处理程序类和/或处理程序方法,这个注解可以用于类或者方法上,并通过属性value指定请求路径。用在Controller类上表示提供初步的URL请求映射信息,相对于Web应用的根目录,这是一个前置请求路径。用在Controller中方法上,表示提供详细的URL映射。如果Controller类上没有加RequestMapping注解,则方法上注解标记的URL则是相对于Web应用的根目录。

@RequestMapping注解提供以下几个属性:

         name:用于指定映射器名称

         value:用于指定映射路径,同path

         path:用于指定映射路径,同value

         method:用于指定请求类型:GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE

         params:指定请求的参数

         headers:指定请求头部,源码示例:RequestMapping(value = "/something", headers = "content-type=text/*")

         consumes:指定处理请求提交的内容类型(Content-Type),例如application/json, text/html,只有在Content-Type匹配这些媒体类型之一时才会映射请求

         produces:指定请求返回的内容类型 例如:produces = "application/json; charset=UTF-8"

通过value属性指定映射路径

Controller类上使用RequestMapping注解

@Controller
@RequestMapping("order") 
public class OrderInfoController {  
  //示例1
  @RequestMapping("orderinfo")  
  public ModelAndView OrderInfo1() {
    return new ModelAndView("order/info", "message", "OrderInfo");
  }
}

在OrderController类上添加了注解RequestMapping("order"),表示所有对的请求必须是以“根目录/order” 开始

示例1的请求路径为:http://localhost:8080/springMvcNext/order/orderinfo

示例1 如果注释掉Controller上的@RequestMapping("order"),则对应的请求路径为:http://localhost:8080/springMvcNext /orderinfo

Controller方法上使用RequestMapping注解

 1.常用基础用法

@Controller
@RequestMapping("order") 
public class OrderInfoController {
  //示例1
  @RequestMapping("orderinfo")  
  public ModelAndView OrderInfo1() {
    return new ModelAndView("order/info", "message", "OrderInfo");
  }
  //示例2 :处理多个url映射
  @RequestMapping({"info","index"}) //或者@RequestMapping(value={"info","index"})
  public ModelAndView OrderInfo2() {
    return new ModelAndView("order/info","message", "OrderInfo2");
  }               
  //示例3
  @RequestMapping
  public ModelAndView OrderInfo3() {  
    return new ModelAndView("order/info","message", "OrderInfo3");
  }
}

RequestMapping只配置value属性,不显示配置其他属性的情况下,value省略,直接填写URL映射信息即可,指定其他属性的情况下value属性必须明确填写

上例示例1的访问路径为: http://localhost:8080/springMvcNext/order/orderinfo

示例2:RequestMapping接口中value属性是一个数组,所有也支持传一个数组 示例2的访问路径:http://localhost:8080/springMvcNext/order/index  或者 http://localhost:8080/springMvcNext/order/info

示例3:当value为空时,表示该方法为类下默认的Action,示例3的访问路径为:http://localhost:8080/springMvcNext/order

 2.URL模板映射

在RequestMapping注解中声明URI变量,并通过@PathVariable注解的方式访从实际请求URL中获取值,示例如下:

@Controller
public class OrderInfoController {
   // 示例10 带占位符的URL
   @RequestMapping(value = "user/{userId}/order/{orderNumber}", method = RequestMethod.GET)
   public ModelAndView OrderInfo4(@PathVariable int userId,@PathVariable String orderNumber) {
      return new ModelAndView("order/info", "message", "userid:"+userId+" orderNumber:"+orderNumber);
   }
}

示例10请求URL:  http://localhost:8080/springMvcNext/user/12/order/333 当通过此URL发起请求时,SpringMVC将通过@PathVariable可以提取URL模板中的{×××}中的×××变量, URL变量会自动转换为对应的类型,无法转换的则返回错误,比如尝试用以下url访问:http://localhost:8080/springMvcNext/user/xxx/order/333  其中参数Userid=xxx,则发生错误:

3.Ant风格的URL路径映射

 Ant风格通配符如下:

  • ?  匹配一个字符
  • *    匹配路径段中的零个或多个字符
  • **  匹配零个或多个路径段

 示例:

@Controller
public class OrderInfoController {
    // 示例11 带占位符的URL
    @RequestMapping(value = "order*", method = RequestMethod.GET)
    //@RequestMapping(value = "order?", method = RequestMethod.GET)
    //@RequestMapping(value = "order/**", method = RequestMethod.GET)
    public ModelAndView OrderInfo5(String orderNumber) {
       return new ModelAndView("order/info", "message", "OrderInfo5");
    }
}

示例11请求URL:  http://localhost:8080/springMvcNext/order/orderdexx?orderNumber=12 可以匹配http://localhost:8080/springMvcNext/order/orderXXXXX?orderNumber=yyyy的所有请求

 

@RequestMapping(value = "order?", method = RequestMethod.GET)可以匹配诸如 “…/ordera?orderNumber….” “…/orders?orderNumber….”

 @RequestMapping(value = "order/**", method = RequestMethod.GET)可以匹配诸如 “…/order/aaa?orderNumber….” “…/order/bbb/ccc?orderNumber….”

另外 RequestMapping还支持正则表达式风格的URL路径映射,此处略过

通过method属性指定请求类型

RequestMapping提供的method属性请求谓词的类型,如下示例示例只接受GET请求

  // 示例4
  @RequestMapping(value="detail",method=RequestMethod.GET) //也可直接使用 @GetMapping("detail")
  public ModelAndView Info() {
    return new ModelAndView("order/info", "message", "Info");
  }

对于每种请求类型,SpringMVC还提供了专用的注解:

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping

@PatchMapping

通过params指定参数名或参数值约束

params属性可以限定请求参数包含特定的参数,也可限定参数值的约束,如下代码所示:

 // 示例5 params 限定参数包含orderNumber
  @RequestMapping(value = "detail2", params = "orderNumber")
  public ModelAndView Detail2(String orderNumber) {
    return new ModelAndView("order/info", "message", orderNumber);
  }
  // 示例6 params 限定参数值
  @RequestMapping(value = "detail3", params = "orderNumber!=1222")
  public ModelAndView Detail3(String orderNumber) {
    return new ModelAndView("order/info", "message", orderNumber);
  }

示例5限定请求参数必须包含参数orderNumber,如果不包含名为orderNumber的参数,则拒绝访问:访问路径:http://localhost:8080/springMvcNext/order/detail2?orderNumber=12

示例6限定请求参数必须包含参数orderNumber并且参数值不能为1222 访问路径:http://localhost:8080/springMvcNext/order/detail3?orderNumber=1222 时报错

通过headers指定参数名或参数值约束

 RequestMapping提供的method属性可以指定请求头类型,只有请求数据头部类型符合指定的值时,才能正常访问

// 示例7 params 限定参数值
    @RequestMapping(value = "headtest",headers = "apikey=23131313") 
    //@RequestMapping(value = "headtest",headers= {"Accept=application/json"}) 
    public ModelAndView Header() {
      return new ModelAndView("order/info", "message", "Header");
    }

示例7限定请求头必须包含apikey:23131313才可以正常返回,直接访问,返回错误:

添加添加header信息apikey:23131313访问成功:

通过consumes指定请求提交的内容类型(Content-Type)

  // 示例8 consumes 
  @RequestMapping(value = "consumes", method = RequestMethod.POST, consumes = "application/json")
  public ModelAndView Consumes(String orderNumber) {
    return new ModelAndView("order/info", "message", orderNumber);
  }

示例限定请求参数类型为application/json,表示该方法只处理请求Content-Type为application/json的请求:

下面通过抛postman测试:

设置请求参数格式为application/json,可以正常访问:

设置参数格式为x-form-urlencoded,返回错误,Http Status 415

通过produces指定返回的内容类型(Content-Type)

 produces属性用于设定返回内容类型,并且满足以下条件:接受请求header中包含Accept的值与produces设定的值相同,或者接受的请求使用不显示设置accept值

 // 示例8 produces 限定返回数据application/json
    @RequestMapping(value = "produces", method = RequestMethod.GET, produces = "application/json")
    public ModelAndView Produces(String orderNumber) {
      return new ModelAndView("order/info", "message", orderNumber);
    }

示例8 表示返回内容格式application/json ,当客户端设置的accept格式为text/json时,运行报错,Http status 406

当客户端设置的accept格式为application/json或者不设置accept值时,可以正常运行

总结

以上所述是小编给大家介绍的Spring MVC温故而知新系列教程之请求映射RequestMapping注解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 你可以使用@RequestMapping注解来将请求URL,如/appointments等,映射到整个类上或某个特定的处理器方法上。一般来说,类级别的注解负责将一个特定(或符合某种模式)的请求路径映射到一个控制器上,同时通过方法级别的注解来细化映射,即根据特定的HTTP请求方法(“GET”“POST”方法等)、HTTP请求中是否携带特定参数等条件,将请求映射到匹配的方法上。 下面这段代码示例来自P

  • 本文向大家介绍JS温故而知新之变量提升和时间死区,包括了JS温故而知新之变量提升和时间死区的使用技巧和注意事项,需要的朋友参考一下 前言 开始执行脚本时,执行脚本的第一步是编译代码,然后再开始执行代码,如图 另外,在编译优化方面来说,最开始时也并不是全部编译好脚本,而是当函数执行时,才会先编译,再执行脚本,如图 编译阶段:经历了词法分析,语法分析生成AST,以及代码生成。并且在此阶段,它只会扫描并

  • 我正在创建一个类来审核对Spring Boot应用程序控制器类的调用: 我的一个Controller类看起来像这样——在类AND方法级别有注释(此时我不能更改): 我可以很好地提取url、methodtype和参数。然而,我现在很难做的是拉控制器类的注释('/applications'),这样我就可以为我的审计表构建完整的URL。 我知道还有其他审计选项(比如Spring Boot Actuato

  • http://some-amazon-link:8080/the-war-name/login 现在我正在纠结如何在Spring MVC项目中添加“/the-war-name/”以及在哪里添加“/the-war-name/”。 它在 null

  • 我在我的SpringMVC项目中得到了这个错误。我必须在浏览器中手动添加完整的路径来运行代码,但我不能直接运行它。 web.xml:

  • Web 容器需要本章描述的映射技术去映射客户端请求到 Servlet(该规范2.5以前的版本,使用这些映射技术是作为一个建议而不是要求,允许servlet 容器各有其不同的策略用于映射客户端请求到 servlet)。