1

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

1 回答 1

2

您的问题描述(旧值仅在请求范围内可用;并且它在会话范围内“有效”)与情况相匹配,就好像您将直接访问该属性而不是从ValueChangeEvent. 这确实是不对的。

ValueChangeEvent您获取返回旧值和新值的提议。您应该使用它而不是直接访问该属性。

public void check(ValueChangeEvent event) {
    Object oldValue = event.getOldValue();
    Object newValue = event.getNewValue();
    // ...
}

更新:根据评论,您实际上对输入字段的值感兴趣。这仅在更新模型值阶段设置,即验证阶段之后,当值更改侦听器运行时。

鉴于您使用的是旧版 JSF 1.2,因此无法使用 JSF2 ajax awesomeness,那么解决此问题的方法之一是将值更改事件手动排队到调用操作阶段,以便您可以获得提交的输入文本价值。

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.
}    
于 2012-11-05T11:39:30.167 回答