STACKJAVA

Spring MVC – Phần 3: Annotation(1) – Annotation @RequestMapping, RequestMapping trong Spring MVC

Spring MVC – Phần 3: Annotation(1) – Annotation @RequestMapping, RequestMapping trong Spring MVC

1. Annotation @RequestMapping

@RequestMapping  là một trong những annoation sử dụng nhiều nhất trong Spring MVC.

Annotation @RequestMapping được sử dụng để map request với class hoặc method xử lý request đó.

@RequestMapping có thể được áp dụng với controller class hoặc method trong controller class.

1.1 @RequestMapping với class:

@Controller
@RequestMapping("/index")
public class BaseController {

  public String index() {
    return "index";
  }

}

Class BaseController sẽ đóng vai trò như là 1 class Servlet xử lý URL “/index”

1.2 @RequestMapping với method:

@Controller
public class HomeController {

  @RequestMapping("/method0")
  public String method0() {
    return "page0";
  }

  @RequestMapping("/method1")
  public String method1() {
    return "page1";
  }
}

Class HomeController sẽ xử lý 2 URL là “/method1”, “/method2”.

1.3 @RequestMapping với nhiều URI:

@RequestMapping(value = { "/", "/home" })
public String home() {
  return "home";
}

Method home()Sẽ xử lý cả 2 URL “/” và “/home”

1.4 @RequestMapping với HTTP Method:

@RequestMapping(value="/test", method = RequestMethod.GET)
public String doGet() {
  return "test1";
}

@RequestMapping(value="/test", method = RequestMethod.POST)
public String doPost() {
  return "test2";
}

Cùng là 1 URL “/test” nhưng request tới có method là GET sẽ được xử lý bởi method doGet() còn request có method là POST sẽ được xử lý bởi method doPost().

Nếu không chỉ rõ HTTP method thì mặc định controller sẽ xử lý tất cả các HTTP method.

1.5 @RequestMapping với Header:

@RequestMapping(value = "/method0", headers = "name=kai")
public String method0() {
  return "page0";
}

@RequestMapping(value = "/method1", headers = { "name=kai", "id=1" })
public String method1() {
  return "page1";
}

Khi chỉ rõ headers trong @RequestMapping thì nó sẽ chỉ xử lý những request có header chứa các tham số đã chỉ rõ

Ví dụ như method0() sẽ chỉ xử lý request có header chứa cặp key-value là name-kai

1.6 @RequestMapping với Produces và Consumes:

@RequestMapping(value = "/method2", produces = { "application/json", "application/xml" }, consumes = "text/html")
public String method2() {
  return "page2";
}

consumes: chỉ chấp nhận các request có content-type giống với giá trị khai báo bên trong consumes

produces: kiểu dữ liệu trả về, cái này thường chỉ dùng với các REST-API.

2.Code Ví dụ

Thư viện sử dụng

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>stackjava.com</groupId>
  <artifactId>SpringAnnotation1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
  </dependencies>
</project>

Controller:

package stackjava.com.springmvchello.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/index")
public class BaseController {

  public String index() {
    return "index";
  }

}
package stackjava.com.springmvchello.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {

  @RequestMapping(value = { "/", "/home" })
  public String home() {
    return "home";
  }

  @RequestMapping(value = "/test", method = RequestMethod.GET)
  public String doGet() {
    return "test1";
  }

  @RequestMapping(value = "/test", method = RequestMethod.POST)
  public String doPost() {
    return "test2";
  }

  @RequestMapping(value = "/method0", headers = "name=kai")
  public String method0() {
    return "page0";
  }

  @RequestMapping(value = "/method1", headers = { "name=kai", "id=1" })
  public String method1() {
    return "page1";
  }

  @RequestMapping(value = "/method2", produces = { "application/json"}, consumes = "text/html")
  public String method2() {
    return "page2";
  }

}

Các file jsp:

<html>
<head>
<title>Spring MVC Annotation</title>
</head>

<body>
  <h2>home.jsp</h2>
  <a href="home">/home</a> <br/>
  <a href="test">/test (GET)</a> <br/>
  <form method="post" action="test">
    <button type="submit">/test (POST)</button>
  </form>
</body>
</html>
<html>
<head>
<title>Spring MVC Annotation</title>
</head>

<body>
  <h2>index.jsp</h2>
</body>
</html>
<html>
<head>
<title>Spring MVC Annotation</title>
</head>

<body>
  <h2>test1.jsp</h2>
</body>
</html>
<html>
<head>
<title>Spring MVC Annotation</title>
</head>

<body>
  <h2>test2.jsp</h2>
</body>
</html>
<html>
<head>
<title>Spring MVC Annotation</title>
</head>

<body>
  <h2>page0.jsp</h2>
</body>
</html>
<html>
<head>
<title>Spring MVC Annotation</title>
</head>

<body>
  <h2>page1.jsp</h2>
</body>
</html>
<html>
<head>
<title>Spring MVC Annotation</title>
</head>

<body>
  <h2>page2.jsp</h2>
</body>
</html>

Demo:

URL /test với method GET

URL /test với method POST

Các ví dụ với headers, consumes phải thêm giá trị vào header khi gửi nên mình sẽ dùng postman để demo:

Ví dụ với consumes=”text/html”

Ví dụ với headers=”name=kai”

 

Okay, Done!

Download code ví dụ trên tại đây

References:

https://www.journaldev.com/3358/spring-requestmapping-requestparam-pathvariable-example