我需要下载存储在数据库中的文件。我认为我正确地执行了查询并称之为查询,但我不知道如何将其连接到JSF页面中的按钮。我也想知道,在将图像传递到JSF页面之前,是否必须将该图像保存在服务器的文件夹中。如果是这样,我该怎么做?
这是我用来从db返回byte []的查询:
@NamedQuery(name = "downloadGarbage", query = "SELECT g.file FROM Garbage g WHERE g.id :idParam")
@Entity
public class Garbage implements Serializable {
@Lob
@Column(nullable = false)
private byte[] file;
....
这是一个简单的EJB,它调用该查询然后获取ID:
@Stateless(name = "ejbs/FileDownloaderEJB")
public class FileDownloaderEJB implements IFileDownloaderEJB {
@PersistenceContext
private EntityManager em;
public byte[] downloadGarbage(Long id) {
Query query = em.createNamedQuery("downloadGarbage");
query.setParameter("idParam", id);
Object o = query.getSingleResult();
byte[] tmpArray = (byte[]) o;
return tmpArray;
}
现在,这是令我困惑的部分,我如何才能将其与JSF页面和托管bean结合起来呢?
@ManagedBean
@RequestScoped
public class DownloadController {
@EJB
private FileDownloaderEJB fileDownloaderEJB;
...
private Garbage garbage;
public void startDownload(Long id) {
fileDownloaderEJB.downloadGarbage(id);
//HOW TO START THE DOWNLOAD?
//Other Get Set Methods...
}
}
另外,如何从命令按钮中从JSF将该长id传递给ManagedBean?可以吗?
<!-- How to pass the value of id from -->
<h:commandButton action="downloadController.startDownload(#{garbage.id})">
仅当将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页面中使响应格式错误。
我刚开始冬眠。我需要在postgres中存储文件,列的数据类型是。我在互联网上四处寻找这个案例的工作演示,但我找不到任何。 Hibernate映射:
问题内容: 我已经搜索了很多有关此问题的信息,但是我没有针对我的问题找到合适的解决方案,我有以下使用Java存储文件的方法, 当我尝试运行此代码时,出现以下错误, 请帮助我。 问题答案: 将文件数据转换为字节数组并在sql语句中设置
我试图将一个几何体对象存储到我的postgist数据库中,该数据库有一个带有几何体列的表。我从另一个带有几何列的表格中得到了几何值,我打印了我之前得到的值,结果没问题。要存储几何体值,我使用下一个函数: 但我总是得到这个错误: 组织。postgresql。util。PSQLException:无法推断用于org实例的SQL类型。波斯吉斯。指向使用带有显式类型值的setObject()指定要使用的类
我知道上面的问题是不完整的。让我简单解释一下。我从这个github链接https://github.com/datacharmer/testdb下载了存储库,并且按照自述文件中的说明,我尝试在本地创建数据库,但在运行命令