Я пытаюсь понять, как выйти из системы пользователя с помощью f: ajax
с использованием JSF и резервного управляемого bean-компонента. Проблема в том, что я могу ' Я вполне могу понять, почему порядок вызовов для прослушивателя 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>
Бин
package test.auth;
import java.io.Serializable;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.faces.event.AjaxBehaviorEvent;
@Named(value="userBean")
@SessionScoped
public class UserBean
implements Serializable
{
private static final long serialVersionUID = -4292770567982457272L;
private String uid;
/** Creates a new instance of UserBean */
public UserBean() {
}
public String getUid()
{
return uid;
}
public void setUid(String uid)
{
this.uid = uid;
}
public String login () {
return "faces/index.xhtml";
}
public void logout (AjaxBehaviorEvent event) {
this.uid = null;
}
}
Проблема с кодом заключается в том, что при нажатии выйти из системы
форма перезагружается, но она все еще находится в состоянии входа в систему, хотя для uid
установлено значение null
. Я проверил это с помощью отладчика. Итак, как мне выполнить рендеринг ПОСЛЕ прослушивателя ajax?