gpt4 book ai didi

java - JSF 2.0 AJAX 重新呈现的 ID 数量多于我指定的 ID。不确定我是否有根本性的误解或只是一个错误

转载 作者:行者123 更新时间:2023-12-01 15:26:36 24 4
gpt4 key购买 nike

当我单击 logOutButton 时,它似乎也在重新渲染 ajaxR 元素。我希望它只重新渲染 f:ajax 渲染属性中的 ID。或者也许它正在重新渲染整个页面。问题是,为什么它渲染 ajaxR 元素和/或整个页面,而不仅仅是我指定的 ID。

为了确保我说得清楚:当我单击注销按钮时,ajaxR 元素不会被渲染,因为 returned="#{userIdBean.isLoggedIn}"。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
>
<h:head>
<title>SandBox</title>
</h:head>
<h:body>

<h1>SandBox</h1>
<h:form id="form1">

Registration:<br></br>
Email: <h:inputText value="#{regBean.email}"></h:inputText><br></br>
User Id: <h:inputText value="#{regBean.userId}"></h:inputText><br></br>
Password: <h:inputText id="passR" value="#{regBean.password}"></h:inputText><br></br>

<h:outputText rendered="#{userIdBean.isLoggedIn}" id="nodeL" value="Good Luck: #{userIdBean.userId}" style="font-weight:bold" /><br></br>

<h:commandButton value="Submit" type="submit" action="#{regBean.storeUserId}" />
<h:commandButton id="logOutButton" rendered="#{userIdBean.isLoggedIn}" value="Log Out" type="submit" action="#{loginBean.logoutUser}" >
<f:ajax event="keyup" render="nodeL logOutButton"/>
</h:commandButton>
<br></br>

<h:outputText rendered="#{userIdBean.isLoggedIn}" value="AJAX Response: #{userIdBean.userId}"></h:outputText>

</h:form>
</h:body>
</html>

这是 Bean 代码的片段。

public String logoutUser(){
userIdBean.setIsLoggedIn(false);
userIdBean.setUserId(null);
return null;
}

最佳答案

代码中有两个错误:

  1. <f:ajax event>UICommand组件如 <h:commandButton>必须设置为action 。您也可以只留下 event属性完全消失,然后它将默认为合理的默认值(对于命令组件是 action ,对于输入组件是 valueChange )。

    <h:commandButton id="logOutButton" rendered="#{userIdBean.isLoggedIn}" value="Log Out" type="submit" action="#{loginBean.logoutUser}" >
    <f:ajax render="nodeL logOutButton"/>
    </h:commandButton>
  2. <f:ajax render>客户端 ID 应引用始终呈现给客户端的组件。然后,它将准确地成为该组件的 HTML 表示形式,并将由 JavaScript 更新。如果该组件的 HTML 表示形式未通过 JSF 呈现给客户端,因为 rendered该组件的值为false ,那么 JavaScript 就没有什么可查找和更新的,实际上“什么也不会发生”。例如将其设置为 @form它表示整个表单:

    <h:commandButton id="logOutButton" rendered="#{userIdBean.isLoggedIn}" value="Log Out" type="submit" action="#{loginBean.logoutUser}" >
    <f:ajax render="@form" />
    </h:commandButton>

    或一些始终呈现的常见包装组件:

    <h:panelGroup id="group">    
    <h:outputText id="nodeL" value="Good Luck: #{userIdBean.userId}" style="font-weight:bold" rendered="#{userIdBean.isLoggedIn}" />
    <br></br>
    <h:commandButton value="Submit" action="#{regBean.storeUserId}" />
    <h:commandButton id="logOutButton" value="Log Out" action="#{loginBean.logoutUser}" rendered="#{userIdBean.isLoggedIn}">
    <f:ajax render="group" />
    </h:commandButton>
    <br></br>
    <h:outputText value="AJAX Response: #{userIdBean.userId}" rendered="#{userIdBean.isLoggedIn}" />
    </h:panelGroup>

关于java - JSF 2.0 AJAX 重新呈现的 ID 数量多于我指定的 ID。不确定我是否有根本性的误解或只是一个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10068088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com