我有一个 JSF/PrimeFaces Web 应用程序。在一页<p:dataTable>
中<p:fileDownload>
使用了组件。bean 构造函数从数据库加载数据。页面加载时它工作正常。下载按钮位于数据表的最后一列。单击此按钮后,它将文件下载控制器,一切正常。
但是,如果我在页面中添加一个搜索功能,该功能根据查询过滤数据表结果,那么单击下载按钮不会返回下载的文件,而只会刷新页面。
这是如何引起的,我该如何解决?
我有一个 JSF/PrimeFaces Web 应用程序。在一页<p:dataTable>
中<p:fileDownload>
使用了组件。bean 构造函数从数据库加载数据。页面加载时它工作正常。下载按钮位于数据表的最后一列。单击此按钮后,它将文件下载控制器,一切正常。
但是,如果我在页面中添加一个搜索功能,该功能根据查询过滤数据表结果,那么单击下载按钮不会返回下载的文件,而只会刷新页面。
这是如何引起的,我该如何解决?
如果后面的模型在显示带有搜索结果的表格的请求和下载文件的请求之间发生了不兼容的变化,则value
可能会发生这种情况。<p:dataTable>
如果您的 bean 是请求范围的,那么这反过来又会发生。然后在每个 HTTP 请求上新创建模型。在表单提交请求期间,JSF 需要遍历模型,同时在数据表中查找和执行操作。但是,如果模型不代表与显示表单时相同的模型,那么这一切都会失败。
将 bean 放在视图范围内应该可以解决问题,前提是您在 (post) 构造函数中正确初始化模型并在 (action)listener 方法中更改它,因此不在任何 getter 方法中。只要您回发到同一个视图,视图范围的 bean 实例就会一直存在,因此模型不再在每个请求上重新初始化,但同一个视图将在同一个视图上的请求中重用。
或者,如果您出于技术原因确实需要将 bean 保留在请求范围内,那么您需要确保将搜索查询也作为请求参数传递,以便可以根据搜索查询正确初始化模型。