本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正!

在程序员的日常工作中,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,结果为:

[
  {
    "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,结果如下:

{
  "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属性值必须与占位符里的名称完全一致。

这里的bookId,如果我们正常输入数字的话,接口是没有问题的,但如果不小心输入成了字符串,则会报如下错误:

为了避免因为用户输错参数而使接口报错的问题,我们可以使用正则表达式限制参数bookId必须为数字

@RequestMapping(value = "/getBook/{bookId:\\d+}", method = RequestMethod.GET)
public Book getBook(@PathVariable Integer bookId) {
     ......
}

此时再次访问错误的url,则返回404(接口未找到):

好了,本篇文章就先讲解这么多,其它注解后续再单独发布文章讲解。

6.源码地址

原文地址:Spring Boot入门(四):开发Web Api接口常用注解总结

博客地址:http://www.zwwhnly.com

源码地址:https://github.com/zwwhnly/springbootdemo.git

欢迎大家下载,有问题可以多多交流。

7.参考链接

用Spring Boot开发一个web API 接口返回数据

SpringBoot 中常用注解@Controller/@RestController/@RequestMapping介绍

Spring Boot入门(四):开发Web Api接口常用注解总结的更多相关文章

  1. spring boot 2 集成JWT实现api接口认证

    JSON Web Token(JWT)是目前流行的跨域身份验证解决方案.官网:https://jwt.io/本文使用spring boot 2 集成JWT实现api接口验证. 一.JWT的数据结构 J ...

  2. Spring Boot集成MyBatis开发Web项目

    1.Maven构建Spring Boot 创建Maven Web工程,引入spring-boot-starter-parent依赖 <project xmlns="http://mav ...

  3. Spring boot 入门四:spring boot 整合mybatis 实现CRUD操作

    开发环境延续上一节的开发环境这里不再做介绍 添加mybatis依赖 <dependency> <groupId>org.mybatis.spring.boot</grou ...

  4. Spring Boot入门-快速搭建web项目

    Spring Boot 概述: Spring Boot makes it easy to create stand-alone, production-grade Spring based Appli ...

  5. 初入spring boot(四 )web项目

    1. 模板引擎 spring boot提供了大量的模板引擎,包括FreeMark.Groovy.Thymeleaf.Velocity等,但spring boot中推荐用Thymeleaf,因为Thym ...

  6. Spring Boot入门(五):使用JDBC访问MySql数据库

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序开发的过程中,操作数据库是必不可少的部分,前面几篇博客中,也一直未涉及到数据库的操作,本篇博客 就 ...

  7. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...

  8. Spring Boot入门系列(二十一)如何优雅的设计 Restful API 接口版本号,实现 API 版本控制!

    前面介绍了Spring Boot 如何快速实现Restful api 接口,并以人员信息为例,设计了一套操作人员信息的接口.不清楚的可以看之前的文章:https://www.cnblogs.com/z ...

  9. 微信小程序的Web API接口设计及常见接口实现

    微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们 ...

随机推荐

  1. lvs+keepalive实现主从效果,以及RS健康监测和tcp,udp实现非web的负载均衡

    前面文章讲到了tcp和udp负载均衡,但是没有健康监测,这几天我优化了一下上次的操作.当然,我也是用的跨网段的通讯,因为线上业务主要是海外业务,所以做了iptables流量转发 IP: lvs-mas ...

  2. C语言出来多久了你知道吗?

    在20世纪80年代,为了避免不同开发者使用的C语言语法的差异,美国国家标准局为C语言开发了一套完整的美国国家标准语言文法,称为ANSI C,作为C语言的初始标准.. [1] 2011年12月8日,国际 ...

  3. nodejs环境 + 入门 + 博客搭建

    NodeJS:NodeJS是一个使用了Google高性能V8 引擎 的服务器端JavaScript实现.它提供了一个(几乎)完全非阻塞I/O栈,与JavaScript提供的闭包和匿名函数相结合,使之成 ...

  4. Java中浮点数的精度问题 【转】

    当您在计算Money的时候,请看好了!!!要不损失了别后悔!!! 现象1: public static void main(String[] args) { System.out.println(0. ...

  5. Linux系统中常见文件系统格式

    Windows常用的分区格式有三种,分别是FAT16.FAT32.NTFS格式. 在Linux操作系统里有Ext2.Ext3.Linux swap和VFAT四种格式. FAT16: 作为一种文件名称, ...

  6. 跨域cors方法(jsonp,document.domain,document.name)及iframe性质

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  7. SSM-Spring-03:Spring中AOP的初窥和入门小案例

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- AOP:面向切面编程 AOP的主要作用:是为了程序员更好的关注"业务",专心"做 ...

  8. PHP生成腾讯云COS请求签名

    目标 使用 PHP 创建 COS 接口所需要的请求签名 步骤 按照官方示例(也许是我笨,我怎么读都觉得官方文档结构费劲,示例细节互相不挨着,容易引起歧义),请求签名应用在需要身份校验的场景,即非公有读 ...

  9. 微信公众号 模板消息 定时推送 java

    前提:业务需要,要做一个关于月报的微信消息推送.即每个月定时自动发送一条消息 给关注 公众号的人 用的是 公众号的测试账号(实际开发需要认证的公众号) 微信官网的 模板消息接口规则: 1.所有服务号都 ...

  10. 基于Spring Cloud、JWT 的微服务权限系统设计

    基于Spring Cloud.JWT 的微服务权限系统设计 https://gitee.com/log4j/pig https://github.com/kioyong/spring-cloud-de ...