<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 一、常用注解回顧 ***** ### 1.1 @RequestBody與@ResponseBody ~~~ //注意并不要求@RequestBody與@ResponseBody成對使用。 public @ResponseBody AjaxResponse saveArticle(@RequestBody ArticleVO article) ~~~ 如上代碼所示: * @RequestBody修飾請求參數,注解用于接收HTTP的body,默認是使用JSON的格式 * @ResponseBody修飾返回值,注解用于在HTTP的body中攜帶響應數據,默認是使用JSON的格式。如果不加該注解,spring響應字符串類型,是跳轉到模板頁面或jsp頁面的開發模式。說白了:加上這個注解你開發的是一個數據接口,不加這個注解你開發的是一個頁面跳轉控制器。 ![](https://img.kancloud.cn/a3/e0/a3e03e33a39d83822bb56356bc087116_1207x685.png) 在使用@ResponseBody注解之后程序不會再走視圖解析器,也就不再做html視圖渲染,而是直接將對象以數據的形式(默認JSON)返回給請求發送者。那么我們有一個問題:如果我們想接收或XML數據該怎么辦?我們想響應excel的數據格式該怎么辦?我們后文來回答這個問題。 ### 1.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也都是簡寫的方式。 ### 13. @RestController與@Controller @Controller注解是開發中最常使用的注解,它的作用有兩層含義: * 一是告訴Spring,被該注解標注的類是一個Spring的Bean,需要被注入到Spring的上下文環境中。 * 二是該類里面所有被RequestMapping標注的注解都是HTTP服務端點。 @RestController相當于 @Controller和@ResponseBody結合。它有兩層含義: * 一是作為Controller的作用,將控制器類注入到Spring上下文環境,該類RequestMapping標注方法為HTTP服務端點。 * 二是作為ResponseBody的作用,請求響應默認使用的序列化方式是JSON,而不是跳轉到jsp或模板頁面。 ### 1.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) { ~~~ ## 二、Http數據轉換原理 ***** 序列化與反序列化 ![](https://img.kancloud.cn/37/40/37404a4da1dc198e6b56545d14f78b66_846x289.png) ## 三、自定義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格式。 在postman中可以使用GET方法測試 ![](https://img.kancloud.cn/ec/4a/ec4a3f62035b5d6b1fcc831170cbe513_1449x544.png) ![](https://img.kancloud.cn/5f/75/5f751a7fe484527316899ce811d7af3e_842x132.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看