我有一个 JSF/PrimeFaces Web 应用程序。在一页中<p:dataTable>
and <p:fileDownload>
组件被使用。 bean 构造函数从数据库加载数据。页面加载时它工作正常。下载按钮位于数据表的最后一列中。单击此按钮后,它将进入文件下载控制器,一切正常。
但是,如果我向页面添加一个搜索功能,该功能根据查询过滤数据表结果,那么单击下载按钮不会返回下载的文件,而只会刷新页面。
这是如何引起的以及如何解决?
如果背后的模型value
of the <p:dataTable>
显示带有搜索结果的表格的请求与下载文件的请求之间发生了不兼容的更改。如果您的 bean 是请求范围的,那么这种情况就会发生。然后在每个 HTTP 请求上新创建该模型。在表单提交请求期间,JSF 需要迭代模型,同时在数据表中查找并执行操作。但是,如果模型所代表的模型与显示表单时的模型不同,那么这一切都会失败。
将 bean 放在视图范围中应该可以解决问题,前提是您在(后)构造函数中正确初始化模型并在(动作)侦听器方法中更改它,从而not在任何 getter 方法中。只要您回发到同一视图,视图范围的 bean 实例就会存在,因此模型不再在每个请求上重新初始化,但同一视图上的请求之间将重用同一个模型。
或者,如果出于技术原因确实需要将 bean 保留在请求范围内,那么您需要确保也将搜索查询作为请求参数传递,以便可以根据搜索查询正确初始化模型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)