2

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

问题

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

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

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

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

我发现了什么

经过谷歌的一些研究,我发现这个问题来自JSF 的生命周期,尽管找到的文档和解决方案是针对 JSF 的特定实现的。所以我猜这是因为值是用“localValue”而不是“submittedValue”填充的(@see EditableValueHolder interface可以帮助理解),并且这些页面中有一些解决方案

结果

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

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

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

4

1 回答 1

2

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

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

于 2009-12-24T15:51:36.410 回答