Spring5利用视图解析器生成Excel文件 您所在的位置:网站首页 excel默认的视图类型是什么 Spring5利用视图解析器生成Excel文件

Spring5利用视图解析器生成Excel文件

2024-06-25 13:59| 来源: 网络整理| 查看: 265

介绍

请求处理方法执行完成后,最终返回一个ModelAndView对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个 ModelAndView 对象, 它包含了视图逻辑名和模型对象的信息

Spring MVC 借助视图解析器(ViewResolver)得到最终 的视图对象(View),最终的视图可以是 JSP ,也可能是 Excel、JFreeChart 等各种表现形式的视图。 对于最终究竟采取何种视图对象对模型数据进行渲染,后端控制器并不关心,后端控制器工作重点聚焦在生产模型数据的工 作上,从而实现 MVC 的充分解耦。

1.认识视图

视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。视图对象可以是常见 JSP,还可以是Excel或PDF等形式不一的媒体形式。

为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet 包中定义了一个高度抽象的 View 接口,该接口有两个方法

String getContentType():返回视图的内容

void render(@Nullable Map model, HttpServletRequest request, HttpServletResponse response):将模型数据以某种MIME类型渲染出来

视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们 不会有线程安全的问题

不同类型的视图实现技术对应不同的View实现类,这些视图实现类都位于org.springframeworkd.web.servlet.view包中,具体视图如下

视图类型 简介URL视图资源图InternalResourceView将JSP或其他资源封装成一个视图。被视图解析器InternalResourceViewResolver默认使用。 JstlViewInternalResourceView的子类。如果JSP中使用了JSTL的国际化标签,就需要使用该视图类。文档视图AbstractExcelViewExcel文档视图的抽象类。 AbstractPdfViewPDF文档视图的抽象类报表视图ConfigurableJasperReportsView JasperReportsHtmlView JasperReportsPdfView JasperReportsXlsView常用的JasperReports报表视图JSON视图MappingJackson2JsonView将数据通过Jackson框架的ObjectMapper对象,以JSON方式输出 2视图解析器

视图解析器

SpringMVC为逻辑视图名的解析提供了不同和策略,一个SpringMVC的上下文中可以包含多种解析策略,并指定他们的优先顺序。

每种解析策略对应一个具体的视图解析器实现类。这些视图解析器实现同一个接口,这个接口就是ViewResolver.此接口只有一个方法

View resolveViewName(String viewName, Locale locale)

作用是,根据逻辑视图名和本地对象得到一个视图对象。

Spring的常用视图解析器如下所示

视图解析器类型 简介解析为beanBeanNameViewResolver将视图解析后,映射成一个bean,视图的名字就是bean的id。解析为映射文件InternalResourceViewResolver将视图解析后,映射成一个资源文件。例如将一个视图名为字符串“success.jsp”的视图解析后,映射成一个名为success的JSP文件。 JasperReportsViewResolver将视图解析后,映射成一个报表文件。解析为模板文件FreeMarkerViewResolver将视图解析后,映射成一个FreeMarker模板文件。 VelocityViewResolver将视图解析后,映射成一个Velocity模板文件。 VelocityLayoutViewResolver 

视图解析器举例

InternalResourceViewResolver是JSP最常用的视图解析器,可以通过prefix给响应字符串加上前缀,通过suffix加上后缀。例如我们之前曾在springMVC的配置文件中配置了一个视图解析器InternalResourceViewResolver,如下:

InternalResourceViewResolver默认使用InternalResourceView作为视图实现类。如果JSP文件使用了JSTL的国际化功能,确切地说,当JSP页面使用JSTL的fmt:message时,用户需要使用JstlView替换默认的视图实现类。即、

Excel

如果希望使用Excel展示用户列表 ,则仅需要扩展Spring的AbstractExcelView或AbstractJExcelView即可。实现buildExcelDocument()方法,在方法中使用模型数据对象即可构造Excel文档。AbstractExcelView基于POI,而AbstractJExcelView基于JExcelAPI,下面通过扩展AbstractExcelView宝定义显示用户列表 的Excel视图类;在Spring5中,分别使用了 AbstractXlsxView and AbstractXlsxStreamingView ,取代了之前过时的类;代码如下;

org.apache.poi poi 4.1.0 ​ org.apache.poi poi-ooxml 4.1.0 org.apache.poi poi-ooxml-schemas 4.1.0 /**自定义excel视图**/ package com.oracle.view; ​ import java.net.URLEncoder; import java.util.Date; import java.util.List; import java.util.Map; ​ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; ​ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.web.servlet.view.document.AbstractXlsxView; ​ import com.oracle.vo.Book; /**spring 5后,使用AbstractXlsxView 替代原有的类**/ public class UserListExcelView extends AbstractXlsxView { ​ @Override protected void buildExcelDocument(Map model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { // 自定义文件名称 String excelName = "图书_"+DateUtil.getExcelDate(new Date()) + ".xlsx"; String Agent = request.getHeader("User-Agent"); if (null != Agent) { Agent = Agent.toLowerCase(); System.out.println(Agent); // 针对火狐乱码的处理 if (Agent.indexOf("firefox") != -1) { System.out.println("fireFox"); response.setHeader("content-disposition", String.format("attachment;filename*=utf-8'zh_cn'%s", URLEncoder.encode(excelName, "utf-8"))); } else { System.out.println("other"); response.setHeader("content-disposition", "inline;filename=" + URLEncoder.encode(excelName, "utf-8")); } } response.setContentType("application/ms-excel; charset=UTF-8"); //表单 Sheet sheet = workbook.createSheet("User Detail"); sheet.setDefaultColumnWidth(20); sheet.setHorizontallyCenter(true);   //创建行的头部        Row header = sheet.createRow(0);        header.createCell(0).setCellValue("id");        header.createCell(1).setCellValue("书名");        //单元格        Cell c=header.createCell(2);        c.setCellValue("作者");                @SuppressWarnings("unchecked") List list=(List) model.get("list");        int i=1;        for(Book b:list) {       Row r = sheet.createRow(i++);             r.createCell(0).setCellValue(b.getBookid());             r.createCell(1).setCellValue(b.getName());             r.createCell(2).setCellValue(b.getAuthor());       }       } } ​ /** 控制器 **/ @Controller public class ExcelHandler { @RequestMapping("/excel") public String excel(Map map) { List list=new ArrayList(); list.add(new Book(1,"战争与和平","列夫,托尔斯泰",45)); list.add(new Book(2,"红与黑","斯汤达",45)); list.add(new Book(3,"国富论","亚当,思密",45)); map.put("list", list); //返回指定有视图 return "excel"; } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有