JSF验证错误,丢失了价值

时间:2009-12-23 15:14:04

标签: jsf

我有一个更新表单,带有复合键所有复合键都显示在outputbox中,因为我有每个复合键的隐藏字段。验证错误后,这些outputbox值为空。我该如何解决这个问题。我在同一页面上,所以不必拥有这些值。

1 个答案:

答案 0 :(得分:2)

这确实是h:inputHidden的非直观行为(我曾在Mojarra问题列表中提出过issue反对它,但他们似乎没有做任何事情) 。整个问题是组件的值不必要地进入整个验证周期,而没有用户控制输入的方法。验证失败时会丢失。至少有三种方法可以解决这种非直观行为。

第一种方法是使用binding上的h:inputHidden代替:

<h:inputHidden binding="#{bean.hidden}" />

这样,该值不会经历不必要的验证周期。但是,这需要更改在获取/设置辅助bean代码中的值的方式。例如:

private HtmlInputHidden hidden = new HtmlInputHidden(); // +getter +setter.

public void setHiddenValue(Object hiddenValue) {
    hidden.setValue(hiddenValue);
}

public Object getHiddenValue() {
    return hidden.getValue();
}

其次(以及恕我直言,首选方式)是使用Tomahawkt:saveState代替。

<t:saveState value="#{bean.property}" />

主要优点是您不需要更改支持bean代码中的任何内容。它将在应用请求值阶段之前提前恢复该值。如果还没有完成,你只需要添加额外的库,但是因为Tomahawk提供的优势远远超过t:saveState,例如基本的JSF实现缺少组件/功能t:inputFileUploadt:dataListt:dataTable preserveDataModel="true"t:selectOneRadio layout="spread"等等,值得努力。

第三种方法是将它存储在会话范围的bean中,但实际上您不希望对请求范围的变量执行此操作。它只会给“wtf?”当最终用户在同一会话中打开多个选项卡/窗口时的体验。