我有一个包含输入文本和一组单选按钮的表单。单击单选按钮时,我正在调用值更改侦听器。在值更改侦听器内部,我打印用户在输入文本字段中输入的值。但我总是得到文本字段的旧值,而不是用户输入的新值。我知道ValueChangeListener属于验证周期。但是,如果我需要访问输入字段的新值,我该怎么办? 注意:托管bean是请求范围。如果我将范围更改为会话,它可以正常工作。对此的任何解释都是受欢迎的。 JSP中的代码如下:
<h:form>
Enter name:<h:inputText value="#{employee.empId}"></h:inputText>
Choose option: <h:selectOneRadio onclick="this.form.submit()"
valueChangeListener="#{employee.check}" >
<f:selectItem itemLabel="one" itemValue="one"/>
<f:selectItem itemLabel="two" itemValue="two"/>
</h:selectOneRadio>
</h:form>
答案 0 :(得分:2)
您的问题描述(旧值仅在请求范围内可用;并且在会话范围内“有效”)与案例匹配,就像您将直接访问该属性而不是从ValueChangeEvent
获取该属性一样。这确实不对。
ValueChangeEvent
为getters提供返回旧值和新值的功能。您应该使用它而不是直接访问该属性。
public void check(ValueChangeEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
// ...
}
更新:根据评论,您实际上对输入字段的值感兴趣。这仅在更新模型值阶段期间设置,在值更改侦听器运行时在验证阶段之后。
鉴于您使用的是遗留的JSF 1.2,因此无法使用JSF2 ajax非常棒,那么解决此问题的方法之一是手动将值更改事件排入调用操作阶段,以便您可以获取提交输入文本值。
public void check(ValueChangeEvent event) {
if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
event.queue();
return;
}
System.out.println(empId); // It's available in here.
}