最近一个重构的系统上线后客户发现无法使用IE6下载报表,具体为能弹出“另存为”对话框,但没有显示报表名称,点击保存后报错,无法下载。但是在我的WIN7笔记本上使用IE9和Firefox均能正常下载,使用同事的WIN7下的搜狗浏览器也可以正确下载。由于我将项目的Spring版本从3.0.5.RELEASE升级到了3.1.0.RC1,所以一度以为是由于Spring框架内部的问题,但是在对比的新旧代码后发现问题不在这,新版本的代码中多了一个检测session超时的拦截器,其中有段关键代码:
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", -1);
为什么要这样写参见我的这篇博文。
先简单说一下我们的报表导出原理,我们采用在Excel上画好模版,另存为“xml模版”,然后将xml的内容复制到jsp文件内,添加jstl支持使jsp文件动态化,用户访问一个url时,control端处理完毕后执行
response.setHeader("Content-Disposition", "attachment; filename=测试报表.xls");
使用户浏览器弹出一个另存为对话框,保存后就将这个jsp文件变成了后缀名为xls的excel文件(其实本质还是一个文本文件)。
回到导出报表上,通过jmeter工具发送url请求后的取样器结果中包含这样一段:
Thread Name: 线程组 1-1
Sample Start: 2011-10-26 13:38:23 CST
Load time: 5253
Latency: 31
Size in bytes: 12414200
Sample Count: 1
Error Count: 0
Response code: 200
Response message: OK
Response headers:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Content-Disposition: attachement; filename=excel.xls
Content-Language: zh-CN
Content-Type: application/vnd.ms-excel;charset=gb2312
Set-Cookie: JSESSIONID=e1uhcjpgko27zheg3bfajw6y;Path=/lmkweb
Transfer-Encoding: chunked
Server: Jetty(7.2.0.v20101020)
HTTPSampleResult fields:
ContentType: application/vnd.ms-excel;charset=gb2312
DataEncoding: gb2312
去掉拦截器的no-cache这段代码后,在IE6中就能正确下载了,所以初步认为是response的header中的Cache-Control和Content-Disposition冲突了(IE6,IE7等等),但是底层细节不甚明了(WIN7的IE9和Firefox没有问题)。
另:在写测试代码时发现一个以前就想知道原因的现象,即如果这个报表文件非常小,IE的另存为对话框弹出后会显示字节数,而如果非常大,等一会儿弹出的对话框不显示字节数,在下载的过程中会显示下载了多少,下载速度等等。
这次在测试的jsp文件中加入了
<%
for (int i = 0; i < 10000; i++) {
System.out.println("[" + i + "]");
%>
...
<%
}
%>
在浏览器中测试发现,在控制台打印到70左右时便不再输出了,而页面就弹出另存为对话框,点击保存后,控制台又开始打印。而在jmeter测试中不存在这种暂停。所以初步认为浏览器保存jsp文件时应该有一种缓存机制,非常有意思。
分享到:
相关推荐
, 在精通Spring MVC4中,我们将会从头开始构建一个有用的Web应用。本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring ...通过在项目的 `pom.xml` 或 `build.gradle` 文件中配置相关依赖,可以自动下载并管理这些 jar 包,使得项目结构更清晰,也便于团队协作和版本控制。
在Spring MVC项目中,Oracle将作为存储数据的后端,MyBatis通过JDBC接口与Oracle进行通信,执行CRUD(创建、读取、更新、删除)操作。 4. **项目结构** 通常,一个Spring MVC项目会包含以下主要部分: - `src/...
在Spring MVC项目中,我们通常会通过Ajax请求从后台获取数据,然后使用JqGrid的JSON或CSV数据源来渲染表格。JqGrid的配置灵活,可以定制列模型、工具栏、行事件等,满足各种需求。 现在,我们转向JqGrid的导出功能...
这个【IDEA Spring MVC项目】已经配置好了基本的框架,你可以直接下载并导入IDEA,然后在此基础上添加自己的业务逻辑和视图设计。这对于初学者来说是一个很好的学习起点,也可以帮助有经验的开发者快速启动新的项目...
Spring MVC 是一个基于Java的轻量...通过深入研究这个Spring MVC demo,你将能掌握基本的Spring MVC工作流程,为后续更复杂的Web应用开发打下坚实基础。记得动手实践,理论结合实际,才能更好地理解和运用这些知识点。
这个"最全最经典spring-mvc教程"应该会详细讲解上述所有概念,并可能通过实例演示如何配置、创建和调试Spring MVC项目。对于想要深入理解和使用Spring MVC的开发者来说,这是一份非常宝贵的资源。通过学习这个教程,...
在Spring MVC Web应用程序中集成Jasper报表工具是一个常见的需求,以提供动态生成和展示各种复杂数据的报表。JasperReports是一款强大的开源报表库,能够帮助开发者创建、设计和展示多种格式的报表,如PDF、HTML、...
在实际开发中,我们可以通过Maven或Gradle等构建工具将Spring MVC 4.2.3依赖引入项目。同时,使用IDE如IntelliJ IDEA或Eclipse,可以享受到代码提示和自动完成等便利功能。此外,配合Spring Boot,可以进一步简化...
在“spring MVC 导出excel”这个主题中,我们将深入探讨如何利用Spring MVC框架来实现Excel文件的导出功能,这对于数据展示和分析非常有用。 在实际应用中,我们可能需要将数据库中的大量数据导出到Excel文件,以便...
Spring MVC、Spring 和 Maven 是Java开发中非常重要的三个框架,它们在构建现代企业级Web应用程序中扮演着核心角色。这个"spring mvc+spring+maven框架项目"提供了一个纯净的基础,便于开发者快速搭建和理解这三者...
在IT行业中,Spring MVC是Spring框架的一个重要模块,主要用于构建Web应用程序。Eclipse是一款流行的Java集成开发环境(IDE),而Maven则是一个项目管理和综合工具,用于自动化构建、依赖管理和项目信息管理。本教程...
通过阅读"Spring MVC 文件上传下载 后端 - Java.doc"文档,你可以深入理解如何在实际项目中实现这些功能,包括具体的代码示例、配置细节和最佳实践。这份文档可能会涵盖以上所有知识点,帮助开发者更好地掌握Spring ...
通过深入理解并实践该项目,开发者不仅能掌握Spring MVC的核心概念,还能提升在实际项目中的应用能力。在不断迭代更新的Spring世界中,理解老版本的机制也有助于理解新版本的进化历程,从而更好地适应技术的发展。
9. **Maven或者Gradle构建**:项目可能使用Maven或Gradle进行依赖管理和构建,了解如何在pom.xml或build.gradle中添加和管理Spring MVC和Hibernate的依赖。 10. **单元测试和集成测试**:学习如何使用JUnit和...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 ...通过阅读和实践项目中的代码,你可以深入理解 Spring MVC 的核心概念和工作流程,为后续的 Web 开发打下坚实的基础。
在Spring MVC 4.0版本中,它引入了许多改进和新特性,以提升开发效率和应用程序的性能。 1. **依赖注入**:Spring MVC 4.0继续支持Spring框架的核心功能,依赖注入(DI),允许开发者通过配置来管理对象及其依赖...
在本压缩包中包含了一系列与Spring MVC相关的jar文件,这些文件是构建和运行Spring MVC项目所必需的依赖。 首先,`hibernate3.jar` 是Hibernate ORM框架的库,它允许开发者将Java对象映射到关系数据库,提供了数据...