gpt4 book ai didi

ajax - JSF ajax 监听器

转载 作者:行者123 更新时间:2023-12-04 14:34:39 24 4
gpt4 key购买 nike

我想弄清楚如何用 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>

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

最佳答案

JSTL 标记在 View 构建期间执行,而不是在 View 渲染期间执行。在 JSF 重用 View 状态进行重新渲染时,不会重新执行 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>

关于ajax - JSF ajax 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5040184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com