2012-09-27 47 views
2

我有一個JSF/PrimeFaces Web應用程序。在一頁<p:dataTable><p:fileDownload>組件已被使用。 bean構造函數從DB加載數據。它在頁面加載時工作正常。下載按鈕位於數據表的最後一列。當點擊這個按鈕時,它將文件下載控制器,一切工作正常。號碼:fileDownload在號碼:dataTable中不會在p進行搜索後工作(只是刷新頁面):dataTable的

但是,如果我添加一個搜索功能,可過濾基於查詢的數據表中的結果頁面,然後點擊下載按鈕不返回下載的文件,而不是它只是刷新頁面。

這是如何造成的,我該如何解決?

+0

要排除明顯的,是你的bean被放置在視圖範圍內? – BalusC

+0

現在我的bean在請求範圍內,是不是? – Hunter

回答

2

如果<p:dataTable>value後面的模型在顯示錶格的請求與搜索結果和下載文件的請求之間發生了不兼容的變化,則會發生這種情況。如果你的bean被請求作用域,這又會發生。然後,模型會在每個HTTP請求中新建。在表單提交請求期間,JSF需要遍歷模型,同時查找並執行數據表中的操作。但是,如果模型與表單顯示時的模型不同,那麼這將全部失敗。如果您在(後)構造函數中正確初始化模型並在(動作)偵聽器方法中更改它,並因此在任何getter方法中更改爲而不是,則應將該問題解決。視圖範圍的bean實例所在,只要你postbacking到了同樣的觀點,因此模型不是在每次請求重新初始化了,但就在同一個橫跨將在同一視圖的請求被重用。或者,如果由於技術原因確實需要將bean保留在請求範圍中,則還需要確保將搜索查詢作爲請求參數傳遞,以便可以基於搜索查詢。