Estoy tratando de averiguar cómo cerrar la sesión de un usuario con un f:ajax llamada utilizando JSF y una copia de managed bean. El problema que estoy teniendo es que no puedo entender por qué la llamada orden para el Ajax y la escucha de la de procesar el formulario de inicio de sesión.

A continuación es la muy simplificado código. La idea básica de que el código es este

if (uid != null) {
    //show log out
} else {
    //show log in
}

Estoy claramente no entender algo acerca de cómo el ajax de los oyentes y la forma de procesar se hace.

La página 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>

El Frijol

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

El problema con el código, es que al hacer clic logout el formulario vuelve a cargar pero es todavía en el inicio de sesión en el estado, aún a pesar de la uid se ha establecido para null. He comprobado esto con el depurador. Entonces, ¿cómo puedo hacer que el render se ejecutan DESPUÉS de que el ajax oyente?

InformationsquelleAutor Matti Lyra | 2011-02-18

1 Comentario

  1. 8

    Las etiquetas JSTL se ejecutan durante la vista de tiempo de compilación, no durante la vista de tiempo de render. En el momento en el JSF es reutilizar el estado de la vista para volver a procesar, las etiquetas JSTL no se vuelve a ejecutar, simplemente porque no están allí.

    Desea utilizar JSF rendered atributo en su lugar.

    <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>
    • Excelente, muchas gracias.

Dejar respuesta

Please enter your comment!
Please enter your name here