【问题标题】:Add/Edit operations for objects with dynamic properties为具有动态属性的对象添加/编辑操作
【发布时间】:2012-05-14 14:56:14
【问题描述】:

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

当用户添加新帐户时,编辑者列表由对象的类型确定,并使用custom:include 标记以表格形式显示。此自定义标记用于动态包含编辑器<custom:include src="#{editor.component}">。组件属性指向 JSF 编辑器的位置。

每个编辑器都有一个实现ValueHolder 接口并继承AbstractEditor 类的托管bean。 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 进行导航。

【问题讨论】:

  • @RequestScoped 是您需要用于类似这样的事情,但如果您不喜欢多次调用 bean,您可以使用 @SessionScope 和“重置”它(手动!)在 updateEditor() 方法的末尾“模拟”初始化!

标签: java jsf primefaces crud managed-bean


【解决方案1】:

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

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

【讨论】:

  • 视图包含带有对象的表格。当我添加/编辑一个对象时,该表上会出现一个模式窗口。我不能使用 @ViewScoped bean,因为该视图不会改变。只有当我导航到另一个视图时它才会改变。
  • 如何在我的上下文中使用@ConverstionScoped?
  • @ConversationScoped bean 将在用户编辑对象时开始对话,并在用户保存对象时结束对话。
【解决方案2】:

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

initialize 方法已添加到ValueHolder 接口。添加/修改对象时调用此方法。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2018-04-19
    • 2016-05-04
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多