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
Java Jsf使用旧值更新模型值_Java_Jsf_Lifecycle - Fatal编程技术网

Java Jsf使用旧值更新模型值

Java Jsf使用旧值更新模型值,java,jsf,lifecycle,Java,Jsf,Lifecycle,我在更新到正确的值时遇到一些问题。在您可以在下面看到部分的页面上,有一个参数“change”。我认为这个参数导致jsf用旧值更新支持bean,因此什么也不做 <h:panelGroup id="panel0"> <h:form id="changeForm"> <h:messages/> <!--This retains the parameter "change"-

我在更新到正确的值时遇到一些问题。在您可以在下面看到部分的页面上,有一个参数“change”。我认为这个参数导致jsf用旧值更新支持bean,因此什么也不做

<h:panelGroup id="panel0">
            <h:form id="changeForm">
                <h:messages/>
                <!--This retains the parameter "change"-->
                <input type="hidden" name="change" value="#{param.change}"/>
                <!--CHANGE NAME-->
                <h:panelGrid id="panel1" rendered="#{param.change == 'name'}" columns="2">
                    First Name:
                    <h:inputText id="firstName" value="#{changeInfoBean.firstName}"/>
                    Last Name:
                    <h:inputText id="lastName" value="#{changeInfoBean.lastName}"/>
                     <f:facet name="footer">
                        <h:panelGroup style="display:block; text-align:center">
                            <h:commandButton value="Submit Name" action="#{changeInfoBean.changeName}"/>
                        </h:panelGroup>
                    </f:facet>
                </h:panelGrid>
          </h:form>
    </h:panelGroup>
当我试着把我的姓从Lindhardt改成新名字时,我得到了这个

INFO: START PHASE RESTORE_VIEW 1
INFO: END PHASE RESTORE_VIEW 1
INFO: START PHASE APPLY_REQUEST_VALUES 2
INFO: END PHASE APPLY_REQUEST_VALUES 2
INFO: START PHASE PROCESS_VALIDATIONS 3
INFO: I am getting my lastName: Lindhardt
INFO: END PHASE PROCESS_VALIDATIONS 3
INFO: START PHASE UPDATE_MODEL_VALUES 4
INFO: I am updating my lastName to: Lindhardt
INFO: END PHASE UPDATE_MODEL_VALUES 4
INFO: START PHASE INVOKE_APPLICATION 5
INFO: Hibernate: update coffeedrinkers.basic_user set First_Name=?, Last_Name=? where Email=?
INFO: Rows affected: 1
INFO: END PHASE INVOKE_APPLICATION 5
INFO: START PHASE RENDER_RESPONSE 6
INFO: I am getting my lastName: Lindhardt
INFO: END PHASE RENDER_RESPONSE 6

因此,支持bean从不接收新的lastName,而只是用旧的lastName更新模型。这不是很奇怪吗:)

使用
引用的是当前实例的变量,而不是本地(传入)变量。在使用传入变量设置当前实例的变量之前,您正在打印该实例的变量,而您感兴趣的是传入变量

public void setLastName(String lastName) {
    System.out.print("I am updating my lastName to: " + this.lastName);
    this.lastName = lastName;
}
换成

public void setLastName(String lastName) {
    System.out.print("I am updating my lastName to: " + lastName);
    this.lastName = lastName;
}

它会打印出正确的



更新:根据评论,以上只是部分修复了问题。毕竟,仍然保留/重新显示了错误的值。这似乎与CDI的
@命名的
注释有关。它导致bean似乎在JSF生命周期的每个阶段都被重新构造。用JSF标准的
@ManagedBean
注释替换它确实解决了这个问题。

好的,现在我知道我将我的lastName更新为新的lastName,但是该值在模型中没有更新。姓氏还是林哈特。啊,是的,我知道了。很抱歉,我在提供的信息中没有发现任何其他问题。您的原始代码中可能有更多内容。为什么您认为参数是问题的原因?您是否建议在删除
rendered=“#{param.change}”
时使用它?我还不知道。只是在没有参数的所有页面上做了类似的操作,没有问题。在这里,我可以看到this.lastName在第4阶段被设置为新的lastName,然后在第5阶段返回到Lindhardt:(奇怪。可能与
@Named
和CDI有关。试着用普通的JSF
@ManagedBean
.Hurray:)就是这样。我不知道为什么突然有了这个@Named。
public void setLastName(String lastName) {
    System.out.print("I am updating my lastName to: " + lastName);
    this.lastName = lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
    System.out.print("I am updating my lastName to: " + this.lastName);
}