2010-08-01 168 views
0

這是我的JSF代碼: -AJAX重定向不工作

<h:commandButton id="cmdLogin" value="Login" actionListener="#{indexBean.login}"> 
          <f:ajax execute="@form" render="@all" /> 
         </h:commandButton> 

這是indexBean我的登錄方法: -

public void login(){ 

       HttpServletResponse objHttpServletResponse = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
       objHttpServletResponse.sendRedirect("Restricted/Home.jsf"); 

    } 

我可以在javascript emptyResponse: An empty response was received from the server. Check server error logs.一個警報。爲什麼這種類型的重定向不起作用?

編輯: - 有趣的是,當我從faces-config.xml重定向,它的工作原理!

<faces-config version="2.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"> 

    <navigation-rule> 
     <from-view-id>/index.xhtml</from-view-id> 
     <navigation-case> 
      <from-outcome>Home</from-outcome> 
      <to-view-id>/Restricted/Home.jsf</to-view-id> 
      <redirect/> 
     </navigation-case> 
    </navigation-rule> 

</faces-config> 

而且很明顯,我改變了命令按鈕的actionListenerloginaction和改變的返回類型String和登錄方法返回home。現在有誰可以告訴,如果這是JSF中所需的行爲?如何從faces-config.xml重定向工作和簡單的重定向在managedbean不?

回答

2
HttpServletResponse objHttpServletResponse = (HttpServletResponse) 
           FacesContext.getCurrentInstance() 
              .getExternalContext() 
              .getResponse(); 
objHttpServletResponse.sendRedirect("Restricted/Home.jsf"); 

在這裏,您保留JSF API並將其轉換爲JSF不處理您所做任何事情的servlet API。當您調用此方法時,服務器將返回一個302 response,而不是JavaScript API期望的AJAX響應。

執行在JSF的綱領性重定向正確的機制是使用ExternalContext

FacesContext.getCurrentInstance() 
      .getExternalContext() 
      .redirect("yourUrl"); 

如果您使用此機制在JSF 2.0 AJAX調用時,服務器會發送這樣的響應:

<?xml version="1.0" encoding="utf-8"?> 
<partial-response><redirect url="yourUrl"></redirect></partial-response> 

您可以使用諸如FirebugFiddler之類的工具檢查服務器的響應。


注意,此方法的簽名是不正確:public void login()。規範規定,動作方法必須聲明一個對象返回類型(事實上,你的實現不會拋出錯誤只是意味着你很幸運)。