JSF - 强制刷新UIInput组件

时间:2009-12-24 12:29:55

标签: validation jsf refresh lifecycle

我目前正在研究JSF 1.2项目(IBM实施和“公司层”)。

问题

这是情况(项目数量仅用于示例),简单CRUD

  1. 列表项
  2. 我有一个项目列表
  3. 我点击第2项以查看详细信息
  4. 我点击修改,修改页面显示第2项的值
  5. 使用“返回”按钮返回列表并immediate="true"(因为我们不想提交修改)
  6. 第4项的细节
  7. 修改第4项> 显示第2项的值
  8. BUT

    • 如果我将“后退”按钮的“立即”属性设置为false,则第4项的值就可以了。
    • 如果我将inputText组件的“禁用”属性设置为true,则项目4的值为OK。
    • 如果我使用<h:outputText value="#{item4.myValue}/>(UIOutput)而不是<h:inputText value="#{item4.myValue}/>(UIInput)

    另外,我在调试模式下检查了我想要显示的bean是“第4项”,它是。

    我找到了什么

    经过对Google的一些研究后,我发现此问题来自lifecycle of JSF,尽管找到的文档和解决方案是针对JSF的特定实现。 所以我想这是因为该值填充了“localValue”而不是“submittedValue”(@see EditableValueHolder interface可以帮助理解),并且这些页面中有一些解决方案

    RESULT

    它不起作用(我不会在这里,我发誓^^)。 “刷新”解决方案无效。 “擦除输入”很可怕。我不能承认我需要引用每个输入字段!另外,我在IBM JSF的UIInput上找不到setSubmittedValue()方法。 “清除”方法无效。我尝试了一个元素,并在完整的组件树上使用此代码

    public void cleanAllChildren(List<UIComponentBase> list){
     for(UIComponentBase c : list){
      this.cleanAllChildren(c.getChildren());
      c.getChildren().clear();
     }
    }
    

    但没有成功。所以我在这里。 我错过了什么吗?有没有一个很好的棘手的解决方案,我没有看到?我对JSF生命周期并不熟悉。

1 个答案:

答案 0 :(得分:2)

将带有请求范围数据的bean放在请求范围中,而不是放在会话范围内。

您可能在会话中有整个列表来“保存”数据库调用以及在同一会话中的后续请求中保留值的所有工作。您可以使用单独的会话范围bean,例如DataManager。然后你应该有一个请求范围的bean来表示所选的项目,例如DataItem。你可以在托管房产注入的帮助下熟悉这两种豆类。