在程序员的日常工作中, web 开发应该是占比很重的一部分, 至少我工作以来, 开发的系统基本都是 Web 端访问的系统, Web 开发在这几年也是经历了很快的发展, 前端也显得越来越重要, 现在很多大一点的公司都实行前后端分离, 让后端和前端只专注于自己的事, 所谓术业有专攻, 我个人也非常建议前后端分离.
既然前后端分离了, 那么后端肯定需要提供 Web API 接口给到前端, 并返回前端需要的数据.
在 Spring Boot 中, 开发 Web API 接口主要使用以下几个注解:
- @Controller
- @ResponseBody
- @RestController
- @RequestMapping
- @PathVariable
其实, 这些注解在 Spring MVC 里都有了, 所以 Spring Boot 里的用法也和 Spring MVC 里基本一样.
在 Spring Boot 之所以能使用, 是因为在 spring-boot-starter-Web 这个 starter pom 中, 已经引用了 spring-Web 和 spring-webmvc.
接下来, 我们通过具体例子来讲解下各个注解的使用方法.
1.@Controller
新建控制器 HelloController, 添加 @Controller 注解, 添加 1 个方法 sayHello, 添加 @RequestMapping 注解, 代码如下:
- package com.zwwhnly.springbootdemo.controller;
- import org.springframework.stereotype.Controller;
- import org.springframework.Web.bind.annotation.RequestMapping;
- import org.springframework.Web.bind.annotation.RequestMethod;
- @Controller
- public class HelloController {
- @RequestMapping(value = "/hello", method = RequestMethod.GET)
- public String sayHello() {
- return "hello";
- }
- }
运行项目, 在浏览器输入 http://localhost:8080/hello 访问, 发现报如下错误:
报错的原因是未找到对应的模板, 那么如何解决呢?
我们先讲解下第一种解决方法, 添加下 thymeleaf 模板, 首先修改 pom 文件, 添加如下配置:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
如果没有设置自动导入 maven 包的话, IDEA 右下角会提示你导入, 点击 "Import Changes".
然后在 resources/templates 目录下, 新建 hello.html 文件 (内容先随便写), 再次运行项目, 访问 http://localhost:8080/hello, 发现访问正常:
2.@ResponseBody
还有一种更简单的方法是在控制器上添加 @ResponseBody 注解:
- package com.zwwhnly.springbootdemo.controller;
- 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
- @ResponseBody
- public class HelloController {
- @RequestMapping(value = "/hello", method = RequestMethod.GET)
- public String sayHello() {
- return "hello";
- }
- }
此时的运行结果 (直接返回字符串):
- hello
- 3.@RestController
@RestController 是 Spring4.0 推出的组合注解, 相当于 @Controller+@ResponseBody, 我们看下它的源码, 也能看出:
- @Target({ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Controller
- @ResponseBody
- public @interface RestController {
- @AliasFor(
- annotation = Controller.class
- )
- String value() default "";
- }
此时我们就可以将代码简化为:
- @RestController
- public class HelloController {
- @RequestMapping(value = "/hello", method = RequestMethod.GET)
- public String sayHello() {
- return "hello";
- }
- }
- 4.@RequestMapping
@RequestMapping 注解主要用来配置 url 映射, 既可以添加到控制器上, 也可以添加到控制器下的方法上, 添加到方法上是对添加到控制器上的补充, 举例说明:
新建图书类 Book:
- package com.zwwhnly.springbootdemo.model;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- public class Book {
- private Integer bookId;
- private String bookName;
- private String bookAuthor;
- private Date purchaseDate;
- public Book(Integer bookId, String bookName, String bookAuthor, String purchaseDate) throws ParseException {
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
- this.bookId = bookId;
- this.bookName = bookName;
- this.bookAuthor = bookAuthor;
- this.purchaseDate = simpleDateFormat.parse(purchaseDate);
- }
- public Integer getBookId() {
- return bookId;
- }
- public void setBookId(Integer bookId) {
- this.bookId = bookId;
- }
- public String getBookName() {
- return bookName;
- }
- public void setBookName(String bookName) {
- this.bookName = bookName;
- }
- public String getBookAuthor() {
- return bookAuthor;
- }
- public void setBookAuthor(String bookAuthor) {
- this.bookAuthor = bookAuthor;
- }
- public Date getPurchaseDate() {
- return purchaseDate;
- }
- public void setPurchaseDate(Date purchaseDate) {
- this.purchaseDate = purchaseDate;
- }
- }
在 HelloController 中添加方法 getBookList:
- @RequestMapping(value = "/getBookList", method = RequestMethod.GET)
- public List<Book> getBookList() {
- List<Book> books = new ArrayList<>();
- try {
- Book book1 = new Book(1, "平凡的世界", "路遥", "2010-01-01");
- Book book2 = new Book(2, "人生", "路遥", "2011-01-01");
- books.add(book1);
- books.add(book2);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return books;
- }
运行项目在浏览器输入 http://localhost:8080/getBookList, 结果为:
- // 20190424140621
- // http://localhost:8080/getBookList
- [
- {
- "bookId": 1,
- "bookName": "平凡的世界",
- "bookAuthor": "路遥",
- "purchaseDate": "2009-12-31 16:00:00"
- },
- {
- "bookId": 2,
- "bookName": "人生",
- "bookAuthor": "路遥",
- "purchaseDate": "2010-12-31 16:00:00"
- }
- ]
然后我们在 HelloController 上也加上 @RequestMapping 注解:
- package com.zwwhnly.springbootdemo.controller;
- import com.zwwhnly.springbootdemo.model.Book;
- import org.springframework.Web.bind.annotation.RequestMapping;
- import org.springframework.Web.bind.annotation.RequestMethod;
- import org.springframework.Web.bind.annotation.RestController;
- import java.text.ParseException;
- import java.util.ArrayList;
- import java.util.List;
- @RestController
- @RequestMapping(value = "hello")
- public class HelloController {
- @RequestMapping(value = "/hello", method = RequestMethod.GET)
- public String sayHello() {
- return "hello";
- }
- @RequestMapping(value = "/getBookList", method = RequestMethod.GET)
- public List<Book> getBookList() {
- List<Book> books = new ArrayList<>();
- try {
- Book book1 = new Book(1, "平凡的世界", "路遥", "2010-01-01");
- Book book2 = new Book(2, "人生", "路遥", "2011-01-01");
- books.add(book1);
- books.add(book2);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return books;
- }
- }
此时两个方法的访问地址就分别变为了: http://localhost:8080/hello/hello,http://localhost:8080/hello/getBookList.
5.@PathVariable
@PathVariable 注解用来获取 url 中的数据, 以下为具体的使用方法,
在 HelloController 控制器中添加方法 getBook, 通过占位符传递 bookId:
- @RequestMapping(value = "/getBook/{bookId}", method = RequestMethod.GET)
- public Book getBook(@PathVariable Integer bookId) {
- Book book = null;
- List<Book> books = new ArrayList<>();
- try {
- Book book1 = new Book(1, "平凡的世界", "路遥", "2010-01-01");
- Book book2 = new Book(2, "人生", "路遥", "2011-01-01");
- books.add(book1);
- books.add(book2);
- book = books.get(bookId - 1);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return book;
- }
运行项目, 在浏览器中访问 http://localhost:8080/hello/getBook/1, 结果如下:
- // 20190424145348
- // http://localhost:8080/hello/getBook/1
- {
- "bookId": 1,
- "bookName": "平凡的世界",
- "bookAuthor": "路遥",
- "purchaseDate": "2009-12-31 16:00:00"
- }
注意: 占位符里的名称必须和参数名完全一致, 区分大小写, 否则访问会报 500 错误.
如果想不一致, 可以写成如下方式:
- @RequestMapping(value = "/getBook/{bookId}", method = RequestMethod.GET)
- public Book getBook(@PathVariable("bookId") Integer bookIndex) {
- ......
- }
这种方式也要求, PathVariable 的 value 属性值必须与占位符里的名称完全一致.
好了, 本篇文章就先讲解这么多, 其它注解后续再单独发布文章讲解.
6. 源码地址
来源: https://www.cnblogs.com/zwwhnly/p/10762585.html