Setter没有调用输入文本

时间:2012-11-05 07:20:53

标签: jsf valuechangelistener

我有一个包含输入文本和一组单选按钮的表单。单击单选按钮时,我正在调用值更改侦听器。在值更改侦听器内部,我打印用户在输入文本字段中输入的值。但我总是得到文本字段的旧值,而不是用户输入的新值。我知道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>

1 个答案:

答案 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.
}