2014-07-07 7 views
1

primefaces 5.0으로 jsf를 개발 중입니다. 뒷 배경 빈이 만족되면 조건을 다른 페이지로 리디렉션해야합니다. 따라서 p:poll을 사용하여 페이지가 매초마다 조건을 확인하도록하고, 조건이 충족되면 사용자를 다른 페이지로 리디렉션합니다.primefaces 폴링으로 리디렉션하는 방법은 무엇입니까?

이 시나리오를 시도하기 위해 poll을 사용하여 int cnt이> = 10인지 확인하고, 그렇다면 사용자를 welcomePrimefaces.xhtml으로 리디렉션하는 작은 프로젝트를 만듭니다. 또한 T1이라는 스레드가 있습니다.이 스레드는 cnt을 단순히 늘려 조건이 약간의 시간을 만족할 수 있도록합니다. 여기

내가 무슨 짓을했는지의 :
페이지 :

<h:form> 
    Hello from Facelets 
    <br /> 
    <p:poll interval="1" listener="#{mainBean.checkStatus()}"/> 
</h:form> 

는 콩 백업 (아무것도 특별한 그냥 상태를 확인하는 초마다 폴링) :

public class MainBean { 

    private Integer cnt = 0; 

    @PostConstruct 
    public void init() { 
     Thread t1 = new Thread(new T1(), "test"); 
     t1.start(); 

    } 

    public void checkStatus() { 
     synchronized (cnt) { 
      System.out.println("cnt:" + cnt); 
      if (cnt >= 10) { 
       try { 
        Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
        Object response = FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
        HttpServletRequest httpRequest = (HttpServletRequest) request; 
        HttpServletResponse httpResponse = (HttpServletResponse) response; 
        httpResponse.sendRedirect(httpRequest.getContextPath() 
          + "/welcomePrimefaces.xhtml"); 
       } catch (IOException ex) { 
        System.out.println("Error!"); 
       } 
      } 
     } 
    } 

    private class T1 implements Runnable { 

     @Override 
     public void run() { 
      try { 
       while (true) { 
        Thread.sleep(1000); 
        synchronized (cnt) { 
         cnt++; 
        } 
       } 
      } catch (InterruptedException ex) { 
       System.out.println("Thread Error!"); 
      } 
     } 
    } 
} 

결과는 cnt이 10 번 (0에서 9까지) 인쇄되고 그 이후에는 폴링이 실행되지 않고 저장됩니다.
내 코드가 잘못 되었나요? 도와주세요.
미리 감사드립니다. 요청 (아약스) 부분 아니었다면

FacesContext.getCurrentInstance().getExternalContext() 
     .redirect("welcomePrimefaces.xhtml"); 

코드는 제대로 작동합니다 :

답변

4

는 HTTP 응답에서 리디렉션을 보내지 마십시오,하지만 외부 상황 자체에서. Mojarra JSF 래퍼는 두 경우 모두를 처리하므로 활용하고 지나치게 복잡하게 만들지 마십시오. 즉 당신은 내가 생각했던 정확히 "라고 자신을 복잡하게하지 말라"

ExternalContextImpl.java

/** 
* @see ExternalContext#redirect(String) 
*/ 
public void redirect(String requestURI) throws IOException { 

    FacesContext ctx = FacesContext.getCurrentInstance(); 
    getELFlash().doLastPhaseActions(ctx, true); 

    if (ctx.getPartialViewContext().isPartialRequest()) { 
     //Handle partial request returning a redirection code in XML format 
     if (getSession(true) instanceof HttpSession && 
      ctx.getResponseComplete()) { 
      throw new IllegalStateException(); 
     } 
     PartialResponseWriter pwriter; 
     ResponseWriter writer = ctx.getResponseWriter(); 
     if (writer instanceof PartialResponseWriter) { 
      pwriter = (PartialResponseWriter) writer; 
     } else { 
      pwriter = ctx.getPartialViewContext().getPartialResponseWriter(); 
     } 
     setResponseContentType("text/xml"); 
     setResponseCharacterEncoding("UTF-8"); 
     addResponseHeader("Cache-Control", "no-cache"); 
     pwriter.startDocument(); 
     pwriter.redirect(requestURI); 
     pwriter.endDocument(); 
    } else { 
     //Standard redirection behaviour 
     ((HttpServletResponse) response).sendRedirect(requestURI); 
    } 
    ctx.responseComplete(); 

} 
+0

: 여기 당신은 인 Mojarra 2.1.28에서의 내부 구현이있다. –

+0

@SujanSivagurunathan, 대답은 첫 번째 코드 조각입니다. 두 번째 코드 조각은 Mojarra 구현에 속하므로 아약스 요청과 비 아약스 요청이 어떻게 다른지 보여주기 위해 첨부했습니다. –

+1

그러면 가능한 한 가장 짧은 답변입니다. 죄송합니다. 리디렉션 방식이 귀하 자신의 구현이라고 생각했습니다. –

관련 문제