Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 未为输入文本调用Setter_Jsf_Valuechangelistener - Fatal编程技术网

Jsf 未为输入文本调用Setter

Jsf 未为输入文本调用Setter,jsf,valuechangelistener,Jsf,Valuechangelistener,我有一个表单,它有一个输入文本和一组单选按钮。单击单选按钮时,我正在调用值更改侦听器。在值更改侦听器中,我正在打印用户在输入文本字段中输入的值。但是我总是得到文本字段的旧值,而不是用户输入的新值。我知道ValueChangeListener属于验证周期。但是如果我需要访问输入字段的新值,我应该怎么做? 注意:托管bean是请求范围。如果我将作用域更改为session,它可以正常工作。欢迎对此作出任何解释。 JSP中的代码如下所示: <h:form> Enter name:<h:

我有一个表单,它有一个输入文本和一组单选按钮。单击单选按钮时,我正在调用值更改侦听器。在值更改侦听器中,我正在打印用户在输入文本字段中输入的值。但是我总是得到文本字段的旧值,而不是用户输入的新值。我知道ValueChangeListener属于验证周期。但是如果我需要访问输入字段的新值,我应该怎么做? 注意:托管bean是请求范围。如果我将作用域更改为session,它可以正常工作。欢迎对此作出任何解释。 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>

输入名称:
选择选项:
您的问题描述(旧值仅在请求范围内可用;它在会话范围内“起作用”)与案例相匹配,就好像您将直接访问属性而不是从服务器获取属性一样。这的确是不对的

valuechangevent
为您提供了返回旧值和新值的getter。您应该使用它,而不是直接访问属性

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

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

假设您使用的是遗留的JSF1.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.
}    

您根本没有在操作中提交表单。该值没有刷新。我想你要做的是,要么使用js刷新页面,要么使用ajaxI在问题中添加了注释。同样,一旦值更改侦听器完成,就会调用setter方法。嗨,BalusC,如果我试图访问值更改侦听器中所选单选按钮的值,那么您所说的是真的。但我实际上是在尝试访问输入文本字段的值,同样的情况也适用于它。至于解决方案,首先是这个问题,你在使用JSF2吗?我在使用JSF1.2;根据您的评论,如何访问值更改侦听器未映射到的另一个字段的新值?