JSF ajax侦听器

JSF ajax侦听器,ajax,jsf,jsf-2,Ajax,Jsf,Jsf 2,我试图弄清楚如何使用JSF和一个支持的托管bean,通过f:ajax调用注销用户。我遇到的问题是,我不太明白为什么Ajax侦听器的调用顺序和登录表单的重新加载顺序会发生变化 下面是非常简化的代码。代码的基本思想如下 if (uid != null) { // show log out } else { // show log in } 我显然不了解ajax侦听器和表单重读器是如何完成的 JSF页面 <html xmlns="http://www.w3.org/1999/x

我试图弄清楚如何使用JSF和一个支持的托管bean,通过
f:ajax
调用注销用户。我遇到的问题是,我不太明白为什么Ajax侦听器的调用顺序和登录表单的重新加载顺序会发生变化

下面是非常简化的代码。代码的基本思想如下

if (uid != null) {
    // show log out
} else {
    // show log in
}
我显然不了解ajax侦听器和表单重读器是如何完成的

JSF页面

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
  <h:head>
    <title>Facelet Title</title>
  </h:head>
  <h:body>
    <f:view>
      <h:form id="loginForm">
        <c:choose>
          <c:when test="${userBean.uid != null}">
            <span>Hi, #{userBean.uid}</span>
            <h:commandButton value="Logout">
              <f:ajax event="click" listener="#{userBean.logout}" render="loginForm"/>
            </h:commandButton>
            </c:when>
            <c:otherwise>
            <span>User name: </span>
            <h:inputText value="#{userBean.uid}" id="uid" />
            <h:commandButton value="Login" action="#{userBean.login}" />
            </c:otherwise>
          </c:choose>
        </h:form>
      </f:view>
    </h:body>
</html>

代码的问题是,当单击“注销”时,表单会重新加载,但它仍然处于登录状态,即使
uid
已设置为
null
。我已经用调试器检查过了。那么,如何使渲染在ajax侦听器之后执行呢?

JSTL标记在视图构建期间执行,而不是在视图渲染期间执行。在JSF重用视图状态进行重新呈现时,JSTL标记不会被重新执行,因为它们不再存在

您希望改用JSF
rendered
属性

<h:form id="loginForm">
  <h:panelGroup rendered="#{userBean.uid != null}">
    <span>Hi, #{userBean.uid}</span>
    <h:commandButton value="Logout">
      <f:ajax event="click" listener="#{userBean.logout}" render="loginForm"/>
    </h:commandButton>
  </h:panelGroup>
  <h:panelGroup rendered="#{userBean.uid == null}">
    <span>User name: </span>
    <h:inputText value="#{userBean.uid}" id="uid" />
    <h:commandButton value="Login" action="#{userBean.login}" />
  </h:panelGroup>
</h:form>

嗨,#{userBean.uid}
用户名:
<h:form id="loginForm">
  <h:panelGroup rendered="#{userBean.uid != null}">
    <span>Hi, #{userBean.uid}</span>
    <h:commandButton value="Logout">
      <f:ajax event="click" listener="#{userBean.logout}" render="loginForm"/>
    </h:commandButton>
  </h:panelGroup>
  <h:panelGroup rendered="#{userBean.uid == null}">
    <span>User name: </span>
    <h:inputText value="#{userBean.uid}" id="uid" />
    <h:commandButton value="Login" action="#{userBean.login}" />
  </h:panelGroup>
</h:form>