javascript
Spring常用注解的讲解
轉(zhuǎn)載,原文鏈接
作者:字母哥博客
本文出自:springboot深入淺出系列
文章目錄
- 一、常用注解回顧
- 1.1 @RequestBody與@ResponseBody
- 1.2. @RequestMapping注解
- 1.3. @RestController與@Controller
- 1.4. @PathVariable 與@RequestParam
- 二、接收復雜嵌套對象參數(shù)
- 三、Http數(shù)據(jù)轉(zhuǎn)換的原理
- 四、自定義HttpMessageConverter
一、常用注解回顧
1.1 @RequestBody與@ResponseBody
注意并不要求@RequestBody與@ResponseBody成對使用。
public @ResponseBody AjaxResponse saveArticle(@RequestBody ArticleVO article)如上代碼所示:
- @RequestBody修飾請求參數(shù),注解用于接收HTTP的body,默認是使用JSON的格式
- @ResponseBody修飾返回值,注解用于在HTTP的body中攜帶響應數(shù)據(jù),默認是使用JSON的格式。如果不加該注解,spring響應字符串類型,是跳轉(zhuǎn)到模板頁面或jsp頁面的開發(fā)模式。說白了:
加上這個注解你開發(fā)的是一個數(shù)據(jù)接口,不加這個注解你開發(fā)的是一個頁面跳轉(zhuǎn)控制器。
那么我們有一個問題:如果我們想接收或XML數(shù)據(jù)該怎么辦?我們想響應excel的數(shù)據(jù)格式該怎么辦?我們后文來回答這個問題。
1.2. @RequestMapping注解
@RequestMapping注解是所有常用注解中,最有看點的一個注解,用于標注HTTP服務端點。它的很多屬性對于豐富我們的應用開發(fā)方式方法,都有很重要的作用。如:
- value: 應用請求端點,最核心的屬性,用于標志請求處理方法的唯一性;
- method: HTTP協(xié)議的method類型, 如:GET、POST、PUT、DELETE等;
- consumes: HTTP協(xié)議請求內(nèi)容的數(shù)據(jù)類型(Content-Type),例如application/json, text/html;
- produces: HTTP協(xié)議響應內(nèi)容的數(shù)據(jù)類型。下文會詳細講解。
- params: HTTP請求中必須包含某些參數(shù)值的時候,才允許被注解標注的方法處理請求。
- headers: HTTP請求中必須包含某些指定的header值,才允許被注解標注的方法處理請求。
上面代碼中兩種寫法起到的是一樣的效果,也就是PostMapping等同于@RequestMapping的method等于POST。同理:@GetMapping、@PutMapping、@DeleteMapping也都是簡寫的方式。
1.3. @RestController與@Controller
@Controller注解是開發(fā)中最常使用的注解,它的作用有兩層含義:
一是告訴Spring,被該注解標注的類是一個Spring的Bean,需要被注入到Spring的上下文環(huán)境中。
二是該類里面所有被RequestMapping標注的注解都是HTTP服務端點。
@RestController相當于 @Controller和@ResponseBody結(jié)合。它有兩層含義:
- 一是作為Controller的作用,將控制器類注入到Spring上下文環(huán)境,該類RequestMapping標注方法為HTTP服務端點。
- 二是作為ResponseBody的作用,請求響應默認使用的序列化方式是JSON,而不是跳轉(zhuǎn)到jsp或模板頁面。
1.4. @PathVariable 與@RequestParam
PathVariable用于URI上的{參數(shù)},如下方法用于刪除一篇文章,其中id為文章id。如:我們的請求URL為“/article/1”,那么將匹配DeleteMapping并且PathVariable接收參數(shù)id=1。而RequestParam用于接收普通表單方式或者ajax模擬表單提交的參數(shù)數(shù)據(jù)。
@DeleteMapping("/article/{id}") public @ResponseBody AjaxResponse deleteArticle(@PathVariable Long id) {@PostMapping("/article") public @ResponseBody AjaxResponse deleteArticle(@RequestParam Long id) {二、接收復雜嵌套對象參數(shù)
有一些朋友可能還無法理解RequestBody注解存在的真正意義,表單數(shù)據(jù)提交用RequestParam就好了,為什么還要搞出來一個RequestBody注解呢?RequestBody注解的真正意義在于能夠使用對象或者嵌套對象接收前端數(shù)據(jù)。
仔細看上面的代碼,是一個paramData對象里面包含了一個bestFriend對象。這種數(shù)據(jù)結(jié)構(gòu)使用RequestParam就無法接收了,RequestParam只能接收平面的、一對一的參數(shù)。像上文中這種數(shù)據(jù)結(jié)構(gòu)的參數(shù),就需要我們在java服務端定義兩個類,一個類是ParamData,一個類是BestFriend.
- 注意上面代碼中省略了GET、SET方法等必要的java plain model元素。
- 注意成員變量名稱一定要和JSON屬性名稱對應上。
- 注意接收不同類型的參數(shù),使用不同的成員變量類型
完成以上動作,我們就可以使用@RequestBody ParamData paramData,一次性的接收以上所有的復雜嵌套對象參數(shù)了,參數(shù)對象的所有屬性都將被賦值。
三、Http數(shù)據(jù)轉(zhuǎn)換的原理
大家現(xiàn)在使用JSON都比較普遍了,其方便易用、表達能力強,是絕大部分數(shù)據(jù)接口式應用的首選。那么如何響應其他的類型的數(shù)據(jù)?其中的判別原理又是什么?下面就來給大家介紹一下:
- 當一個HTTP請求到達時是一個InputStream,通過HttpMessageConverter轉(zhuǎn)換為java對象,從而進行參數(shù)接收。
- 當對一個HTTP請求進行響應時,我們首先輸出的是一個java對象,然后由HttpMessageConverter轉(zhuǎn)換為OutputStream輸出。
當我們在Spring Boot應用中集成了jackson的類庫之后,如下的一些HttpMessageConverter將會被加載。
根據(jù)HTTP協(xié)議的Accept和Content-Type屬性,以及參數(shù)數(shù)據(jù)類型來判別使用哪一種HttpMessageConverter。當使用RequestBody或ResponseBody時,再結(jié)合前端發(fā)送的Accept數(shù)據(jù)類型,會自動判定優(yōu)先使用MappingJacksonHttpMessageConverter作為數(shù)據(jù)轉(zhuǎn)換器。但是,不僅JSON可以表達對象數(shù)據(jù)類型,XML也可以。如果我們希望使用XML格式該怎么告知Spring呢,那就要使用到produces屬性了。
這里我們明確的告知了返回的數(shù)據(jù)類型是xml,就會使用Jaxb2RootElementHttpMessageConverter作為默認的數(shù)據(jù)轉(zhuǎn)換器。當然實現(xiàn)XML數(shù)據(jù)響應比JSON還會更復雜一些,還需要結(jié)合@XmlRootElement、@XmlElement等注解實體類來使用。同理consumes屬性你是不是也會用了呢。
四、自定義HttpMessageConverter
其實絕大多數(shù)的數(shù)據(jù)格式都不需要我們自定義HttpMessageConverter,都有第三方類庫可以幫助我們實現(xiàn)(包括下文代碼中的Excel格式)。但有的時候,有些數(shù)據(jù)的輸出格式并沒有類似于Jackson這種類庫幫助我們處理,需要我們自定義數(shù)據(jù)格式。該怎么做?下面代碼只是幫助我們理解的一個例子,不要用于生產(chǎn):
@Service public class TeamToXlsConverter extends AbstractHttpMessageConverter<Team> {private static final MediaType EXCEL_TYPE = MediaType.valueOf("application/vnd.ms-excel");TeamToXlsConverter() {super(EXCEL_TYPE);}@Overrideprotected Team readInternal(final Class<? extends Team> clazz, final HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {return null;}@Overrideprotected boolean supports(final Class<?> clazz) {return (Team.class == clazz);}@Overrideprotected void writeInternal(final Team team, final HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {try (final Workbook workbook = new HSSFWorkbook()) {final Sheet sheet = workbook.createSheet();int rowNo = 0;for (final TeamMember member : team.getMembers()) {final Row row = sheet.createRow(rowNo++);row.createCell(0).setCellValue(member.getName());}workbook.write(outputMessage.getBody());}} }- 實現(xiàn)AbstractHttpMessageConverter接口
- 指定該轉(zhuǎn)換器是針對哪種數(shù)據(jù)格式的?如上文代碼中的"application/vnd.ms-excel"
- 指定該轉(zhuǎn)換器針對那些對象數(shù)據(jù)類型?如上文代碼中的supports函數(shù)
- 使用writeInternal對數(shù)據(jù)進行輸出處理,上例中是輸出為Excel格式。
總結(jié)
以上是生活随笔為你收集整理的Spring常用注解的讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 咖啡的味道
- 下一篇: jQuery的radio,checkbo