我有一个 JSF/PrimeFaces Web 应用程序。在一页<p:dataTable>
和<p:fileDownload>
组件已被使用。 bean 构造函数从数据库加载数据。页面加载时它工作正常。下载按钮位于数据表的最后一列中。单击此按钮后,它将进入文件下载 Controller ,一切正常。
但是,如果我向页面添加搜索功能,根据查询过滤数据表结果,则单击下载按钮不会返回下载的文件,而只会刷新页面。
这是怎么造成的,如何解决?
最佳答案
如果 value
背后的模型可能会发生这种情况<p:dataTable>
的显示带有搜索结果的表格的请求与下载文件的请求之间发生了不兼容的更改。如果您的 bean 是请求范围的,那么这种情况就会发生。然后在每个 HTTP 请求上新创建该模型。在表单提交请求期间,JSF 需要迭代模型,同时在数据表中查找并执行操作。但是,如果模型所代表的模型与显示表单时的模型不同,那么这一切都会失败。
将 bean 放在 View 范围中应该可以解决问题,前提是您在(后)构造函数中正确初始化模型并在(操作)监听器方法中更改它,因此不会在任何 getter 方法中。只要您回发到同一 View , View 范围的 bean 实例就会存在,因此模型不再在每个请求上重新初始化,而是在同一 View 上的请求之间重复使用同一个模型。
或者,如果出于技术原因您确实需要将 bean 保留在请求范围内,那么您需要确保也将搜索查询作为请求参数传递,以便可以根据搜索正确初始化模型查询。
关于jsf-2 - p :fileDownload in p:dataTable does not work (just refreshes page) after performing search on the p:dataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619259/