2012-05-14 111 views
0

我需要幫助來實施CRUD操作。我的應用程序包含一個對象表。每個對象都由一系列屬性(值)來描述。一個屬性使用自定義JSF編輯器進行修改,具體取決於屬性類型。爲具有動態屬性的對象添加/編輯操作

當用戶添加新帳戶時,編輯器列表根據對象的類型確定,並使用custom:include標籤以表格形式顯示。此自定義標籤用於動態包含編輯器<custom:include src="#{editor.component}">。 component屬性指向JSF編輯器的位置。

每個編輯器都有一個託管bean,它實現了一個ValueHolder接口並繼承了AbstractEditor類。 AbstractEditor包含一個updateEditor方法。

public interface ValueHolder { 
    String EDITOR_VALUES = "editorValues"; 
    public Object getValue(); 
} 

我使用會話地圖,與編輯器名作爲關鍵字和編輯值值。當用戶修改屬性時,將調用updateEditor方法,並使用編輯器的新值更新映射。

問題出在編輯器後面的bean範圍。如果我使用@SessionScoped bean,則初始化編輯器的代碼不會再次調用,並且我無法處理添加/編輯操作。 @SessionScoped僅用於添加。我曾嘗試使用@RequestScoped,但這些bean經常被調用,我不知道這是否真的很好。

我正在使用JSF2,PrimeFaces 3.0.M4和Spring Web Flow進行導航。

+0

'@ RequestScoped'就是你需要使用這樣的事情,但如果你不喜歡豆子被稱爲很多次,你可以使用'@ SessionScope'和「復位」它(手動!)在'updateEditor()'方法末尾「模擬」初始化! – StepTNT

+0

你能舉個例子嗎? – Seitaridis

回答

0

我保留了@SessionScoped豆。該bean的名稱存儲在會話中,並且與編輯器的文件名稱相同。這樣編輯器和bean之間就存在關聯。

A 初始化方法被添加到ValueHolder接口。在添加/修改對象時調用此方法。

1

你看過使用@ViewScoped豆嗎?只要您繼續返回到同一頁面,視圖範圍的Bean就會保持在範圍內。這看起來像你在做什麼。

或者,如果你正在使用CDI,你可以使用@ConversationScoped保持豆的範圍,而你正在做的更新。這有一個確定的開始和結束。這將允許您確定何時bean超出範圍。

+0

該視圖包含帶有對象的表格。當我添加/編輯一個對象時,在該表格上會出現一個模式窗口。我無法使用@ViewScoped bean,因爲該視圖不會更改。只有當我導航到另一個視圖時,它纔會更改。 – Seitaridis

+0

如何在我的上下文中使用@ConverstionScoped? – Seitaridis

+0

當用戶編輯一個對象時,'@ ConversationScoped' bean將啓動一個對話,當用戶保存該對象作爲示例時,對話將結束。 –