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 [email protected] 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.

springTest.sh

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.

时间: 2024-10-11 03:26:10

Spring MVC @RequestMapping Annotation Example with Controller, Methods, Headers, Params, @RequestParam, @PathVariable--转载的相关文章

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

Spring MVC @RequestMapping Annotation Example with Controller, Methods, Headers, Params, @RequestParam, @PathVariable Pankaj July 4, 2014 Spring @RequestMapping is one of the most widely used Spring MVC annotation.org.springframework.web.bind.annotat

[Spring MVC]学习笔记--@Controller

在讲解@Controller之前,先说明一下Spring MVC的官方文档在哪. 可能会有人和我一样,在刚接触Spring MVC时,发现在Spring的网站上找不到Spring MVC这个项目. 这是因为Spring MVC被放到Spring Framework里面了. 你可以打开Spring Framework的reference,里面有一部分是专门介绍Spring MVC的,“V. The Web”. Controller是MVC中的C. 在Spring-MVC中用@Controller来

Spring MVC — @RequestMapping原理讲解-1

转载地址 :http://blog.csdn.net/j080624/article/details/56278461 为了降低文章篇幅,使得文章更目标化,简洁化,我们就不例举各种@RequestMapping的用法等内容了. 具体请点击查看@RequestMapping的用法 文章主要说明以下问题: Spring怎样处理@RequestMapping(怎样将请求路径映射到控制器类或方法) Spring怎样将请求分派给正确的控制器类或方法 Spring如何实现灵活的控制器方法的 在Spring 

Spring MVC中基于注解的 Controller

终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响应请求.实际上,ControllerClassNameHandlerMapping, MultiActionController 和选择恰当的 methodNameResolver(如 InternalPathMethodNameResolver) 就已经可以在很大程度上帮助我们省去不少的 XML 配置,谁让

Spring MVC @RequestMapping注解详解

@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) params:定义请求的 URL 中必须包含的参数.或者不包含某些参数.(了解) headers:定义请求中 Request Headers 必须包含的参数.或者不包含某些参数.(了解) @RequestMapping 的用法 @RequestMapping 有两种标注方式,一种是标注在类级别上,一种是

spring mvc 模式下AOP切面controller层例子

@Aspect @Component public class MyAop { @Autowired private HttpServletRequest request; public MyAop() { } @AfterReturning(value="execution(* com.che.api.controller..*.*(..))",returning="returnValue") public void beforeOperationLog(Join

spring mvc requestmapping 配置多个

参考 package com.alibaba.iucheck.gdstoredis.web.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.sprin

spring mvc通过客户端传值,controller获取Sort对象

之前客户端需要根据需求按不同的排序方式查看数据,按照一种约定排序,比如1代表时间升序,2代表时间降序,3,4这种形式,然后后台根据这些值创建Sort对象. 后来发现完全多此一举,可以根据特定的方式,直接在controller层获得到Sort对象,例如客户端调用localhost:8080/user/blogs?sort=createdDate,desc,在controller层可以这样: public String list(@SortDefault Sort sort){} @SortDefa

Spring MVC @RequestMapping浅析

简介:@RequestMappingRequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.RequestMapping注解有六个属性,下面我们把她分成三类进行说明.1. value, method:value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明):method: 指定请求的method类型, GET.POST.PUT.DELETE等: 2. consumes,p