JSF AJAX слушатель - PullRequest
       5

JSF AJAX слушатель

5 голосов
/ 18 февраля 2011

Я пытаюсь выяснить, как выйти из системы с помощью вызова f:ajax с использованием JSF и управляемого бина.У меня проблема в том, что я не могу понять, почему порядок вызовов для прослушивателя 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>

Bean

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;
    }
}

Проблема с кодом заключается в том, что при нажатии logout форма перезагружается, но она все еще находится в состоянии входа в систему.даже если uid было установлено на null.Я проверил это с помощью отладчика.Так как же сделать так, чтобы рендер выполнялся ПОСЛЕ прослушивателя ajax?

1 Ответ

8 голосов
/ 18 февраля 2011

Теги 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...