仅当将
web.xml声明为Servlet 3.0并且servlet容器也支持它时,在EL中传递参数才有效(Glassfish 3,JBoss AS
6,Tomcat 7等)。尝试中只有语法错误,这是正确的方法:
<h:commandButton action="#{downloadController.startDownload(garbage.id)}" />您甚至可以传递整个对象,在这种情况下更好。
<h:commandButton action="#{downloadController.startDownload(garbage)}" />然后,该
startDownload()方法应设置响应头,以便Web浏览器了解响应主体表示什么内容类型以及如何处理它,最后将内容写入响应主体。您可以在的帮助下完成所有操作
ExternalContext。这是一个启动示例:
public void startDownload(Garbage garbage) { FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); externalContext.setResponseHeader("Content-Type", garbage.getContentType()); externalContext.setResponseHeader("Content-Length", garbage.getContent().length); externalContext.setResponseHeader("Content-Disposition", "attachment;filename="" + garbage.getFileName() + """); externalContext.getResponseOutputStream().write(garbage.getContent()); facesContext.responseComplete();}最后一行带有
FacesContext#responseComplete()强制性,因此JSF理解它不应导航到某些视图,因此可能在随后的另一个JSF页面中使响应格式错误。



