1. 程式人生 > 程式設計 >SpringBoot返回多種格式的資料的實現示例

SpringBoot返回多種格式的資料的實現示例

目錄
  • 一、SpringBoot整合Faston
    • 1.1、引入FastJson依賴包
    • 1.2、建立一個Web MVC的配置類,並放在springboot掃描包路徑下。
    • 1.3、測試fastjson是否引入成功。
  • 二、SpringBoot返回XML資料
    • 2.1、引入jackson元件依賴
    • 2.2、新建vo類,引入jackson-xml註解
    • 2.3、建立RestController測試返回資料
  • 三、SpringBoot返回PDF資料
    • 3.1、引入ITextPdf元件依賴
    • 3.2、引入系統字型庫
    • 3.3、在pdf中存入圖片
    • 3.4、建立pdf生成控制器
  • 四、SpringBoot返回Excel資料
    • 4.1、引入easypoi-spring-boot-starter依賴庫
    • 4.2、新建Message類
    • 4.3、新建ExcelAction負責生成Excel
  • 五、SpringBoot返回資源流
    • 5.1、返回影象流
      • 5.2、返回視訊流
        • 六、SpringBoot檔案下載

          一、SpringBoot整合FastJson

          1.1、引入FastJson依賴包

          maven專案:

          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>fastjson</artifactId>
              <version>1.2.78</version>
          </dependency>
          

          gradle專案:

          compile 'com.alibaba:fastjson:1.2.78'    // 引入fastjson
          

          1.2、建立一個Web MVC的配置類,並放在springboot掃描包路徑下。

          package com.it.config;
          
          import com.alibaba.fastjson.serializer.SerializerFeature;
          import com.alibaba.fastjson.support.config.FastJsonConfig;
          import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
          import org.springframework.context.annotation.Configuration;
          import org.springframework.http.MediaType;
          import org.springframework.http.converter.HttpMessageConverter;
          import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
          import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
          
          import .util.ArrayList;
          import java.util.List;
          
          @Configuration
          public class WebConfig implements WebMvcConfigurer {
          
              @Override
              public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
                  // 1.springboot預設使用Jaskson元件,需要先移除Jaskson元件
                  for (HttpMessageConverter<?> converter : converters) { // 迴圈所有的轉換器
                      if (converter instanceof MappingJackson2HttpMessageConverter) {
                          converters.remove(converter); // 刪除Jaskson轉換器
                      }
                  }
                  // 2. 專案中新增fastJson轉換器
                  FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
                  // 3. 配置fastJson轉換器
                  FastJsonConfig fastJsonConfig = new FastJsonConfig();
                  fastJsonConfig.setSerializerFeatures( // 配置序列化相關操作
                          SerializerFeature.WriteMapNullValue,// 允許Map內容為null
                          SerializerFeature.WriteNullListAsEmpty,// list集合為null使用[]代替
                          SerializerFeature.WriteNullStringAsEmpty,// String內容為null使用空文字代替
                          SerializerFeature.WriteDateUseDateFormat,// 日期格式化輸出
                          SerializerFeature.WriteNullNumberAsZero,// 數字為空使用0代替
                          SerializerFeature.DisableCircularReferenceDetect  // 禁用迴圈引用
                  );
                  fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); // 配置fastjson轉換處理
                  // 4. 配置響應的頭資訊
                  List<MediaType> fastJsonMediaTypeshttp://www.cppcns.com
          = new ArrayList<>(); // 所有的響應型別 fastJsonMediaTypes.add(MediaType.APPLICATION_JSON); // 使用JSON型別進行相應 fastJsonHttpMessageConverter.setSupportedMediaTypes(fastJsonMediaTypes); // 5. 轉換器列表中新增配置好的fastjson元件 converters.add(fastJsonHttpMessageConverter); } }

          1.3、測試fastjson是否引入成功。

          建立Message類:

          import com.fasterxml.jackson.annotation.JsonFormat;
          import lombok.Data;
          
          import java.util.Date;
          
          @Data
          public class Message {
              private String title;
              @JsonFormat(pattern = "yyyy年MM月dd日")
              private Date pubDate;
              private String content;
          }
          

          RestController中新增測試方法:

          @RequestMapping("/echo")
          public Object echo(Message message) {
              message.setTitle("【echo】" + message.getTitle());
              message.setContent("【echo】" + message.getContent());
              return message;
          }
          

          訪問echo發現fastjson引入成功:

          在這裡插入圖片描述

          二、SpringBoot返回XML資料

          2.1、引入jackson元件依賴

          jackson元件既支援json操作,也支援xml操作。

          <dependency>
              <groupId>com.fasterxml.jackson.dataformat</groupId>
              <artifactId>jackson-dataformat-xml</artifactId>
              <version>2.12.2</version>
          </dependency>
          
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
              <version>2.12.2</version>
          </dependency>
          
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-annotations</artifactId>
              <version>2.12.2</version>
          </dependency>
          

          如果使用的是gradle構建專案:

          compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.12.2'
          compile 'com.fasterxml.jackson.core:jackson-databind:2.12.2'
          compile 'com.fasterxml.jackson.core:jackson-annotations:2.12.2'
          

          2.2、新建vo類,引入jackson-xml註解

          package com.it.vo;
          
          import lombok.Data;
          
          import javax.xml.bind.annotation.XmlElement;
          import javax.xml.bind.annotation.XmlRootElement;
          import java.util.Date;
          
          @Data
          @XmlRootElement  // 定義XML根元素
          public class Message {
              @XmlElement  // xml元素
              private String title;
              @XmlElement
              private Date pubDate;
              @XmlElement
              private String content;
          }
          

          2.3、建立RestController測試返回資料

          @RequestMapping("/echo")
          public Object echo(Message message) {
              message.setTitle("【echo】" + message.getTitle());
              message.setContent("【echo】" + message.getContent());
              return message;
          }
          

          在這裡插入圖片描述

          三、SpringBoot返回PDF資料

          PDF是Portable Document Format的簡稱,意為“可攜帶文件格式”,是由Adobe Systems用於與應用程式、、硬體無關的方式進行檔案交換所發展出的檔案格式。PDF檔案以PostScript語言圖象模型為基礎,無論在哪種印表機上都可保證精確的顏色和準確的列印效果,即PDF會忠實地再現原稿的每一個字元、顏色以及圖象。

          在java專案中,itextpdf元件是比較常見的pdf建立工具、如果想要讓SpringBoot程式以PDF的形式進行相應,那麼需要引入ITextPdf建立元件依賴。

          3.1、引入ITextPdf元件依賴

          <dependency>
              <groupId>com.itextpdf</groupId>
              <artifactId>itextpdf</artifactId>
              <version>5.5.13.2</version>
          </dependency>
          

          如果使用的是gradle構建的專案:

          compile 'com.itextpdf:itextpdf:5.5.13.2'
          

          3.2、引入系統字型庫

          將pdf列印需要用到的字型放到專案資源路徑:src/main/resources/fonts下(windows系統字型庫路徑:C:\Windows\Fonts)

          在這裡插入圖片描述

          3.3、在pdf中存入圖片

          src/main/resources/images下存放一張圖片pic.jpg。

          SpringBoot返回多種格式的資料的實現示例

          3.4、建立pdf生成控制器

          package com.it.action;
          
          import com.itextpdf.text.*;
          import com.itextpdf.text.pdf.BaseFont;
          import com.itextpdf.text.pdf.PdfPCell;
          import com.itextpdf.text.pdf.PdfPTable;
          import com.itextpdf.text.pdf.PdfWriter;
          import org.springframework.core.io.ClassPathResource;
          import org.springframework.core.io.Resource;
          import org.springframework.stereotype.Controller;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.RequestMapping;
          
          import javax.servlet.http.HttpServletResponse;
          
          @Controller
          @RequestMapping("/pdf")
          public class PDFAction {
          
              @GetMapping("/create")
              public void createPDF(HttpServletResponse response) throws Exception { // 使用response處理響應
                  response.setHeader("Content-Type","application/pdf"); // 設定相應型別
                  // 強制開啟下載,並配置下載名稱
                  response.setHeader("Content-Disposition","attachment;filename=a.pdf");
                  // 使用iTextPdf在記憶體生成pdf
                  Document document = new Document(PageSize.A4,10,50,20); // 設定頁面大小、邊距
                  // 獲取pdf的輸出流配置
                  PdfWriter.getInstance(document,response.getOutputStream());
                  // 開始構建pdf文件內容
                  document.open();
                  Resource imageResource = new ClassPathResource("/images/pic.jpg"); // Spring提供的資源訪問
                  Image image = Image.getInstance(imageResource.getFile().getAbsolutePath()); // 通過指定路徑載入圖片
                  // PDF在生成檔案的時候是基於座標的方式進行繪製
                  image.scaleToFit(PageSize.A4.getWidth() / 2,PageSize.A4.getHeight());
                  float printX = (PageSize.A4.getWidth() - image.getScaledWidth()) / 2;
                  float printY = PageSize.A4.getHeight() - image.getHeight() - 100;
                  image.setAbsolutePosition(printX,printY); // 設定圖片繪製座標
                  document.add(image);
                  document.add(new Paragraph("\n\n\n")); //圖片之後換cvGxXoj三行輸出文字
                  // 載入字型檔
                  Resource fontResource = new ClassPathResource("/fonts/FZSTK.TTF");
                  BaseFont baseFont = BaseFont.createFont(fontResource.getFile().getAbsolutePath(),BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
                  Font font = new Font(baseFont,20,Font.NORMAL); // 引用字型檔
                  // pdf上繪製文字資訊
                  String[] titles = new String[]{"springboot test"};
                  for (String title : titles) { // 迴圈輸出
                      PdfPTable table = new PdfPTable(2); // 定義表格
                      PdfPCell cell = new PdfPCell(); //建立單元格
                      cell.setPhrase(new Paragraph(title,font)); // 單元格內容
                      table.addCell(cell); // 追加單元格
                      document.add(table); // 追加文件
                  }
                  document.close();
              }
          }
          

          四、SpringBoot返回Excel資料

          springboot為了便於使用者生成Excel檔案,提供了easypoi-spring-boot-starter依賴庫。

          4.1、引入easypoi-spring-boot-starter依賴庫

          <dependency>
              <groupId>cn.afterturn</groupId>
              <artifactId>easypoi-spring-boot-starter</artifactId>
              <version>4.4.0</version>
          </dependency>
          

          如果是gradle專案:

          compile 'cn.afterturn:easypoi-spring-boot-starter:4.4.0'
          

          4.2、新建Message類

          excel表格可以通過java bean轉換生成。

          package com.it.vo;
          
          import cn.afterturn.easypoi.excel.annotation.Excel;
          import lombok.Data;
          
          import java.util.Date;
          
          @Data
          public class Message {
              @Excel(name = "資訊標題",orderNum = "0",width = 30)
              private String title;
              @Excel(name = "資訊日期",orderNum = "1",width = 50)
              private Date pubDate;
              @Excel(name = "資訊內容",orderNum = "2",width = 100)
              private String content;
          }

          4.3、新建ExcelAction負責生成Excel

          package com.it.action;
          
          import cn.afterturn.easypoi.excel.entity.ExportParams;
          import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
          import cn.afterturn.easypoi.excel.export.ExcelExportService;
          import com.it.vo.Message;
          import org.apache.poi.xssf.usermodel.XSSFWorkbook;
          import org.springframework.stereotype.Controller;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.RequestMapping;
          
          import javax.servlet.http.HttpServletResponse;
          import java.util.ArrayList;
          import java.util.Date;
          import java.util.List;
          
          @Controller
          @RequestMapping("/excel")
          public class ExcelAction {
          
              @GetMapping("/create")
              public void createExcel(HttpServletResponse response) throws Exception { // 使用response處理響應
                  response.setHeader("Content-Type","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); // 設定響應型別
                  // 強制開啟下載,並配置下載名稱
                  response.setHeader("Content-Disposition","attachment;filename=test.xls");
                  List<Message> messageList = new ArrayList<>();
                  messageList.add(new Message("重大訊息",new Date(),"xxx廠喜迎重大改革"));
                  messageList.add(new Message("首屆稀土開發者大會全日程公佈","27-28日直播兩天精彩不停!"));
                  ExportParams exportParams = new ExportParams("訊息管理","最新訊息",ExcelType.XSSF);
                  XSSFWorkbook workbook = new XSSFWorkbook();
                  new ExcelExportService().createSheet(workbook,exportParams,Message.class,messageList);
                  workbook.write(response.getOutputStream());
              }
          }

          SpringBoot返回多種格式的資料的實現示例

          五、SpringBoot返回資源流

          在進行前後端分離設計的時候,需要進行一些資源的載入,一般會有兩種做法:

          • 直接通過遠端檔案伺服器進行資源的載入。
          • 通過程式進行載入。

          5.1、返回影象流

          程式在進行影象流返回的時候只需要將返回型別設定為圖片即可。

          5.1.1、建立ImageAction負責返回影象流

          package com.it.action;
          
          import org.springframework.core.io.ClassPathResource;
          import org.springframework.core.io.Resource;
          import org.springframework.http.MediaType;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RestController;
          
          import java.io.IOException;
          import java.io.InputStream;
          
          @RestController
          @RequestMapping("/image")
          public class ImageAction {
          
              @GetMapping(value = "/download",produces =
                      {MediaType.IMAGE_JPEG_VALUE,MediaType.IMAGE_GIF_VALUE,MediaType.IMAGE_PNG_VALUE}) // 設定返回型別
              public byte[] createImage() throws IOException {
                  Resource imageResource = new ClassPathResource("/images/dog.jpg");
                  InputStream inputStream = imageResource.getInputStream();
                  byte[] bytes = new byte[inputStream.available()];
                  inputStream.read(bytes,imageResource.getInputStream().available());// 實現檔案載入
                  return bytes;
              }
          }

          5.1.2、輸入訪問路徑

          http://localhost:8080/image/download

          SpringBoot返回多種格式的資料的實現示例

          5.2、返回視訊流

          SpringBoot可以實現對視訊流的控制。

          5.2.1、提供視訊資源的請求處理器

          package com.it.handler;
          
          import org.springframework.core.io.ClassPathResource;
          import org.springframework.core.io.Resource;
          import org.springframework.stereotype.Component;
          import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
          
          import javax.servlet.http.HttpServletRequest;
          import java.io.IOException;
          
          /**
           * 請求處理器
           */
          @Component
          public class VideoResourceHttpRequestHandler extends ResourceHttpRequestHandler {
              @Override
              public Resource getResource(HttpServletRequest request) throws IOException {
                  return new ClassPathResource("/videos/study.mp4");
              }
          }
          

          5.2.2、定義視訊響應Action類

          package com.it.action;
          
          import com.it.handler.VideoResourceHttpRequestHandler;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RestController;
          
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          
          @RestController
          @RequestMapping("/video")
          public class VideoAction {
          
              private final VideoResourceHttpRequestHandler videoResourceHttpRequestHandler;
          
              public VideoAction(VideoResourceHttpRequestHandler videoResourceHttpRequestHandler) {
                  this.videoResourceHttpRequestHandler = videoResourceHttpRequestHandler;
              }
          
              @GetMapping("/download")
              public void createVideo(HttpServletRequest request,HttpServletResponse response) throws Exception {
                  this.videoResourceHttpRequestHandler.handleRequest(request,response);
              }
          }

          5.2.3、輸入訪問路徑

          http://localhost:8080/video/download

          SpringBoot返回多種格式的資料的實現示例

          六、SpringBoot檔案下載

          SpringBoot可以直接通過輸出流的方式實現檔案下載,例如下載resources/files/banner.rar檔案:

          banner.rar

          package com.it.action;
          
          imporcvGxXojt org.springframework.core.io.ClassPathResource;
          import org.springframework.core.io.Resource;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RestController;
          
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          import java.io.InputStream;
          
          @RestController
          @RequestMapping("/file")
          public class DownloadAction {
          
              @GetMapping("/download")
              public void fileDownload(HttpServletResponse response) throws IOException {
                  response.setContentType("application/force-download");// 強制性下載
                  response.setHeader("Content-Disposition","attachment;filename=banner.rar");
                  Resource fileResource = new ClassPathResource("/files/banner.rar"); // 要下載的檔案
                  // 通過IO流讀取檔案內容
                  InputStream input = fileResource.getInputStream();
                  byte[] data = new byte[1024]; // 每次最多讀取1024位元組
                  int len = 0; // 每次讀取的位元組數
                  while ((len = input.read(data)) != -1) {
                      response.getOutputStream().write(data,len);
                  }
              }
          }

          訪問:http://localhost:8080/file/download:

          dd

          到此這篇關於SpringBoot返回多種格式的資料的實現示例的文章就介紹到這了,更多相關SpringBoot返回多種格式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!