2009-12-23 66 views
1

我有一个更新窗体,使用复合键所有组合键都显示在输出框中,因为每个复合键都有隐藏字段。验证错误后,这些输出框值为空。我该如何解决这个问题。我在同一个页面上,所以它没有价值。JSF验证错误,丢失值

回答

2

这的确是​​的非直观的行为(我曾经在钻嘴鱼科的问题清单提交了issue反对,但他们似乎并没有用它做任何事情)。整个问题是,组件的值不必要的是进入整个验证周期,而没有用户控制输入的手段。验证失败时它会丢失。至少有三种方法可以解决这种非直观的行为。

第一种方式是使用在​​而不是binding

<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(); 
} 

二(和IMHO的首选方式)是使用Tomahawkt: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?”在最终用户在同一会话中打开多个选项卡/窗口时的体验。