0

我需要帮助来实施 CRUD 操作。我的应用程序包含一个对象表。每个对象都由属性(值)列表描述。一个属性使用自定义 JSF 编辑器进行修改,具体取决于属性类型。

当用户添加新帐户时,编辑者列表由对象类型确定,并使用custom:include标签显示在表单中。此自定义标记用于动态包含编辑器<custom:include src="#{editor.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 进行导航。

4

2 回答 2

1

你看过用@ViewScoped豆子吗?只要您继续返回同一页面,视图范围的 bean 就会保持在范围内。这看起来像你在做什么。

或者,如果您使用 CDI,@ConversationScoped则可以在进行更新时使用将 bean 保持在范围内。这有一个明确的开始和结束。这将允许您确定 bean 何时超出范围。

于 2012-05-14T18:07:49.783 回答
0

我保留了@SessionScoped豆子。bean 的名称存储在会话中,并且与编辑器的文件名相同。这样,编辑器和 bean 之间就有了关联。

接口中添加了一个初始化方法。ValueHolder添加/修改对象时调用此方法。

于 2012-05-16T18:39:27.403 回答