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");
코드는 제대로 작동합니다 :
: 여기 당신은 인 Mojarra 2.1.28에서의 내부 구현이있다. –
@SujanSivagurunathan, 대답은 첫 번째 코드 조각입니다. 두 번째 코드 조각은 Mojarra 구현에 속하므로 아약스 요청과 비 아약스 요청이 어떻게 다른지 보여주기 위해 첨부했습니다. –
그러면 가능한 한 가장 짧은 답변입니다. 죄송합니다. 리디렉션 방식이 귀하 자신의 구현이라고 생각했습니다. –