2011-02-18 57 views
4

我想弄清楚如何使用JSF和支持托管bean调用f:ajax来注销用户。我遇到的问题是我无法弄清楚为什么Ajax侦听器的调用顺序和登录表单的重新渲染。JSF阿贾克斯听众

下面是非常简化的代码。代码的基本思想是这样的

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

回答

6

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> 
+0

非常棒,谢谢。 – 2011-02-18 14:50:59