SpringMVC:多视图[JSP,JSON,Excel,XML]混合输出__Java配置方式

简介: SpringMVC:多视图[JSP,JSON,Excel,XML]混合输出__Java配置方式

SpringMVC可以通过URL扩展名请求参数来控制服务端的资源输出类型。



maven 依赖


  1. <!--配置jsp jstl的支持-->
  2.        <dependency>
  3.            <groupId>javax.servlet</groupId>
  4.            <artifactId>jstl</artifactId>
  5.        </dependency>
  6.        <dependency>
  7.            <groupId>taglibs</groupId>
  8.            <artifactId>standard</artifactId>
  9.        </dependency>
  10.        <!-- Needed for XML View(with JAXB2) -->
  11.        <dependency>
  12.            <groupId>org.springframework</groupId>
  13.            <artifactId>spring-oxm</artifactId>
  14.            <version>${spring.version}</version>
  15.        </dependency>
  16.        <!-- Needed for JSON View -->
  17.        <dependency>
  18.            <groupId>com.fasterxml.jackson.core</groupId>
  19.            <artifactId>jackson-databind</artifactId>
  20.            <version>2.6.1</version>
  21.        </dependency>
  22.        <dependency>
  23.            <groupId>com.fasterxml.jackson.core</groupId>
  24.            <artifactId>jackson-annotations</artifactId>
  25.            <version>2.6.1</version>
  26.        </dependency>
  27.        <!-- Needed for PDF View -->
  28.        <dependency>
  29.            <groupId>com.lowagie</groupId>
  30.            <artifactId>itext</artifactId>
  31.            <version>2.1.7</version>
  32.            <scope>compile</scope>
  33.        </dependency>
  34.        <!-- Needed for XLS View -->
  35.        <dependency>
  36.            <groupId>org.apache.poi</groupId>
  37.            <artifactId>poi</artifactId>
  38.            <version>3.14</version>
  39.        </dependency>

视图解析器


  1. package com.newcapec.config;
  2. import com.newcapec.util.ExcelViewResolver;
  3. import com.newcapec.util.PdfViewResolver;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.ComponentScan;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.http.MediaType;
  8. import org.springframework.web.accept.ContentNegotiationManager;
  9. import org.springframework.web.servlet.View;
  10. import org.springframework.web.servlet.ViewResolver;
  11. import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
  12. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  13. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  14. import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
  15. import org.springframework.web.servlet.view.InternalResourceViewResolver;
  16. import org.springframework.web.servlet.view.JstlView;
  17. import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
  18. import org.springframework.web.servlet.view.xml.MarshallingView;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. /**
  22. * @Title: 视图解析器--配置类
  23. * @ClassName: com.newcapec.cloudpay.controller.util.SpringMvcConfig.java
  24. * @Description:
  25. *
  26. * @Copyright2016-2018 新开普 - Powered By 研发中心
  27. * @author: 王延飞
  28. * @date:  2018-01-1416:52
  29. * @version V1.0
  30. */
  31. @Configuration
  32. @EnableWebMvc
  33. @ComponentScan(basePackages = "com.newcapec.cloudpay.controller")
  34. publicclassSpringMvcConfigextendsWebMvcConfigurerAdapter {
  35.    /*
  36.     * Configure ContentNegotiationManager
  37.     */
  38.    @Override
  39.    publicvoidconfigureContentNegotiation(ContentNegotiationConfigurer configurer) {
  40.        configurer
  41.                // 设置默认的MIME类型,如果没有指定拓展名或请求参数,则使用此默认MIME类型解析视图
  42.                .defaultContentType(MediaType.TEXT_HTML)
  43.                // 是否不适用请求头确定MIME类型
  44.                .ignoreAcceptHeader(true)
  45.                /*使用拓展名类型,不注释以下三行将使用参数(type)的方法访问*/
  46.                // 是否根据路径拓展名确定MIME类型
  47.                .favorPathExtension(false)
  48.                // 是否使用参数来确定MIME类型
  49.                .favorParameter(false)
  50.                // 上一个属性配置为true,我们指定type请求参数判断MIME类型
  51.                .parameterName("type");
  52.    }
  53.    /*
  54.     * Configure ContentNegotiatingViewResolver
  55.     */
  56.    @Bean
  57.    public ViewResolver contentNegotiatingViewResolver(ContentNegotiationManager manager) {
  58.        ContentNegotiatingViewResolverresolver=newContentNegotiatingViewResolver();
  59.        // 设置优先级
  60.        resolver.setOrder(1);
  61.        // 添加ContentNegotiationManager
  62.        resolver.setContentNegotiationManager(manager);
  63.        /*设置默认的候选视图,如果有合适的MIME类型,将优先从以下选择视图,找不到再在整个Spring容器里寻找已注册的合适视图 */
  64.        List<View> views = newArrayList<View>();
  65.        views.add(newMappingJackson2JsonView());
  66.        views.add(newMarshallingView());
  67.        resolver.setDefaultViews(views);
  68.        /*自定义视图解析器,或者对已有的视图进行个性化配置*/
  69.        // Define all possible view resolvers
  70.        List<ViewResolver> resolvers = newArrayList<ViewResolver>();
  71.        /*resolvers.add(jaxb2MarshallingXmlViewResolver());
  72.        resolvers.add(jsonViewResolver());*/
  73.        resolvers.add(jspViewResolver());
  74.        resolvers.add(pdfViewResolver());
  75.        resolvers.add(excelViewResolver());
  76.        resolver.setViewResolvers(resolvers);
  77.        return resolver;
  78.    }
  79.    /*
  80.     * Configure View resolver to provide XML output Uses JAXB2 marshaller to
  81.     * marshall/unmarshall POJO's (with JAXB annotations) to XML
  82.     */
  83.   /* @Bean
  84.    public ViewResolver jaxb2MarshallingXmlViewResolver() {
  85.        Jaxb2Marshallermarshaller=newJaxb2Marshaller();
  86.        marshaller.setClassesToBeBound(Pizza.class);
  87.        returnnewJaxb2MarshallingXmlViewResolver(marshaller);
  88.    }*/
  89.    /*
  90.     * Configure View resolver to provide JSON output using JACKSON library to
  91.     * convert object in JSON format.
  92.     */
  93.    /*  @Bean
  94.    public ViewResolver jsonViewResolver() {
  95.        returnnewJsonViewResolver();
  96.    }*/
  97.    /*
  98.     * Configure View resolver to provide PDF output using lowagie pdf library to
  99.     * generate PDF output for an object content
  100.     */
  101.    @Bean
  102.    public ViewResolver pdfViewResolver() {
  103.        returnnewPdfViewResolver();
  104.    }
  105.    /*
  106.     * Configure View resolver to provide XLS output using Apache POI library to
  107.     * generate XLS output for an object content
  108.     */
  109.    @Bean
  110.    public ViewResolver excelViewResolver() {
  111.        returnnewExcelViewResolver();
  112.    }
  113.    /*
  114.     * Configure View resolver to provide HTML output This is the default format
  115.     * in absence of any type suffix.
  116.     */
  117.    @Bean
  118.    public ViewResolver jspViewResolver() {
  119.        InternalResourceViewResolverviewResolver=newInternalResourceViewResolver();
  120.        viewResolver.setViewClass(JstlView.class);
  121.        viewResolver.setPrefix("/WEB-INF/pages/");
  122.        viewResolver.setSuffix(".jsp");
  123.        return viewResolver;
  124.    }
  125. }


自定义Excel解析器


  1. package com.newcapec.config;
  2. import org.springframework.web.servlet.View;
  3. import org.springframework.web.servlet.ViewResolver;
  4. import java.util.Locale;
  5. publicclassExcelViewResolverimplementsViewResolver {
  6. @Override
  7. public View resolveViewName(String viewName, Locale locale)throws Exception {
  8. ExcelViewview=newExcelView();
  9. return view;
  10.      }
  11. }
  12. package com.newcapec.config;
  13. import org.apache.poi.hssf.usermodel.HSSFRow;
  14. import org.apache.poi.hssf.usermodel.HSSFSheet;
  15. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  16. import org.springframework.web.servlet.view.document.AbstractExcelView;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  19. import java.util.Map;
  20. publicclassExcelViewextendsAbstractExcelView {
  21. @Override
  22. protectedvoidbuildExcelDocument(Map<String, Object> model,
  23. HSSFWorkbook workbook, HttpServletRequest request,
  24. HttpServletResponse response) throws Exception {
  25. RspBaseVOrspBaseVO= (RspBaseVO) model.get("RspBaseVO");
  26. HSSFSheetsheet= workbook.createSheet("返回结果");//创建一页
  27. HSSFRowheader= sheet.createRow(0);//创建第一行
  28. header.createCell(0).setCellValue("返回码");
  29. header.createCell(1).setCellValue("返回信息");
  30. HSSFRowrow= sheet.createRow(1);
  31. row.createCell(0).setCellValue(rspBaseVO.getCode());
  32. row.createCell(1).setCellValue(rspBaseVO.getMsg());
  33. }
  34. }


自定义PDF解析器


  1. package com.newcapec.config;
  2. import org.springframework.web.servlet.View;
  3. import org.springframework.web.servlet.ViewResolver;
  4. import java.util.Locale;
  5. publicclassPdfViewResolverimplementsViewResolver {
  6. @Override
  7. public View resolveViewName(String viewName, Locale locale)throws Exception {
  8. PdfViewview=newPdfView();
  9. return view;
  10.      }
  11. }


  1. package com.newcapec.config;
  2. import com.lowagie.text.Document;
  3. import com.lowagie.text.Element;
  4. import com.lowagie.text.pdf.PdfPTable;
  5. import com.lowagie.text.pdf.PdfWriter;
  6. import org.springframework.web.servlet.view.document.AbstractPdfView;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.awt.*;
  10. import java.util.Map;
  11. publicclassPdfViewextendsAbstractPdfView {
  12. @Override
  13. protectedvoidbuildPdfDocument(Map<String, Object> model,
  14. Document document, PdfWriter writer, HttpServletRequest request,
  15. HttpServletResponse response) throws Exception {
  16. RspBaseVOrspBaseVO= (RspBaseVO) model.get("RspBaseVO");
  17. PdfPTabletable=newPdfPTable(2);
  18. table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
  19. table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);
  20. table.getDefaultCell().setBackgroundColor(Color.lightGray);
  21. table.addCell("返回码");
  22. table.addCell("返回信息");
  23. table.addCell(rspBaseVO.getCode());
  24. table.addCell(rspBaseVO.getMsg());
  25. document.add(table);
  26. }
  27. }


实体

  1. import javax.xml.bind.annotation.XmlRootElement;
  2. /**
  3. * @Title: 返回响应值--基类
  4. * @ClassName:RspBaseVO.java
  5. * @Description:
  6. *
  7. * @Copyright2016-2017 - Powered By 研发中心
  8. * @author: 王延飞
  9. * @date:2018112日 上午07:43:41
  10. * @version V1.0
  11. */
  12. @XmlRootElement
  13. publicclassRspBaseVO {
  14. private String code; // 返回码
  15. private String msg; // 返回信息
  16. // private String data; // 业务参数
  17. public String getCode() {
  18. return code;
  19. }
  20. publicvoidsetCode(String code) {
  21. this.code = code;
  22. }
  23. public String getMsg() {
  24. return msg;
  25. }
  26. publicvoidsetMsg(String msg) {
  27. this.msg = msg;
  28. }
  29. @Override
  30. public String toString() {
  31. return"RspBaseVO [code=" + code + ", msg=" + msg + "]";
  32. }
  33. }


controller

  1. /***
  2. * .json(?type=json) -- 返回JSON
  3.     * .excel(?type=excel) -- 返回Excel
  4.     * .xml(?type=xml) -- 返回XML
  5. *  为空-- 返回JSP
  6. */
  7. @RequestMapping(value="/multiview/{code}/{msg}", method=RequestMethod.GET)
  8. public String multiViewTest(@PathVariable String code,@PathVariable String msg, Model model) {
  9.        RspBaseVOrspBaseVO=newRspBaseVO();
  10.        rspBaseVO.setCode(code);
  11.        rspBaseVO.setMsg(msg);
  12.        model.addAttribute("RspBaseVO",rspBaseVO);
  13. return"/com/test/codeTest";
  14. }


jsp页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <html>
  3. <head>
  4.    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5.    <title>多视图混合输出-状态码</title>
  6. </head>
  7. <body>
  8. code : ${RspBaseVO.code} <br/>
  9. msg : ${RspBaseVO.msg}
  10. </body>
  11. </html>


相关文章
|
5月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
277 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
296 2
|
8月前
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
本文深入探讨了Java大数据技术在智能金融理财产品风险评估与个性化配置中的关键应用。通过高效的数据采集、存储与分析,Java大数据技术助力金融机构实现精准风险评估与个性化推荐,提升投资收益并降低风险。
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
|
8月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
570 0
|
8月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
234 0
|
8月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
345 0
|
8月前
|
人工智能 前端开发 Java
2025年WebStorm高效Java开发全指南:从配置到实战
WebStorm 2025不仅是一款强大的JavaScript IDE,也全面支持Java开发。本文详解其AI辅助编程、Java特性增强及性能优化,并提供环境配置、高效开发技巧与实战案例,助你打造流畅的全栈开发体验。
666 4
|
9月前
|
Java 应用服务中间件 Linux
在Java 12环境中配置和部署Apache Tomcat的步骤。
这段部署Tomcat的冒险旅程充满技术挑战,但同时也像游戏一样充满乐趣。它需要你提前准备,仔细执行,并随时准备解决意外情况。成功后,你就可以在这匹强壮的网络野马上,带着你的Java应用,冲向Web开发的璀璨星空。
267 56