【发布时间】:2013-08-21 15:30:24
【问题描述】:
我们使用 Java 5、Tomcat 5、Xalan 和 JSF 1 构建了一个应用程序,该应用程序使用 XSLT、XML 和 Tomcat 过滤器使用户能够以 Excel 格式导出他们的数据。我们最近升级到 Java 1.7.0_07、Tomcat 7.022 和 JSF 2.1 (jsf-api-2.1.0-b03.jar)。由于所涉及的努力,我们尚未升级到 facelets;我们还是用jsp的。我们使用标签在其自己的弹出窗口中显示 Excel 报告。问题是升级后弹出窗口现在在 IE 中显示原始 xml,而不是直接在 Excel 中打开弹出窗口。原始 xml 可以从浏览器保存到文件中,如果双击保存的文件,它会在 Excel 中正确打开,但最好是用户可以避免这种变通方法。
我认为问题在于 JSF 2 中的响应现在比 JSF 1 更早提交。我们的 web.xml 文件为 Tomcat 定义了以下过滤器:
<filter>
<filter-name>XSLT Processor</filter-name>
<filter-class>com.cs.common.jsf.util.XsltProcessorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSLT Processor</filter-name>
<url-pattern>*.xml</url-pattern>
</filter-mapping>
<filter>
<filter-name>Hibernate Session Manager</filter-name>
<filter-class>com.cs.common.hibernate.HibernateSessionServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Hibernate Session Manager</filter-name>
<url-pattern>*.faces</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Hibernate Session Manager</filter-name>
<url-pattern>*.xml</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
我们的 XsltProcesserFilter 类包含以下几行:
fChain.doFilter(request, wrapper);
response.setContentType("application/vnd.ms-excel");
通过使用sysouts,我确定contentType 没有在JSF 2 下设置,大概是因为响应已经提交。我曾尝试在输出 xml 的 jsp 中设置 contentType,但 JSF 会引发许多错误,所以大概我需要在该过程的稍后部分设置它(如上面的过滤器中)。我在XsltProcessorFilter 中的doFilter 之前尝试过response.setBufferSize(6400000),因为我已经读过这样做可能会延迟提交,但这也不能解决问题。
如何在 faces 完成处理后但在提交之前将contentType 设置为 application/vnd.ms-excel,以便浏览器打开 Excel?
【问题讨论】:
-
进度报告 - 我已经下载了 JSF 源代码并将 sysout 语句放入以本地化更改 ContentType 的位置。然后,在更改之前我捕获现有值,并在更改之后将其设置回来。我现在让 Excel 出现,但格式不正确。我计划继续工作,直到我可以在这里发布答案。