日期:2014-05-16 浏览次数:20836 次
? 上一篇我们介绍了如何制作复杂报表的分析和设计,本篇结合Spring MVC框架来说一下如何在Web层使用POI组件来动态生成报表供用户查看或下载。为什么选择Spring MVC框架,理由很简单,因为Spring的MVC框架对Excel视图的扩展使用的正是POI组件,那么使用Spring来整合就非常方便了,当然其它的框架都有自己的处理办法,这个可以具体咨询其对视图扩展支持的配置方法。
??? 使用Spring对Excel的支持,需要扩展MVC的视图组件,就是要创建一个自定义的View,这个在后面会详细介绍,通过这个view,就可以将Excel报表展现出来了,非常方便。
??? 基于Spring MVC的程序,那么首先要构建起来Spring MVC的环境,这个很简单,下面我们来看看如何搭建Spring MVC环境。我们使用Spring 3.0.5的库,但是配置方式不用注解,用传统的配置方式来说明。
??? 使用Maven管理项目,引入必要的依赖,如下:
??? 在web.xml描述符中,首先配置Spring配置文件的路径:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:org/ourpioneer/spring/*.xml,classpath:org/ourpioneer/spring/*/*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
??? 其次配置一个字符过滤器,使用Spring提供的就好,这样就不用过多考虑字符编码的问题了:
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
?最后是Spring MVC的ServletDispatcher配置了:
<servlet> <servlet-name>board</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/Dispatcher-Servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>board</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
?我们配置了一个初始化文件,在Servlet加载时会加载这个配置文件,并使用*.do风格的映射地址。在这个初始配置文件中,主要配置了映射和拦截器等信息。内容如下:
<!-- 扩展命名拦截器 --> <bean id="extensionInterceptor" class="org.ourpioneer.excel.web.interceptor.ExtensionInterceptor"></bean> <!-- 控制器映射 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="extensionInterceptor" /> </list> </property> <property name="mappings"> <props> <prop key="/excel.do">ExcelController</prop> </props> </property> </bean>
?? 其中扩展名拦截器是对生成Excel文件后的扩展名进行处理的,这个后面会说,下面就是配置映射,这里我们只有一个测试,那么就写一个映射即可,最后使用这个地址来测试,配置好映射信息后,那么就要配置其中的每个映射,那么来看看ExcelController的配置:
package org.ourpioneer.excel.web.controller; import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.ourpioneer.excel.bean.CruiseServiceLocation; import org.ourpioneer.excel.service.ReportService; import org.ourpioneer.excel.web.views.ReportView; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; /** * Excel处理控制器 * * @author Nanlei * */ public class ExcelController extends AbstractController { private ReportView reportView; private ReportService reportService; public void setReportView(ReportView reportView) { this.reportView = reportView; } public void setReportService(ReportService reportService) { this.reportService = reportService; } @Over