Annotation @RequestMapping ngoài cho phép chúng ta định nghĩa request URL, nó còn cho phép chúng ta định nghĩa HTTP request method cho controller trong Spring MVC bằng cách sử dụng thuộc tính method của nó. Trong bài viết này, chúng ta sẽ cùng tìm hiểu thêm về thuộc tính method này các bạn nhé!
Trong project mà mình đã tạo ở bài viết trước, phương thức home() đã định nghĩa một annotation @RequestMapping với giá trị của thuộc tính method là RequestMethod.GET.
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 |
package com.huongdanjava.springmvc; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * Handles requests for the application home page. */ @Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); /** * Simply selects the home view to render by returning its name. */ @RequestMapping(value = "home", method = RequestMethod.GET) public String home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); model.addAttribute("serverTime", formattedDate); return "home"; } } |
Điều này có nghĩa người dùng truy cập request URL này với phương thức GET.
Enum org.springframework.web.bind.annotation.RequestMethod chính là đối tượng định nghĩa các request method cho Spring MVC.
Các method mà annotation @RequestMapping hỗ trợ được định nghĩa trong enum org.springframework.web.bind.annotation.RequestMethod như sau:
- GET
- HEAD
- POST
- PUT
- PATCH
- DELETE
- OPTIONS
- TRACE
Hãy xem thêm một ví dụ nữa nhé các bạn.
1 2 3 4 |
@RequestMapping(value = "doLogin", method = RequestMethod.POST) public String doLogin(HttpServletRequest request) { return "home"; } |
Như các bạn thấy, ở đây mình đã định nghĩa 1 request với POST method.
Mặc định khi sử dụng annotation @RequestMapping, nếu bạn không định nghĩa thuộc tính method thì request method sẽ là GET, POST hoặc HEAD. Ngoài những request method này, nếu các bạn request với các request method khác thì sẽ bị lỗi 405 ngay.
Ví dụ:
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 |
package com.huongdanjava.springmvc; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; /** * Handles requests for the application home page. */ @Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); /** * Simply selects the home view to render by returning its name. */ @RequestMapping(value = "home") public String home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); model.addAttribute("serverTime", formattedDate); return "home"; } } |
Kết quả:
Hoặc
Từ phiên bản 4.3 trở đi, Spring giới thiệu một số annotation để chúng ta dễ dàng khai báo request method hơn. Đó là các annotation sau:
- Annotation @GetMapping cho method GET.
- Annotation @PostMapping cho method POST.
- Annotation @PutMapping cho method PUT.
- Annotation @DeleteMapping cho method DELETE.
- Annotation @PatchMapping cho method PATCH.
Bây giờ thì chúng ta không cần phải khai báo:
1 |
@RequestMapping(value = "/", method = RequestMethod.GET) |
mà chỉ cần khai báo:
1 |
@GetMapping(value = "/") |
Nếu các bạn xem code của annotation @GetMapping thì các bạn sẽ hiểu tại sao chúng ta chỉ cần sử dụng annotation @GetMapping mà không cần sử dụng annotation @RequestMapping nữa.
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 |
/* * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor; /** * Annotation for mapping HTTP {@code GET} requests onto specific handler * methods. * * <p>Specifically, {@code @GetMapping} is a <em>composed annotation</em> that * acts as a shortcut for {@code @RequestMapping(method = RequestMethod.GET)}. * * * @author Sam Brannen * @since 4.3 * @see PostMapping * @see PutMapping * @see DeleteMapping * @see PatchMapping * @see RequestMapping */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @RequestMapping(method = RequestMethod.GET) public @interface GetMapping { /** * Alias for {@link RequestMapping#name}. */ @AliasFor(annotation = RequestMapping.class) String name() default ""; /** * Alias for {@link RequestMapping#value}. */ @AliasFor(annotation = RequestMapping.class) String[] value() default {}; /** * Alias for {@link RequestMapping#path}. */ @AliasFor(annotation = RequestMapping.class) String[] path() default {}; /** * Alias for {@link RequestMapping#params}. */ @AliasFor(annotation = RequestMapping.class) String[] params() default {}; /** * Alias for {@link RequestMapping#headers}. */ @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; /** * Alias for {@link RequestMapping#consumes}. * @since 4.3.5 */ @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; /** * Alias for {@link RequestMapping#produces}. */ @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; } |
Luongnv
“Mặc định khi sử dụng annotation @RequestMapping, nếu bạn không định nghĩa thuộc tính method thì request method sẽ là GET”
cái này ở spring 4.3 khác rồi phải ko anh? em thấy default method phải là ALL METHODS
Khanh Nguyen
Cảm ơn em đã góp ý.
Thật ra thì không phải là tất cả các HTTP method.
Anh đã cập nhập mới!
AnBinh
Anh có thể viết 1 bài so sánh và cách sử dụng các phương thức của RequestMethod được ko ạ? Thank anh!
Khanh Nguyễn
OK em, có thời gian anh sẽ viết nhé! Thanks em đã ủng hộ Hướng Dẫn Java.