中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring常用注解及http數據轉換的方法

發布時間:2022-03-18 09:07:07 來源:億速云 閱讀:291 作者:iii 欄目:開發技術

這篇文章主要講解了“Spring常用注解及http數據轉換的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring常用注解及http數據轉換的方法”吧!

一、HTTP協議的四種傳參方式

HTTP協議組成協議內容示例對應Spring注解
path info傳參/articles/12 (查詢id為12的文章,12是參數)@PathVariable
URL Query String傳參/articles?id=12@RequestParam
Body 傳參Content-Type: multipart/form-data@RequestParam
Body 傳參Content-Type: application/json,或其他自定義格式@RequestBody
Headers 傳參 @RequestHeader

二、常用注解回顧

2.1 @RequestBody與@ResponseBody

//注意并不要求@RequestBody與@ResponseBody成對使用。
public @ResponseBody  AjaxResponse saveArticle(@RequestBody ArticleVO article)

如上代碼所示:

  • @RequestBody修飾請求參數,注解用于接收HTTP的body,默認是使用JSON的格式

  • @ResponseBody修飾返回值,注解用于在HTTP的body中攜帶響應數據,默認是使用JSON的格式。如果不加該注解,spring響應字符串類型,是跳轉到模板頁面或jsp頁面的開發模式。說白了:加上這個注解你開發的是一個數據接口,不加這個注解你開發的是一個頁面跳轉控制器。

Spring常用注解及http數據轉換的方法

在使用@ResponseBody注解之后程序不會再走視圖解析器,也就不再做html視圖渲染,而是直接將對象以數據的形式(默認JSON)返回給請求發送者。那么我們有一個問題:如果我們想接收或XML數據該怎么辦?我們想響應excel的數據格式該怎么辦?我們后文來回答這個問題。

2.2. @RequestMapping注解

@RequestMapping注解是所有常用注解中,最有看點的一個注解,用于標注HTTP服務端點。它的很多屬性對于豐富我們的應用開發方式方法,都有很重要的作用。如:

value: 應用請求端點,最核心的屬性,用于標志請求處理方法的唯一性;

method: HTTP協議的method類型, 如:GET、POST、PUT、DELETE等;

consumes: HTTP協議請求內容的數據類型(Content-Type),例如application/json, text/html;

produces: HTTP協議響應內容的數據類型。下文會詳細講解。

params: HTTP請求中必須包含某些參數值的時候,才允許被注解標注的方法處理請求。

headers: HTTP請求中必須包含某些指定的header值,才允許被注解標注的方法處理請求。

@RequestMapping(value = "/article", method = POST)
@PostMapping(value = "/article")

上面代碼中兩種寫法起到的是一樣的效果,也就是PostMapping等同于@RequestMapping的method等于POST。同理:@GetMapping、@PutMapping、@DeleteMapping也都是簡寫的方式。

2.3. @RestController與@Controller

@Controller注解是開發中最常使用的注解,它的作用有兩層含義:

  • 一是告訴Spring,被該注解標注的類是一個Spring的Bean,需要被注入到Spring的上下文環境中。

  • 二是該類里面所有被RequestMapping標注的注解都是HTTP服務端點。

@RestController相當于 @Controller和@ResponseBody結合。它有兩層含義:

  • 一是作為Controller的作用,將控制器類注入到Spring上下文環境,該類RequestMapping標注方法為HTTP服務端點。

  • 二是作為ResponseBody的作用,請求響應默認使用的序列化方式是JSON,而不是跳轉到jsp或模板頁面。

2.4. @PathVariable 與@RequestParam

PathVariable用于URI上的{參數},如下方法用于刪除一篇文章,其中id為文章id。如:我們的請求URL為“/article/1”,那么將匹配DeleteMapping并且PathVariable接收參數id=1。而RequestParam用于接收普通表單方式或者ajax模擬表單提交的參數數據。

@DeleteMapping("/article/{id}")
public @ResponseBody AjaxResponse deleteArticle(@PathVariable Long id) {
@PostMapping("/article")
public @ResponseBody AjaxResponse deleteArticle(@RequestParam Long id) {

二、接收復雜嵌套對象參數

有一些朋友可能還無法理解RequestBody注解存在的真正意義,表單數據提交用RequestParam就好了,為什么還要搞出來一個RequestBody注解呢?RequestBody注解的真正意義在于能夠使用對象或者嵌套對象接收前端數據。

Spring常用注解及http數據轉換的方法

仔細看上面的代碼,是一個paramData對象里面包含了一個bestFriend對象。這種數據結構使用RequestParam就無法接收了,RequestParam只能接收平面的、一對一的參數。像上文中這種數據結構的參數,就需要我們在java服務端定義兩個類,一個類是ParamData,一個類是BestFriend.

public class ParamData {
    private String name;
    private int id;
    private String phone;
    private BestFriend bestFriend;
    public static class BestFriend {
        private String address;
        private String sex;
    }
}
  • 注意上面代碼中省略了GET、SET方法等必要的java plain model元素。

  • 注意成員變量名稱一定要和JSON屬性名稱對應上。

  • 注意接收不同類型的參數,使用不同的成員變量類型

完成以上動作,我們就可以使用@RequestBody ParamData paramData,一次性的接收以上所有的復雜嵌套對象參數了,參數對象的所有屬性都將被賦值。

三、Http數據轉換的原理

大家現在使用JSON都比較普遍了,其方便易用、表達能力強,是絕大部分數據接口式應用的首選。那么如何響應其他的類型的數據?其中的判別原理又是什么?下面就來給大家介紹一下:

Spring常用注解及http數據轉換的方法

  • 當一個HTTP請求到達時是一個InputStream,通過HttpMessageConverter轉換為java對象,從而進行參數接收。

  • 當對一個HTTP請求進行響應時,我們首先輸出的是一個java對象,然后由HttpMessageConverter轉換為OutputStream輸出。

當我們在Spring Boot應用中集成了jackson的類庫之后,如下的一些HttpMessageConverter將會被加載。

實現類功能說明
StringHttpMessageConverter將請求信息轉為字符串
FormHttpMessageConverter將表單數據讀取到MultiValueMap中
XmlAwareFormHttpMessageConverter擴展與FormHttpMessageConverter,如果部分表單屬性是XML數據,可用該轉換器進行讀取
ResourceHttpMessageConverter讀寫org.springframework.core.io.Resource對象
BufferedImageHttpMessageConverter讀寫BufferedImage對象
ByteArrayHttpMessageConverter讀寫二進制數據
SourceHttpMessageConverter讀寫java.xml.transform.Source類型的對象
MarshallingHttpMessageConverter通過Spring的org.springframework,xml.Marshaller和Unmarshaller讀寫XML消息
Jaxb2RootElementHttpMessageConverter通過JAXB2讀寫XML消息,將請求消息轉換為標注的XmlRootElement和XmlType連接的類中
MappingJacksonHttpMessageConverter利用Jackson開源包的ObjectMapper讀寫JSON數據
RssChannelHttpMessageConverter讀寫RSS種子消息
AtomFeedHttpMessageConverter和RssChannelHttpMessageConverter能夠讀寫RSS種子消息

根據HTTP協議的Accept和Content-Type屬性,以及參數數據類型來判別使用哪一種HttpMessageConverter。當使用RequestBody或ResponseBody時,再結合前端發送的Accept數據類型,會自動判定優先使用MappingJacksonHttpMessageConverter作為數據轉換器。但是,不僅JSON可以表達對象數據類型,XML也可以。如果我們希望使用XML格式該怎么告知Spring呢,那就要使用到produces屬性了。

@GetMapping(value ="/demo",produces = MediaType.APPLICATION_XML_VALUE)

這里我們明確的告知了返回的數據類型是xml,就會使用Jaxb2RootElementHttpMessageConverter作為默認的數據轉換器。當然實現XML數據響應比JSON還會更復雜一些,還需要結合@XmlRootElement、@XmlElement等注解實體類來使用。同理consumes屬性你是不是也會用了呢。

四、自定義HttpMessageConverter

其實絕大多數的數據格式都不需要我們自定義HttpMessageConverter,都有第三方類庫可以幫助我們實現(包括下文代碼中的Excel格式)。但有的時候,有些數據的輸出格式并沒有類似于Jackson這種類庫幫助我們處理,需要我們自定義數據格式。該怎么做?

下面我們就以Excel數據格式為例,寫一個自定義的HTTP類型轉換器。實現的效果就是,當我們返回AjaxResponse這種數據類型的話,就自動將AjaxResponse轉成Excel數據響應給客戶端。

<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.9</version>
</dependency>
@Service
public class ResponseToXlsConverter extends AbstractHttpMessageConverter<AjaxResponse> {
    private static final MediaType EXCEL_TYPE = MediaType.valueOf("application/vnd.ms-excel");
    ResponseToXlsConverter() {
        super(EXCEL_TYPE);
    }
    @Override
    protected AjaxResponse readInternal(final Class<? extends AjaxResponse> clazz,
                                final HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException {
        return null;
    }
    //針對AjaxResponse類型返回值,使用下面的writeInternal方法進行消息類型轉換
    @Override
    protected boolean supports(final Class<?> clazz) {
        return (AjaxResponse.class == clazz);
    }
    @Override
    protected void writeInternal(final AjaxResponse ajaxResponse, final HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException {
        final Workbook workbook = new HSSFWorkbook();
        final Sheet sheet = workbook.createSheet();
        final Row row = sheet.createRow(0);
        row.createCell(0).setCellValue(ajaxResponse.getMessage());
        row.createCell(1).setCellValue(ajaxResponse.getData().toString());
        workbook.write(outputMessage.getBody());
    }
}
  • 實現AbstractHttpMessageConverter接口

  • 指定該轉換器是針對哪種數據格式的?如上文代碼中的"application/vnd.ms-excel"

  • 指定該轉換器針對那些對象數據類型?如上文代碼中的supports函數

  • 使用writeInternal對數據進行輸出處理,上例中是輸出為Excel格式。

Spring常用注解及http數據轉換的方法

感謝各位的閱讀,以上就是“Spring常用注解及http數據轉換的方法”的內容了,經過本文的學習后,相信大家對Spring常用注解及http數據轉換的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

花垣县| 辽中县| 平度市| 赫章县| 泰和县| 池州市| 永康市| 宁强县| 黄骅市| 梁山县| 吴川市| 玉溪市| 东至县| 昌乐县| 曲靖市| 旬阳县| 桑日县| 江川县| 华池县| 乡宁县| 辽阳市| 建阳市| 松江区| 商河县| 赣榆县| 临泉县| 游戏| 湄潭县| 泉州市| 汤原县| 广西| 滨州市| 高碑店市| 个旧市| 新昌县| 镇赉县| 田东县| 科尔| 浮梁县| 阿克苏市| 浦城县|