当前位置: 首页 > 面试题库 >

从JSF应用程序的任何Web浏览器中强制进行另存为对话框

郑曜灿
2023-03-14
问题内容

我已经创建了一个JSF应用程序,我想在页面中嵌入一个链接,单击该链接会导致支持bean编排一些xml,并强制打开“另存为下载”对话框,以便用户可以选择要保存的位置。保存文件。我已经编写了JAXB代码。

怎么做?

谢谢


问题答案:

将HTTP Content-Disposition标头设置为attachment。这将弹出一个 另存为
对话框。您可以使用进行操作HttpServletResponse#setHeader()。您可以通过JSF幕后获得HTTP
servlet响应ExternalContext#getResponse()

在JSF上下文中,只需要确保FacesContext#responseComplete()稍后再调用即可避免IllegalStateExceptions飞散。

开球示例:

public void download() throws IOException {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

    response.reset(); // Some JSF component library or some Filter might have set some headers in the buffer beforehand. We want to get rid of them, else it may collide.
    response.setContentType("application/xml"); // Check http://www.iana.org/assignments/media-types for all types. Use if necessary ServletContext#getMimeType() for auto-detection based on filename.
    response.setHeader("Content-disposition", "attachment; filename=\"name.xml\""); // The Save As popup magic is done here. You can give it any filename you want, this only won't work in MSIE, it will use current request URL as filename instead.

    BufferedInputStream input = null;
    BufferedOutputStream output = null;

    try {
        input = new BufferedInputStream(getYourXmlAsInputStream());
        output = new BufferedOutputStream(response.getOutputStream());

        byte[] buffer = new byte[10240];
        for (int length; (length = input.read(buffer)) > 0;) {
            output.write(buffer, 0, length);
        }
    } finally {
        close(output);
        close(input);
    }

    facesContext.responseComplete(); // Important! Else JSF will attempt to render the response which obviously will fail since it's already written with a file and closed.
}


 类似资料:
  • 问题内容: 背景 我正在为两个公益网站编写和使用一个非常简单的基于CGI的(Perl)内容管理工具。它为网站管理员提供事件的HTML表单,这些表单将填写字段(日期,位置,标题,描述,链接等)并保存。在该表格上,我允许管理员上传与事件相关的图像。在显示表单的HTML页面上,我还显示了上传图片的预览(HTML img标签)。 问题 当管理员想要更改图片时,会发生此问题。他只需要点击“浏览”按钮,选择一

  • 问题内容: 是否可以通过单击链接来强制具有JavaScript例程的浏览器将文件另存为(“另存为”)?我需要默认情况下直接下载图片,而不是通过浏览器渲染图片。 问题答案: 您可以使用HTML5下载属性,如下所示: 无论文件类型如何,这都会打开一个“另存为”对话框,而无需您离开页面。

  • 问题内容: 有什么办法可以在页面上放置一些代码,以便当有人访问网站时,它会清除浏览器缓存,以便他们可以查看更改? 使用的语言:ASP.NET,VB.NET,当然还有HTML,CSS和jQuery。 问题答案: 如果这是关于和变化,一种方法是到“缓存无效”是通过附加像“ ”为每个版本的文件名。例如: 或者,在文件名之后执行此操作:

  • 问题内容: 这些天,我的应用程序一直在变化,因为我们的团队现在正在运行快速更新。 由于缓存,我们的客户并不总是拥有最新版本的代码。 那么有没有办法强制浏览器清除缓存? 问题答案: 您可以使用一种非常简单的解决方案,其中包括将哈希值附加到脚本文件中。每次部署App时,您都会通过gulp /grunt任务自动为文件提供不同的哈希值。例如,您可以使用gulp-rev。我在所有项目中都使用了这种技术,并且

  • 我可以强制浏览器缓存WPS 6.1响应的页面吗? 强制浏览器缓存页面是满足要求的一种方式吗? 我尝试创建一个过滤器并在wps中配置它。 它正在工作,但HTTP标头仍然是: 缓存控制无缓存 内容语言en US 内容类型文本/html;charset=UTF-8 日期2012年5月11日星期五07:50:19 GMT 到期时间1970年1月1日星期四00:00:00 GMT IBM-Web2-Loca

  • 我做了一个jsf应用程序。这个应用程序有一个包含开始、停止按钮的菜单。当按下开始时,应用程序开始从网站获取数据,并更新其数据库。应用程序还有更新过程的进度条。但是,这个过程需要很长时间才能完成。我希望当我关闭浏览器时,它应该继续更新数据库。此外,当我再次打开它时,我应该得到以前的状态。然而,这并没有发生。当我关闭浏览器时,应用程序也关闭了。我该怎么办? 谢谢。