【问题标题】:p:fileDownload in p:dataTable does not work (just refreshes page) after performing search on the p:dataTablep:dataTable 中的 p:fileDownload 在对 p:dataTable 执行搜索后不起作用(只是刷新页面)
【发布时间】:2012-09-19 02:43:49
【问题描述】:

我有一个 JSF/PrimeFaces Web 应用程序。在一页中使用了<p:dataTable><p:fileDownload> 组件。 bean 构造函数从数据库加载数据。页面加载时它工作正常。下载按钮位于数据表的最后一列。单击此按钮后,它将进入文件下载控制器,一切正常。

但是,如果我在页面中添加一个搜索功能,根据查询过滤数据表结果,那么单击下载按钮不会返回下载的文件,而是刷新页面。

这是怎么引起的,我该如何解决?

【问题讨论】:

  • 排除显而易见的问题,您的 bean 是否被放置在视图范围内?
  • 现在我的 bean 在请求范围内,是不是错了??

标签: jsf-2 datatable primefaces download


【解决方案1】:

如果<p:dataTable>value 后面的模型在显示带有搜索结果的表格的请求和下载文件的请求之间发生了不兼容的变化,就会发生这种情况。如果您的 bean 是请求范围的,那么这反过来又会发生。然后在每个 HTTP 请求上新创建模型。在表单提交请求期间,JSF 需要遍历模型,同时在数据表中查找和执行操作。但是,如果模型不代表与显示表单时相同的模型,那么这一切都会失败。

将 bean 放在视图范围内应该可以解决问题,前提是您在 (post) 构造函数中正确初始化模型并在 (action)listener 方法中更改它,因此 不是在任何 getter 方法中。只要您回发到同一个视图,视图范围的 bean 实例就会一直存在,因此模型不会再在每个请求上重新初始化,而是会在同一个视图上的请求之间重用同一个。

或者,如果您出于技术原因确实需要将 bean 保留在请求范围内,那么您需要确保您也将搜索查询作为请求参数传递,以便可以根据搜索正确初始化模型查询。

【讨论】:

    猜你喜欢
    • 2012-09-28
    • 2013-07-19
    • 1970-01-01
    • 2012-08-03
    • 2016-10-06
    • 2013-08-09
    • 2013-11-20
    • 2011-11-05
    • 2014-07-19
    相关资源
    最近更新 更多