【问题标题】:JSF ajax listenerJSF ajax 监听器
【发布时间】:2011-06-29 17:42:26
【问题描述】:

我正在尝试弄清楚如何使用 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>

豆子

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 监听器之后执行渲染呢?

【问题讨论】:

    标签: ajax jsf jsf-2


    【解决方案1】:

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 2014-02-06
      • 2018-10-05
      • 2013-05-05
      • 2013-06-14
      • 2011-01-17
      相关资源
      最近更新 更多