这确实是一种非直觉行为h:inputHidden
(我曾经提交过issue在 Mojarra 问题列表中反对它,但他们似乎没有对此做任何事情)。整个问题是组件的值不必要地是also考虑到整个验证周期,而没有用户控制输入的方法。当验证失败时它会丢失。至少有三种方法可以解决这种非直观行为。
第一种方法是使用binding
on the 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's 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?”最终用户在同一会话中打开多个选项卡/窗口时的体验。