我们使用 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 下设置 ,大概是因为响应已经提交。我已经尝试contentType
在输出 xml 的 jsp 中设置 ,但是 JSF 会引发很多错误,所以大概我需要在过程的后面设置它(就像上面的过滤器一样)。response.setBufferSize(6400000)
我之前已经尝试过doFilter
,XsltProcessorFilter
因为我已经读过这样做可能会延迟提交,但这也不能解决问题。
如何contentType
在面孔完成处理后但在提交之前将其设置为 application/vnd.ms-excel,以便浏览器打开到 Excel 中?