一旦将库icefaces.jar icepush.jar icefaces_ace.jar添加到我的类路径中以使用ACE组件,我的“另存为”对话框将不会弹出?我不确定这是否是错误,但是在classpath中没有库就可以了。这是我的另存为方法:
public void downloadFile(String propertyPath) throws IOException { ProxyFile fileToDownload = repBean.downloadFile(propertyPath); FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); response.reset(); response.setContentType(fileToDownload.getContentType()); response.setHeader("Content-Length", String.valueOf(fileToDownload.getLength())); response.setHeader("Content-disposition", "attachment; filename=\"" + fileToDownload.getName() + "\""); BufferedInputStream input = null; BufferedOutputStream output = null; try { input = new BufferedInputStream(fileToDownload.getContent()); output = new BufferedOutputStream(response.getOutputStream()); byte[] buffer = new byte[10240]; for (int length; (length = input.read(buffer)) > 0;) { output.write(buffer, 0, length); } } finally { output.close(); input.close(); facesContext.responseComplete(); } }
您不能使用ajax下载文件。
Ajax在JavaScript XMLHttpRequest对象执行的幕后。该请求将被成功执行,并且响应将被成功检索。但是,JavaScript无法将响应写到客户端的磁盘文件系统,也不能对给定的响应进行“ 另存为” 对话框。那将是一个巨大的安全漏洞。
XMLHttpRequest
您的具体问题的原因是ICEfaces本身。即,当您将ICEfaces集成到JSF Web应用程序中时,所有标准<h:commandXxx>链接/按钮都将默默地转换为启用了Ajax的链接/按钮,这确实在启动程序之间引起混淆。确保未使用ICEfaces引入的ajax工具隐式下载链接/按钮。按照他们在主题上的Wiki页面,您需要显式嵌套a <f:ajax disabled="true">来禁用此功能。
<h:commandXxx>
<f:ajax disabled="true">
禁用组件的Ajax 您还可以在单个组件级别禁用Ajax: <h:commandButton value="Send" actionListener="#{bean.sendMessage}"> <f:ajax disabled="true"/> </h:commandButton>
您还可以在单个组件级别禁用Ajax:
<h:commandButton value="Send" actionListener="#{bean.sendMessage}"> <f:ajax disabled="true"/> </h:commandButton>
将其应用于您的下载链接/按钮。