2010-08-01 6 views
0

작동하지 리디렉션 : -아약스이 내 JSF 코드

<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"); 

    } 

내가 자바 스크립트 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> 

그리고 분명히, 내가 Stringloginaction 변경된 반환 형식에있는 명령의 actionListener를 변경하고 로그인 방법에서 home를 반환했습니다. 이것이 JSF에서 원하는 행동이라면 누구나 지금 말할 수 있습니까? faces-config.xml에서 리디렉션하는 방법과 managedbean에서 간단한 리디렉션이 작동하지 않습니다.

답변

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

여기에서 JSF API를 그대로두고 JSF가 처리하지 않는 서블릿 API로 캐스트합니다. 이 메서드를 호출하면 서버에서 JavaScript API가 예상 한 AJAX 응답 대신 302 response을 반환합니다.

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(). 명세는 액션 메소드가 객체 리턴 타입을 선언해야한다고 명시하고있다 (구현이 에러를 발생시키지 않는다는 사실만으로 운이 좋다는 것을 의미한다).