브라우저에서 페이지를 새로 고칠 때 환영 페이지로 이동하도록 JSF 2.0 응용 프로그램 내에서 브라우저 새로 고침 이벤트를 처리 할 수있는 방법이 있습니까? 그게 관리 빈 안에 페이지 네비게이션을 만드는 방법에 대한 또 다른 질문으로 이어질까요?JSF에서 브라우저 새로 고침 처리
건배,
브라우저에서 페이지를 새로 고칠 때 환영 페이지로 이동하도록 JSF 2.0 응용 프로그램 내에서 브라우저 새로 고침 이벤트를 처리 할 수있는 방법이 있습니까? 그게 관리 빈 안에 페이지 네비게이션을 만드는 방법에 대한 또 다른 질문으로 이어질까요?JSF에서 브라우저 새로 고침 처리
건배,
실제로는 아닙니다.
http 프로토콜이나 jsf에는 아무 것도 없습니다.
"해킹"(요청 번호 매기기)을 찾을 수는 있지만 최대한 복잡 할 것이라고 생각합니다.
클라이언트가 나에게 비슷한 것을 묻는다면 너무 많은 보증없이이 기능에 많은 비용을 지불하게 할 것입니다. 그것은 나에게 비현실적인 요구 사항처럼 보입니다 ;-)
조건부 렌더링을 포함하는 단일보기를 사용하십시오.
<h:panelGroup id="body">
<ui:include src="#{bean.page}.xhtml" />
</h:panelGroup>
는 빈 뷰 범위 확인하고 포함 된 페이지를 변경하는
<f:ajax>
와 commandlinks를 사용합니다.
<h:form>
<h:commandLink value="Page 1" action="#{bean.setPage('page1')}">
<f:ajax execute="@this" render=":body" />
</h:commandLink>
<h:commandLink value="Page 2" action="#{bean.setPage('page2')}">
<f:ajax execute="@this" render=":body" />
</h:commandLink>
</h:form>
bean (post) 구성 중에 시작 페이지를 기본 포함 페이지로 설정하면 새로운 새로운 GET 요청은 항상 환영 페이지를 표시합니다. 유일한 단점은 해당 페이지가 더 이상 책갈피로 표시되지 않는다는 것입니다. 그러나이 특정 기능 요구 사항을 고려할 때 주요 관심사는 아닌 것 같습니다.
다음 접근 방식을 사용하여 페이지로드 문제를 해결했습니다.
Phase listener
(RENDER_RESPONSE
)은 NavigateHomePage
으로 생성됩니다. 브라우저 재로드가 필요한 모든 페이지에서 "홈페이지"로 이동해야합니다. f:phaseListener
은 type = "my.NavigateHomePage"
입니다. 방법 afterPhase
에
NavigateHomePage
은 (request
경로에서) 현재 페이지의 이름을 정의하여 저장이 session
인치 방법 beforePhase
에
NavigateHomePage
는 (request
경로에서) 현재 페이지의 이름을 정의 session
에서 이전 페이지의 이름을 취하고 request method
걸린다. 현재 페이지 이름이 이전 페이지 이름과 같고 request method
이 GET
이고 현재 페이지가 "홈 페이지"가 아니면 "홈 페이지"로 리디렉션됩니다.
제한 사항은 이러한 페이지 (브라우저 홈페이지로 이동하는 브라우저 재로드)에는 자체에 대한 링크 (GET
경유)가 없어야한다는 것입니다.
<f:phaseListener type="my.NavigateHomePage"/>
Phase listener
코드는 다음과 같습니다 :
public class NavigateHomePage implements PhaseListener {
private static final String CURR_PAGE = "currPage";
private static final String HOME_PAGE = "home";
private static final String HOME_PATH = "/my/faces/home.xhtml";
@Override
public void afterPhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
String currPage = getPageName(facesContext);
facesContext.getExternalContext().getSessionMap().put(CURR_PAGE, currPage);
}
@Override
public void beforePhase(PhaseEvent event) {
//check browser reload and redirect to Main page
FacesContext facesContext = event.getFacesContext();
String requestMethod = ((HttpServletRequest)facesContext.getExternalContext().getRequest()).getMethod();
String currPage = (String) facesContext.getExternalContext().getSessionMap().get(CURR_PAGE);
String newPage = getPageName(facesContext);
if ("GET".equals(requestMethod) && newPage.equals(currPage) && !HOME_PAGE.equals(newPage)) {
try {
facesContext.getExternalContext().redirect(HOME_PATH);
} catch (IOException ex) {
Logger.getLogger(this.getClass()).warn("Can't redirect to Home page", ex);
}
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
private String getPageName(FacesContext facesContext) {
String pagePath = facesContext.getExternalContext().getRequestServletPath();
String pageName = pagePath.substring(pagePath.lastIndexOf("/") + 1, pagePath.lastIndexOf(".xhtml"));
return pageName;
}
}
다음 페이지에 추가 페이지 위상 수신기를 포함하려면