本系列博客記錄本身學習Spring Boot的歷程,如幫助到你,不勝榮幸,若有錯誤,歡迎指正!html
在程序員的平常工做中,Web開發應該是佔比很重的一部分,至少我工做以來,開發的系統基本都是Web端訪問的系統,Web開發在這幾年也是經歷了很快的發展,前端也顯得愈來愈重要,如今不少大一點的公司都實行先後端分離,讓後端和前端只專一於本身的事,所謂術業有專攻,我我的也很是建議先後端分離。前端
既然先後端分離了,那麼後端確定須要提供Web Api接口給到前端,並返回前端須要的數據。java
在Spring Boot中,開發Web Api接口主要使用如下幾個註解:git
其實,這些註解在Spring MVC裏都有了,因此Spring Boot裏的用法也和Spring MVC裏基本同樣。程序員
在Spring Boot之因此能使用,是由於在spring-boot-starter-web 這個starter pom中,已經引用了spring-web和spring-webmvc。github
接下來,咱們經過具體例子來說解下各個註解的使用方法。web
新建控制器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訪問,發現報以下錯誤:spring
報錯的緣由是未找到對應的模板,那麼如何解決呢?json
咱們先講解下第一種解決方法,添加下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,發現訪問正常:
還有一種更簡單的方法是在控制器上添加@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
@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"; } }
@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。
@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(接口未找到):
好了,本篇文章就先講解這麼多,其它註解後續再單獨發佈文章講解。
原文地址:Spring Boot入門(四):開發Web Api接口經常使用註解總結
源碼地址:https://github.com/zwwhnly/springbootdemo.git
歡迎你們下載,有問題能夠多多交流。
用Spring Boot開發一個web API 接口返回數據
SpringBoot 中經常使用註解@Controller/@RestController/@RequestMapping介紹