我需要帮助来实现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 :(得分:1)
你看过使用@ViewScoped
豆子了吗?只要您继续返回到同一页面,视图范围的bean就会保留在范围内。这看起来就像你在做什么。
或者,如果您使用CDI,则可以使用@ConversationScoped
在执行更新时将bean保留在范围内。这有一个明确的开始和结束。这将允许您确定bean何时超出范围。
答案 1 :(得分:0)
我保留了@SessionScoped
豆子。 bean的名称存储在会话中,它与编辑器的文件名相同。这样编辑器和bean之间就存在关联。
initialize 方法已添加到ValueHolder
界面。添加/修改对象时会调用此方法。