2011-04-24 9 views
4

브라우저에서 페이지를 새로 고칠 때 환영 페이지로 이동하도록 JSF 2.0 응용 프로그램 내에서 브라우저 새로 고침 이벤트를 처리 할 수있는 방법이 있습니까? 그게 관리 빈 안에 페이지 네비게이션을 만드는 방법에 대한 또 다른 질문으로 이어질까요?JSF에서 브라우저 새로 고침 처리

건배,

답변

0

실제로는 아닙니다.

http 프로토콜이나 jsf에는 아무 것도 없습니다.

"해킹"(요청 번호 매기기)을 찾을 수는 있지만 최대한 복잡 할 것이라고 생각합니다.

클라이언트가 나에게 비슷한 것을 묻는다면 너무 많은 보증없이이 기능에 많은 비용을 지불하게 할 것입니다. 그것은 나에게 비현실적인 요구 사항처럼 보입니다 ;-)

2

조건부 렌더링을 포함하는 단일보기를 사용하십시오.

<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 요청은 항상 환영 페이지를 표시합니다. 유일한 단점은 해당 페이지가 더 이상 책갈피로 표시되지 않는다는 것입니다. 그러나이 특정 기능 요구 사항을 고려할 때 주요 관심사는 아닌 것 같습니다.

0

다음 접근 방식을 사용하여 페이지로드 문제를 해결했습니다.

Phase listener (RENDER_RESPONSE)은 NavigateHomePage으로 생성됩니다. 브라우저 재로드가 필요한 모든 페이지에서 "홈페이지"로 이동해야합니다. f:phaseListenertype = "my.NavigateHomePage"입니다. 방법 afterPhase

NavigateHomePage 은 (request 경로에서) 현재 페이지의 이름을 정의하여 저장이 session인치 방법 beforePhase

NavigateHomePage 는 (request 경로에서) 현재 페이지의 이름을 정의 session에서 이전 페이지의 이름을 취하고 request method 걸린다. 현재 페이지 이름이 이전 페이지 이름과 같고 request methodGET이고 현재 페이지가 "홈 페이지"가 ​​아니면 "홈 페이지"로 리디렉션됩니다.

제한 사항은 이러한 페이지 (브라우저 홈페이지로 이동하는 브라우저 재로드)에는 자체에 대한 링크 (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; 
    } 

} 

다음 페이지에 추가 페이지 위상 수신기를 포함하려면
관련 문제