Spring MVC @RequestMapping Annotation Example with Controller, Methods, Headers, Params, @RequestPar

简介: Spring MVC @RequestMapping Annotation Example with Controller, Methods, Headers, Params, @RequestParam, @PathVariablePankaj July 4, 2014 Spring...


Spring MVC @RequestMapping Annotation Example with Controller, Methods, Headers, Params, @RequestParam, @PathVariable

   

@RequestMapping is one of the most widely used Spring MVC annotation.org.springframework.web.bind.annotation.RequestMapping annotation is used to map web requests onto specific handler classes and/or handler methods.

@RequestMapping can be applied to the controller class as well as methods. Today we will look into various usage of this annotation with example.

  1. @RequestMapping with Class: We can use it with class definition to create the base URI. For example:
    1
    2
    3
    4
    5
    @Controller
    @RequestMapping ( "/home" )
    public class HomeController {
     
    }

    Now /home is the URI for which this controller will be used. This concept is very similar to servlet context of a web application.

  2. @RequestMapping with Method: We can use it with method to provide the URI pattern for which handler method will be used. For example:
    1
    2
    3
    4
    5
    @RequestMapping (value= "/method0" )
    @ResponseBody
    public String method0(){
         return "method0" ;
    }

    Above annotation can also be written as @RequestMapping("/method0"). On a side note, I am using @ResponseBody to send the String response for this web request, this is done to keep the example simple. Like I always do, I will use these methods in Spring MVC application and test them with a simple program or script.

  3. @RequestMapping with Multiple URI: We can use a single method for handling multiple URIs, for example:
    1
    2
    3
    4
    5
    @RequestMapping (value={ "/method1" , "/method1/second" })
    @ResponseBody
    public String method1(){
         return "method1" ;
    }

    If you will look at the source code of RequestMapping annotation, you will see that all of it’s variables are arrays. We can create String array for the URI mappings for the handler method.

  4. @RequestMapping with HTTP Method: Sometimes we want to perform different operations based on the HTTP method used, even though request URI remains same. We can use @RequestMapping method variable to narrow down the HTTP methods for which this method will be invoked. For example:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RequestMapping (value= "/method2" , method=RequestMethod.POST)
    @ResponseBody
    public String method2(){
         return "method2" ;
    }
     
    @RequestMapping (value= "/method3" , method={RequestMethod.POST,RequestMethod.GET})
    @ResponseBody
    public String method3(){
         return "method3" ;
    }
  5. @RequestMapping with Headers: We can specify the headers that should be present to invoke the handler method. For example:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RequestMapping (value= "/method4" , headers= "name=pankaj" )
    @ResponseBody
    public String method4(){
         return "method4" ;
    }
     
    @RequestMapping (value= "/method5" , headers={ "name=pankaj" , "id=1" })
    @ResponseBody
    public String method5(){
         return "method5" ;
    }
  6. @RequestMapping with Produces and Consumes: We can use header Content-Type and Accept to find out request contents and what is the mime message it wants in response. For clarity, @RequestMapping provides produces and consumes variables where we can specify the request content-type for which method will be invoked and the response content type. For example:
    1
    2
    3
    4
    5
    @RequestMapping (value= "/method6" , produces={ "application/json" , "application/xml" }, consumes= "text/html" )
    @ResponseBody
    public String method6(){
         return "method6" ;
    }

    Above method can consume message only with Content-Type as text/html and is able to produce messages of type application/json and application/xml.

  7. @RequestMapping with @PathVariable: RequestMapping annotation can be used to handle dynamic URIs where one or more of the URI value works as a parameter. We can even specify Regular Expression for URI dynamic parameter to accept only specific type of input. It works with@PathVariable annotation through which we can map the URI variable to one of the method arguments. For example:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RequestMapping (value= "/method7/{id}" )
    @ResponseBody
    public String method7( @PathVariable ( "id" ) int id){
         return "method7 with id=" +id;
    }
     
    @RequestMapping (value= "/method8/{id:[\\d]+}/{name}" )
    @ResponseBody
    public String method8( @PathVariable ( "id" ) long id, @PathVariable ( "name" ) String name){
         return "method8 with id= " +id+ " and name=" +name;
    }
  8. @RequestMapping with @RequestParam for URL parameters: Sometimes we get parameters in the request URL, mostly in GET requests. We can use @RequestMapping with @RequestParam annotationto retrieve the URL parameter and map it to the method argument. For example:
    1
    2
    3
    4
    5
    @RequestMapping (value= "/method9" )
    @ResponseBody
    public String method9( @RequestParam ( "id" ) int id){
         return "method9 with id= " +id;
    }

    For this method to work, the parameter name should be “id” and it should be of type int.

  9. @RequestMapping default method: If value is empty for a method, it works as default method for the controller class. For example:
    1
    2
    3
    4
    5
    @RequestMapping ()
    @ResponseBody
    public String defaultMethod(){
         return "default method" ;
    }

    As you have seen above that we have mapped /home to HomeController, this method will be used for the default URI requests.

  10. @RequestMapping fallback method: We can create a fallback method for the controller class to make sure we are catching all the client requests even though there are no matching handler methods. It is useful in sending custom 404 response pages to users when there are no handler methods for the request.
    1
    2
    3
    4
    5
    @RequestMapping ( "*" )
    @ResponseBody
    public String fallbackMethod(){
         return "fallback method" ;
    }

Test Program

We can use Spring RestTemplate to test the different methods above, but today I will use cURL commands to test these methods because these are simple and there are not much data flowing around.

I have created a simple shell script to invoke all the above methods and print their output. It looks like below.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/bin/bash
 
echo "curl http://localhost:9090/SpringRequestMappingExample/home/method0" ;
curl http: //localhost :9090 /SpringRequestMappingExample/home/method0 ;
printf "\n\n*****\n\n" ;
 
echo "curl http://localhost:9090/SpringRequestMappingExample/home" ;
curl http: //localhost :9090 /SpringRequestMappingExample/home ;
printf "\n\n*****\n\n" ;
 
echo "curl http://localhost:9090/SpringRequestMappingExample/home/xyz" ;
curl http: //localhost :9090 /SpringRequestMappingExample/home/xyz ;
printf "\n\n*****\n\n" ;
 
echo "curl http://localhost:9090/SpringRequestMappingExample/home/method1" ;
curl http: //localhost :9090 /SpringRequestMappingExample/home/method1 ;
printf "\n\n*****\n\n" ;
 
echo "curl http://localhost:9090/SpringRequestMappingExample/home/method1/second" ;
curl http: //localhost :9090 /SpringRequestMappingExample/home/method1/second ;
printf "\n\n*****\n\n" ;
 
echo "curl -X POST http://localhost:9090/SpringRequestMappingExample/home/method2" ;
curl -X POST http: //localhost :9090 /SpringRequestMappingExample/home/method2 ;
printf "\n\n*****\n\n" ;
 
echo "curl -X POST http://localhost:9090/SpringRequestMappingExample/home/method3" ;
curl -X POST http: //localhost :9090 /SpringRequestMappingExample/home/method3 ;
printf "\n\n*****\n\n" ;
 
echo "curl -X GET http://localhost:9090/SpringRequestMappingExample/home/method3" ;
curl -X GET http: //localhost :9090 /SpringRequestMappingExample/home/method3 ;
printf "\n\n*****\n\n" ;
 
echo "curl -H " name:pankaj " http://localhost:9090/SpringRequestMappingExample/home/method4" ;
curl -H "name:pankaj" http: //localhost :9090 /SpringRequestMappingExample/home/method4 ;
printf "\n\n*****\n\n" ;
 
echo "curl -H " name:pankaj " -H " id :1 " http://localhost:9090/SpringRequestMappingExample/home/method5" ;
curl -H "name:pankaj" -H "id:1" http: //localhost :9090 /SpringRequestMappingExample/home/method5 ;
printf "\n\n*****\n\n" ;
 
echo "curl -H " Content-Type:text /html " http://localhost:9090/SpringRequestMappingExample/home/method6" ;
curl -H "Content-Type:text/html" http: //localhost :9090 /SpringRequestMappingExample/home/method6 ;
printf "\n\n*****\n\n" ;
 
echo "curl http://localhost:9090/SpringRequestMappingExample/home/method6" ;
curl http: //localhost :9090 /SpringRequestMappingExample/home/method6 ;
printf "\n\n*****\n\n" ;
 
echo "curl -H " Content-Type:text /html " -H " Accept:application /json " -i http://localhost:9090/SpringRequestMappingExample/home/method6" ;
curl -H "Content-Type:text/html" -H "Accept:application/json" -i http: //localhost :9090 /SpringRequestMappingExample/home/method6 ;
printf "\n\n*****\n\n" ;
 
echo "curl -H " Content-Type:text /html " -H " Accept:application /xml " -i http://localhost:9090/SpringRequestMappingExample/home/method6" ;
curl -H "Content-Type:text/html" -H "Accept:application/xml" -i http: //localhost :9090 /SpringRequestMappingExample/home/method6 ;
printf "\n\n*****\n\n" ;
 
echo "curl http://localhost:9090/SpringRequestMappingExample/home/method7/1" ;
curl http: //localhost :9090 /SpringRequestMappingExample/home/method7/1 ;
printf "\n\n*****\n\n" ;
 
echo "curl http://localhost:9090/SpringRequestMappingExample/home/method8/10/Lisa" ;
curl http: //localhost :9090 /SpringRequestMappingExample/home/method8/10/Lisa ;
printf "\n\n*****\n\n" ;
 
echo "curl http://localhost:9090/SpringRequestMappingExample/home/method9?id=20" ;
curl http: //localhost :9090 /SpringRequestMappingExample/home/method9 ? id =20;
printf "\n\n*****DONE*****\n\n" ;

Note that I have deployed my web application on Tomcat-7 and it’s running on port 9090.SpringRequestMappingExample is the servlet context of the application. Now when I execute this script through command line, I get following output.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
pankaj:~ pankaj$ . /springTest .sh
curl http: //localhost :9090 /SpringRequestMappingExample/home/method0
method0
 
*****
 
curl http: //localhost :9090 /SpringRequestMappingExample/home
default method
 
*****
 
curl http: //localhost :9090 /SpringRequestMappingExample/home/xyz
fallback method
 
*****
 
curl http: //localhost :9090 /SpringRequestMappingExample/home/method1
method1
 
*****
 
curl http: //localhost :9090 /SpringRequestMappingExample/home/method1/second
method1
 
*****
 
curl -X POST http: //localhost :9090 /SpringRequestMappingExample/home/method2
method2
 
*****
 
curl -X POST http: //localhost :9090 /SpringRequestMappingExample/home/method3
method3
 
*****
 
curl -X GET http: //localhost :9090 /SpringRequestMappingExample/home/method3
method3
 
*****
 
curl -H name:pankaj http: //localhost :9090 /SpringRequestMappingExample/home/method4
method4
 
*****
 
curl -H name:pankaj -H id :1 http: //localhost :9090 /SpringRequestMappingExample/home/method5
method5
 
*****
 
curl -H Content-Type:text /html http: //localhost :9090 /SpringRequestMappingExample/home/method6
method6
 
*****
 
curl http: //localhost :9090 /SpringRequestMappingExample/home/method6
fallback method
 
*****
 
curl -H Content-Type:text /html -H Accept:application /json -i http: //localhost :9090 /SpringRequestMappingExample/home/method6
HTTP /1 .1 200 OK
Server: Apache-Coyote /1 .1
Content-Type: application /json
Content-Length: 7
Date: Thu, 03 Jul 2014 18:14:10 GMT
 
method6
 
*****
 
curl -H Content-Type:text /html -H Accept:application /xml -i http: //localhost :9090 /SpringRequestMappingExample/home/method6
HTTP /1 .1 200 OK
Server: Apache-Coyote /1 .1
Content-Type: application /xml
Content-Length: 7
Date: Thu, 03 Jul 2014 18:14:10 GMT
 
method6
 
*****
 
curl http: //localhost :9090 /SpringRequestMappingExample/home/method7/1
method7 with id =1
 
*****
 
curl http: //localhost :9090 /SpringRequestMappingExample/home/method8/10/Lisa
method8 with id = 10 and name=Lisa
 
*****
 
curl http: //localhost :9090 /SpringRequestMappingExample/home/method9 ? id =20
method9 with id = 20
 
*****DONE*****
 
pankaj:~ pankaj$

Most of these are self understood, although you might want to check default and fallback methods. That’s all for Spring RequestMapping Example, I hope it will help you in understanding this annotation and it’s various features. You should download the sample project from below link and try different scenarios to explore it further.







目录
相关文章
|
前端开发 Java 数据安全/隐私保护
深入理解 Spring MVC Controller —— 请求参数获取
前言 接上篇《深入理解 Spring MVC Controller —— 请求映射》,上篇主要介绍了处理器方法及请求映射的定义。有了处理器方法 Spring MVC 就可以对请求进行处理,有了请求映射 Spring MVC 就能知道哪些请求应该由哪些处理器方法来处理。
666 0
深入理解 Spring MVC Controller —— 请求参数获取
|
2月前
|
安全 Java Spring
Spring 的 Controller 是单例还是多例?怎么保证并发的安全
Spring 的 Controller 是单例还是多例?怎么保证并发的安全
19 0
|
2月前
|
安全 Java Spring
Spring 的 Controller 是单例还是多例?怎么保证并发的安全
Spring 的 Controller 是单例还是多例?怎么保证并发的安全
13 0
|
9月前
|
JSON 前端开发 Java
Spring 注解之@RestController与@Controller的区别
Spring 注解之@RestController与@Controller的区别
71 0
|
7月前
|
XML JSON Java
Spring Boot 学习研究笔记(十五) @RequestMapping 注解及参数接收、校验详解(1)
Spring Boot 学习研究笔记(十五) @RequestMapping 注解及参数接收、校验详解
143 0
|
8月前
|
前端开发 Java Spring
Spring Boot 中的 @Controller 注解:原理、用法与示例
Spring Boot 中的 @Controller 注解:原理、用法与示例
|
9月前
|
JSON 前端开发 Java
Spring Boot之Controller控制器:实现Web请求处理与业务逻辑分离
本篇详细介绍了Spring Boot中的Controller控制器的作用、用法和最佳实践。Controller是负责处理Web请求和响应的核心组件,能够将前端的HTTP请求映射到相应的业务逻辑处理,并返回适当的响应。通过一个简单的示例,展示了如何创建和配置Controller,并使用不同类型的注解来映射请求。还介绍了如何处理请求参数、路径变量,并展示了Controller方法返回不同类型的数据和视图的方式。通过学习本文内容,读者可以更好地理解和使用Spring Boot中的Controller,从而构建出灵活、高效的Web应用,提供优质的用户体验。
484 1
|
9月前
|
Java Spring
Spring 如何通过反射获取controller 包下所有的类,以及类上的注解
Spring 如何通过反射获取controller 包下所有的类,以及类上的注解
259 0
|
9月前
|
设计模式 JSON 前端开发
2021-08-11Spring MVC,入门项目搭建及流程,springMVC的适配器和映射器,基于注解的controller,映射请求,方法返回值,requestmapping注解
2021-08-11Spring MVC,入门项目搭建及流程,springMVC的适配器和映射器,基于注解的controller,映射请求,方法返回值,requestmapping注解
41 0
|
11月前
|
前端开发 Java Spring
《Spring MVC》 第三章 @Controller、@RequestMapping 注解和获取请求参数
《Spring MVC》 第三章 @Controller、@RequestMapping 注解和获取请求参数
137 0