`
Josh_Persistence
  • 浏览: 1653606 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Spring3.X @MVC - (八)Spring MVC创建并导出Excel和PDF视图

阅读更多

前言:

一、总共有10节,也就是10篇博客来讲述Spring的MVC,几乎涵盖了所有Spring MVC中的内容。

 

二、我创建的例子是一个球场预订系统,例子我已经测试调试通过,是一个Maven的project,包含一个Parent project:wsheng-spring-base和一个子Module:wsheng-spring-mvc.

 

三、在Eclipse中直接import maven的project即可,会同时引入上诉两个project的。

 

四、如果你没有耐心,可以不必往下学习,因为网上有很多例子,但是都是讲的Spring MVC很少的面,而且你可以快速的上手,但如果你想真正了解Spring MVC中的很多细节,就可以慢慢的去看博客(从第一节到第十节),如果有什么问题,欢迎信息告诉我。

 

五、学习的方法是你可以先将源码导入到eclipse中,然后根据博客上的内容,对照源码,慢慢消化,这是个漫长的过程,但是会帮助你了解很多Spring MVC的细节。

 

===================================================================================

 

 

在Spring3.X @MVC - (七)Spring中强大的内容协商视图解析器的基础上,

http://josh-persistence.iteye.com/blog/1884206

来学习怎样在Spring中创建和导出Excel和PDF的视图。

 

1. 问题:

    尽管HTML是显示Web内容最常见的方法,但是有时候你的用户希望从Web应用中导出Excel或者PDF格式的内容。在java中,有许多的的程序库有助于生成Excel和PDF文件。但是,为了在Web应用中直接使用这些程序库,你必须在后台生成这些文件,然后将它们作为二进制返回给用户。为此你必须处理HTTP的响应头标和输出流。

 

2.解决方案:

     Spring将Excel和PDF文件的生成集成到MVC框架中。你可以将Excel和PDF文件看作特殊类型的视图,因此你就可以在控制器中一致性地处理web请求,并将数据添加到一个传递给Excel和PDF视图的模式中。这样,你就没有必要再去考虑处理复杂的HTTP响应头标和输出流了。

     Spring MVC支持使用Apache POI程序库(http://poi.apache.org)或者JExcel API程序库(http://jexcelapi.sourceforge.net)生成Excel文件。对应的视图类分别是AbstractExceView和AbstractJExcelView。PDF文件由IText程序库(http://www.lowagie.com/iText/)生成,对应的视图类是AbstractPdfView类。

 

3. 工作原理:

    假定你的用户希望生成特定日期的预定摘要报告。他们希望这个报告可以以Excel、PDF或者基本的HTML格式生成。为了这个报告的生成功能,你可以在service层定义一个方法,返回具体日期的所有预定:

public interface ReservationService {

    public List<Reservation> findByDate(Date date);

}

 

然后为这个方法提供一个简单的实现,枚举所有的预定:

public class ReservationServiceImpl implements ReservationService {

 public List<Reservation> findByDate(Date date) {

        List<Reservation> result = new ArrayList<Reservation>();

        for (Reservation reservation : reservations) {

            if (reservation.getDate().equals(date)) {

                result.add(reservation);

            }

        }

        return result;

 }

 

       接下来我们可以编写一个简单的控制器,该控制器会从URL请求中获取date,然后将date格式化为一个日期对象并且传递给服务层查询预订。控制器依赖上一节中所讲的内容协商视图解析器,因此控制器会返回一个逻辑视图,然后由解析器决定生成Excel, PDF,还是默认的HTML网页。

package com.wsheng.spring.web;

 

...

 

@Controller

@RequestMapping("/reservationSummary*")

public class ReservationSummaryController {

 

    private ReservationService reservationService;

 

    @Autowired

    public ReservationSummaryController(ReservationService reservationService) {

        this.reservationService = reservationService;

    }

 

    @RequestMapping(method = RequestMethod.GET)

public String generateSummary(

  @RequestParam(required = true, value = "date") String selectedDate, Model model) { 

 

List<Reservation> reservations = java.util.Collections.emptyList();

// Format date

try { 

   Date summaryDate = new SimpleDateFormat("yyyy-MM-dd").parse(selectedDate);

   reservations = reservationService.findByDate(summaryDate);

   // Catch error if request parameter date is not in format

} catch (java.text.ParseException ex) { 

   StringWriter sw = new StringWriter();

   PrintWriter pw = new PrintWriter(sw);

   ex.printStackTrace(pw); 

   throw new ReservationWebException("Invalid date format for reservation summary",new Date(),sw.toString());

}

model.addAttribute("reservations",reservations);

return "reservationSummary";

    }

}

  你可能注意到了,尽管我们设计该控制器的初衷是需要支持PDF,XLS和HTML视图,但是代码中只返回单一的视图(return "reservationSummary"),这是由ContentNegotiatingViewResolver解析器根据这个视图的名称确定使用哪一个视图。更多关于这个解析器的信息,你可以参照我的上一节博客:http://josh-persistence.iteye.com/blog/1884206

        

           创建Excel视图

Excel视图可以通过扩展AbstractExcelView(对于Apache POI)或者AbstractJExcelView(对于JExcel API)来创建。这里以POI及AbstractExcelView为例,在buildExcelDocument()方法中,你可以访问到Sping MVC控制器传递过来的模式Model和一个预先创建好的Excel工作薄,然后你所需要写的代码就是用模式中的数据来填充这个工作薄。在Maven中引入poi的dependency:

      <dependency>

         <groupId>org.apache.poi</groupId>

         <artifactId>poi</artifactId>

         <version>3.0.2-FINAL</version>

       </dependency>

 

package com.wsheng.spring.web.view;

...

public class ExcelReservationSummary extends AbstractExcelView {

protected void buildExcelDocument(Map model, HSSFWorkbook workbook,

            HttpServletRequest request, HttpServletResponse response)

            throws Exception {

List<Reservation> reservations = (List) model.get("reservations");

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        HSSFSheet sheet = workbook.createSheet();

 

        HSSFRow header = sheet.createRow(0);

        header.createCell((short) 0).setCellValue("Court Name");

        header.createCell((short) 1).setCellValue("Date");

        header.createCell((short) 2).setCellValue("Hour");

        header.createCell((short) 3).setCellValue("Player Name");

        header.createCell((short) 4).setCellValue("Player Phone");

 

        int rowNum = 1;

        for (Reservation reservation : reservations) {

            HSSFRow row = sheet.createRow(rowNum++);

            row.createCell((short) 0).setCellValue(reservation.getCourtName());

            row.createCell((short) 1).setCellValue(

                    dateFormat.format(reservation.getDate()));

            row.createCell((short) 2).setCellValue(reservation.getHour());

            row.createCell((short) 3).setCellValue(

                    reservation.getPlayer().getName());

            row.createCell((short) 4).setCellValue(

                    reservation.getPlayer().getPhone());

        }

    }

}

        因为我们前面在控制器中配置了@RequestMapping("/reservationSummary*"),URL请求中需要一个required的参数,date,所以可以这样访问Excel视图:

http://localhost:8088/wsheng-spring-mvc/reservationSummary.xls?date=2013-06-21 可以下载或直接打开相关的excel,里面应该有2条值。

http://localhost:8088/wsheng-spring-mvc/reservationSummary.xls?date=20130621 可以看到页面上显示相应的异常信息。

http://localhost:8088/wsheng-spring-mvc/reservationSummary.xls?date=2013-07-21可以下载或直接打开相关的excel,里面没有header信息,没有值。

 

          创建PDF视图

PDF视图通过扩展AbstractPdfView类来创建。在buildPdfDocument()方法中,你可以访问控制器传递过来的模式Model和一个预先创建的PDF文档。然后将模式中的数据填充到该PDF文档中。添加itext的dependency

     <dependency>

         <groupId>com.lowagie</groupId>

         <artifactId>itext</artifactId>

         <version>2.0.8</version>

      </dependency>

 

package com.wsheng.spring.web.view;

...

 

public class PdfReservationSummary extends AbstractPdfView {

 

    protected void buildPdfDocument(Map model, Document document,

            PdfWriter writer, HttpServletRequest request,

            HttpServletResponse response) throws Exception {

        List<Reservation> reservations = 

   (List<Reservation>) model.get("reservations");

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        Table table = new Table(5);

 

        table.addCell("Court Name");

        table.addCell("Date");

        table.addCell("Hour");

        table.addCell("Player Name");

        table.addCell("Player Phone");

 

if (!reservations.isEmpty()) { 

   for (Reservation reservation : reservations) {

table.addCell(reservation.getCourtName());

table.addCell(dateFormat.format(reservation.getDate()));

table.addCell(Integer.toString(reservation.getHour()));

table.addCell(reservation.getPlayer().getName());

table.addCell(reservation.getPlayer().getPhone());

   }

}

 

        document.add(table);

    }

}

 

因为我们前面在控制器中配置了@RequestMapping("/reservationSummary*"),URL请求中需要一个required的参数,date,所以可以这样访问PDF视图:

http://localhost:8088/wsheng-spring-mvc/reservationSummary.pdf?date=2013-06-21

 

       为Excel和PDF视图创建视图解析器

 在前面几篇博客中,我们知道了"根据名称解析视图”,知道了怎样将MVC控制器中返回的逻辑视图名称解析为具体视图的不同的策略。这里我们选择用资源集(properties)文件的方式,即将对PDF和XLS类别的视图的映射的配置放在properties中。

        1. 在Web应用上下文中(court-servlet.xml)中配置ResourceBundleViewResolver bean作为视图解析器。

        2. 确保在Web应用的classpath根目录下有views.properties和secondaryviews.properties.

         在views.properties中包含:

                reservationSummary.(class)=com.wsheng.spring.web.view.ExcelReservationSummary

         在secondaryviews.properties中包含:

                reservationSummary.(class)=com.wsheng.spring.web.view.PdfReservationSummary

在控制器中返回的逻辑视图名称是reservationSummary。ContentNegotiatingViewResolver解析器的任务是根据用户的请求确定使用哪一个各类。一旦确定了这一点,执行对应的类生成PDF或者XLS文件。

 

此时你可能已经发现无论是你使用http://localhost:8088/wsheng-spring-mvc/reservationSummary.xls?date=2013-06-21

或者使用http://localhost:8088/wsheng-spring-mvc/reservationSummary.pdf?date=2013-06-21

此时浏览器提示的都是保存或者打开reservationSummary.pdf或者reservationSummary.xls?这种命名习惯是基于用户请求资源的URL的。但是,我们还在URL中提供了日期的信息,如果能自动保存为reservationSummary_2013_06_21.xls或者reservationSummary_2013_06_21.pdf,就是一个很好的功能。为了实现这个功能,我们可以通过一个拦截器来重写返回的URL。

public class ExtensionInterceptor extends HandlerInterceptorAdapter {

 

    public void postHandle(HttpServletRequest request,

            HttpServletResponse response, Object handler,

  //Model model) throws Exception {

  ModelAndView modelAndView) throws Exception {

    // Report date is present in request

String reportName = null;

String reportDate = request.getQueryString().replace("date=","").replace("-","_");

if (request.getServletPath().endsWith(".pdf")) { 

   reportName= "ReservationSummary_" + reportDate + ".pdf";

}

if (request.getServletPath().endsWith(".xls")) { 

   reportName= "ReservationSummary_" + reportDate + ".xls";

}

// ONLY if its a PDF or XLS extension rewrite response URL 

// If reportName name was modified, its PDF or XLS

if (reportName != null) { 

   // Set "Content-Disposition" HTTP Header so a user gets a pretty 'Save as' address

   response.setHeader("Content-Disposition","attachment; filename="+reportName);

}

    }

}

                 1. request.getQueryString()返回的是请求url中”?“后面的内容。

                 2. request.getServletPath()返回的是请求url中"?"前面的内容。

                 3. 为了确保用户接收到下载提示,用相应的文件名的名称的格式(pdf/xls)来设置Content-Disposition HTTP头标。

       在web上下文中,配置该Interceptor,order为0即优先级最高,当url请求中有reservationSummary的时候,由该interceptor处理。

<bean id="publicMapper" class="org.springplugins.web.SelectedAnnotationHandlerMapping">

        <property name="order" value="0" />

<property name="urls">

<list>

             <value>/reservationSummary*</value>

</list>

</property>

<property name="interceptors">

<list>

     <ref bean="summaryReportInterceptor" />

</list>

</property>

 

    </bean>

 

 

                总结: 尽管这个应用中使用了ContentNegotiatingViewResolver解析器选择合适的视图,但是修改返回URL的过程超出了视图解析器的范围。因此,有必要使用拦截器人工检查请求扩展名,并且设置必要的HTTP头标,修改输出的URL。

3
1
分享到:
评论
1 楼 kgm000 2014-07-02  
wsheng-springplugins.jar在哪里

相关推荐

    Spring 3.x企业应用开发实战.pdf

    6. **MVC框架**:Spring MVC是Spring提供的Web应用开发模块,提供了模型-视图-控制器架构,支持RESTful风格的URL设计,以及视图解析、数据绑定等功能。 7. **数据访问**:Spring支持JDBC模板、Hibernate、MyBatis等...

    Easyui.+.Spring.Mvc导出Excel

    "Easyui Spring Mvc导出Excel"是一个常见的话题,它涉及了三个关键技术:Easyui、Spring MVC以及Excel导出。 Easyui是一个基于jQuery的UI框架,提供了一系列美观且易于使用的组件,如表格、下拉框、对话框等。在Web...

    easypoi导入导出excel表格.pdf

    - **easypoi-web**: 这个包提供了与Spring MVC整合的视图工具,简化了在Spring Web环境下进行导出的操作,但非必须。 这里建议不要引入`spring-boot-starter-web`,因为`easypoi-web`已经提供了必要的Spring MVC...

    Spring3 MVC + POI 实现 Excel与MySQL 的导入导出

    Spring3 MVC是Spring框架的一个组件,专门用于构建Web应用程序,它提供了模型-视图-控制器(MVC)的架构模式,简化了Java Web开发。在Spring MVC中,我们可以定义控制器、服务层、模型对象以及视图,以实现业务逻辑...

    Jett+Spring MVC实现Excel导出

    在本文中,我们将深入探讨如何使用Jett和Spring MVC框架来实现Excel文件的导出功能。Jett是一个轻量级的Java库,专门用于处理Excel数据的读取和写入,而Spring MVC则是广泛应用于构建Web应用的MVC(Model-View-...

    spring mvc easyui-POI导出excel封装源码

    这里我们将深入探讨这些技术,并结合标题和描述,重点讲述如何使用Spring MVC和EasyUI结合POI库来实现Excel数据导出功能。 首先,Spring MVC是Spring框架的一部分,它是一个用于构建Web应用程序的模型-视图-控制器...

    Spring MVC 学习笔记 十二 PDF/Excel格式输出

    对于PDF和Excel格式的输出,Spring MVC可以通过Apache POI库来处理Excel,使用Flying Saucer或iText库来生成PDF。这些库能够将HTML内容转换为所需的格式,方便导出和下载。 总的来说,Spring MVC是Spring框架的重要...

    spring3.x企业应用附件

    每个章节的代码实例都对应着上述某个或多个知识点,通过实际操作和调试,开发者可以更好地理解并掌握Spring 3.x框架的精髓。例如,chapter6可能涉及了AOP的实现,chapter12可能讲解了Spring与Hibernate的集成,而...

    spring-framework-5.1.x.zip

    - **Spring MVC**:用于构建Web应用的模型-视图-控制器框架,提供强大的数据绑定和验证功能。 - **Spring Boot**:简化Spring应用的初始化和配置,快速构建可运行的应用程序。 - **Spring Data**:简化数据访问,...

    spring mvc excel common view

    标题“spring mvc excel common view”涉及的是Spring MVC框架中处理Excel导出的常见视图技术。在Web应用中,经常需要将数据导出为Excel格式供用户下载,Spring MVC提供了一种优雅的方式实现这一功能。 Spring MVC...

    spring-mvc-jasperReports

    Spring MVC提供了一个分层架构,包括模型、视图和控制器(MVC)组件,使开发者能够轻松地创建企业级的Web应用。它通过依赖注入(DI)和面向切面编程(AOP)来支持松散耦合和可测试性。在Spring MVC中,控制器接收...

    struts2+hibernate+spring+jfreechart+导出excel+导出pdf完美整合.zip

    首先,Struts2 是一个基于MVC(模型-视图-控制器)设计模式的Web应用框架,它提供了一种组织应用程序代码的方式,使得开发者能够更有效地控制请求处理和页面渲染。Struts2 提供了拦截器、动作类、结果类型等机制,...

    Jxls+Spring MVC实现Excel导出

    "Jxls+Spring MVC实现Excel导出"的主题聚焦于如何利用Jxls库和Spring MVC框架来实现这一功能。Jxls是一个强大的Java库,它扩展了Apache POI,使得在Excel模板上进行编程变得简单,而Spring MVC是Spring框架的一部分...

    spring_2.5_web.zip

    在Spring Web应用中,可能用于处理Excel或Word文档的生成和解析,例如生成报表或者导入导出数据。 3. **jasperreports-2.0.5.jar**: JasperReports是一个开源的报表引擎,可以生成PDF、HTML、XLS、CSV等多种格式的...

    Spring3MVC and POI

    Spring 3 MVC是Spring框架的一个模块,专门用于构建模型-视图-控制器(MVC)架构的Web应用。它提供了一个分层的系统架构,帮助开发者将业务逻辑、数据访问和用户界面解耦。Spring MVC的核心组件包括...

    struts,hibernate,spring,jfreechart,导出excel,导出pdf 完美整合

    Struts、Hibernate、Spring、JFreeChart以及Excel和PDF导出是Java开发中常见的技术,它们在企业级应用开发中有着广泛的应用。这些技术的整合能够构建出功能强大的Web应用程序,提供数据展示、数据处理以及文件导出等...

    CrapApi.V4-2016-8-13

    3. **SpringMVC**:SpringMVC是Spring框架的一部分,是一个基于Model-View-Controller(MVC)设计模式的Web应用框架。它简化了Java Web开发,提供依赖注入、数据验证、本地化等功能。在CrapApi.V4中,SpringMVC作为...

    在eclipse中不使用maven创建springboot工程所需jar包

    它提供了模型-视图-控制器(MVC)模式,使得构建Web应用程序更加灵活和模块化。 7. **spring-boot-starter-web-1.4.3.RELEASE.jar**:Spring Boot的起步依赖,包含了创建一个基于Servlet的Web应用程序所需的基本...

    一个简单的spring mvc实例.docx

    它提供了一个模型-视图-控制器(MVC)架构,帮助开发者将业务逻辑、数据处理和用户界面分离,使得应用更易于管理和扩展。 在Spring MVC中,当用户向服务器发送一个请求,例如 `http://localhost:8080/hello.do`,...

    OSGI整合Spring、Mybatis、Spring MVC实现一个登录应用案例

    总的来说,这个案例展示了OSGI的模块化优势,以及如何将Spring、Mybatis和Spring MVC集成到OSGI环境中,构建一个可维护、可扩展的登录应用。通过实践这样的案例,开发者可以更好地掌握这些技术在企业级开发中的应用...

Global site tag (gtag.js) - Google Analytics