我有一个更新表单,带有复合键所有复合键都显示在outputbox中,因为我有每个复合键的隐藏字段。验证错误后,这些outputbox值为空。我该如何解决这个问题。我在同一页面上,所以不必拥有这些值。
答案 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();
}
其次(以及恕我直言,首选方式)是使用Tomahawk的t:saveState
代替。
<t:saveState value="#{bean.property}" />
主要优点是您不需要更改支持bean代码中的任何内容。它将在应用请求值阶段之前提前恢复该值。如果还没有完成,你只需要添加额外的库,但是因为Tomahawk提供的优势远远超过t:saveState
,例如基本的JSF实现缺少组件/功能t:inputFileUpload
,t:dataList
,t:dataTable preserveDataModel="true"
,t:selectOneRadio layout="spread"
等等,值得努力。
第三种方法是将它存储在会话范围的bean中,但实际上您不希望对请求范围的变量执行此操作。它只会给“wtf?”当最终用户在同一会话中打开多个选项卡/窗口时的体验。