本来,是不想写这篇博客的,一是因为懒,二是因为之前学习过Spring MVC,而Spring Boot中的大部分常用注解其实都是Spring MVC中的注解。不过,为了以后方便自己查阅和养成写博客的习惯,我觉得我还是记录下来吧。
主要处理HTTP请求,Spring会将接收到的HTTP请求交给被@Controller
所标记的类。现在强调前后台分离,所以,该注解现在主要与@ResponseBody
配合使用来返回json数据。
import org.springframework.stereotype.Controller;
@Controller
public class HelloController {
}
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
一般与@Controller
配合使用来返回json数据。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@Autowired //自动注入
private Person person;
@ResponseBody
@RequestMapping(value = {"/hello", "/hi"}, method = RequestMethod.GET)
public Person hello() {
return person;
}
}
该注解是Spring4之后新加的注解,等同于@Controller
和@ResponseBody
的组合。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private Person person;
@RequestMapping(value = {"/hello", "/hi"}, method = RequestMethod.GET)
public Person hello() {
return person;
}
}
每个Controller类,接收到HTTP请求,会通过请求的URL和请求方法(GET,POST…)来映射使用哪个控制器方法来执行请求。这种映射主要通过@RequestMapping
注解来实现。
一个控制器方法对应一个URL,注解@RequestMapping
中,value
的值即为所映射的URL。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
/**
* 启动应用,浏览器打开http://localhost:8080/hello,会调用该方法,打印:Hello, Spring Boot.
* @return
*/
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String helloGet() {
return "Hello, Spring Boot";
}
}
同一个URL,请求方法不同,也能对应不同的控制器方法。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
/**
* 启动应用,浏览器打开http://localhost:8080/hello,会调用该方法,打印:Hello, Spring Boot.Request:GET.
* @return
*/
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String helloGet() {
return "Hello, Spring Boot.Request:GET";
}
/**
* 启动应用后,通过模拟Http软件,以post方式请求http://localhost:8080/hello,会调用该方法,打印:Hello, Spring Boot.Request:POST.
* HTTP模拟软件推荐postman。多平台支持。
* @return
*/
@RequestMapping(value = "/hello", method = RequestMethod.POST)
public String helloPost() {
return "Hello, Spring Boot.Request:POST";
}
}
针对不同的请求方法,Spring都提供了它的简写方式,如@GetMapping
、@PostMapping
。下面的代码与上面的代码实现的效果相同。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello") //等同于@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String helloGet() {
return "Hello, Spring Boot.Request.GET";
}
@PostMapping("hello") //等同于@RequestMapping(value = "/hello", method = RequestMethod.POST)
public String helloPost() {
return "Hello, Spring Boot.Request:POST";
}
}
一个控制器方法也可以对应多个URL,即value
的值可以对应一个URL的集合。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
/**
* 此时value对应两个URL,访问/hello和/hi是一样的效果
* @return
*/
@RequestMapping(value = {"/hello", "/hi"}, method = RequestMethod.GET)
public String helloGet() {
return "Hello, Spring Boot.";
}
}
@RequestMapping
不只可以在方法上使用,也可以在一个控制器类上使用。在一个控制器类上使用该注解,那么类里的其它注解的URL,需要与该注解的URL相加进行访问才可以。代码如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/howieli") //类级URL映射
public class HelloController {
/**
* 此时访问该方法需要访问/howieli/hello或者/howieli/hi
* @return
*/
@RequestMapping(value = {"/hello", "/hi"}, method = RequestMethod.GET)
public String helloGet() {
return "Hello, Spring Boot.";
}
}
在实际开发中,参数肯定是不可或缺的一部分,那么,在控制器中应该怎么获取呢?我们需要知道,在实际开发中,传递的数据主要是分为两种的,第一种的直接通过URL传递,比如:http://localhost:8080/say/3
,其中3
为所传递数据。还有一种是通过参数传递,比如GET的传参方式:http://localhost:8080/say?id=3
。
针对第一种情况,Spring提供了@PathVariable
注解,针对第二种情况,Spring也提供了@RequestParam
注解。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
/**
* 在URL映射的注解中,我们可以看到URL中被大括号括起来的id,这就代表我们要传递的数据
* 在helloGet方法传入参数时使用@PathVariable注解,表示将URL中的id所代表的数据作为参数传入方法中
* name这个参数,是通过参数的方式传入,此时可以使用@RequestParam注解,其实在这里注解可以省略不写,因为我们变量名是一样的
* 比如我们参数是?name=howieli中的name与方法参数name是相同的,就可以省略注解。
* @param id
* @return
*/
@GetMapping(value = "/say/{id}")
public String helloGet(@PathVariable("id") int id, @RequestParam("name") String name) {
return "id: " + id + ",name:" + name;
}
}
启动应用,访问http://localhost:8080/say/5?name=howieli
,即可打印id: 5,name:howieli
。
这个部分写的有点乱。
这只是一些比较常用的注解,之后碰到其它重要注解会慢慢补充。
个人博客:https://www.howieli.cn 和个人CSDN博客: http://blog.csdn.net/howieli_1995。