2011-04-24 121 views
4

有没有办法在我的JSF 2.0应用程序中处理浏览器刷新事件,以便浏览器刷新页面时用户可以导航到欢迎页面? ,这导致我如何在托管bean内进行页面导航的另一个问题?在JSF中浏览器刷新处理

干杯,

回答

0

不是真的。

在http协议或jsf中没有什么。

你可以找到一些“黑客”(编号你的请求),但我认为这将是复杂的最好。

如果客户问我这样的事情,我会让它支付很多功能,没有太多的保证。它对我来说看起来是不切实际的要求;-)

2

使用单个视图,其中您有条件地呈现包括。

<h:panelGroup id="body"> 
    <ui:include src="#{bean.page}.xhtml" /> 
</h:panelGroup> 

使豆视图作用域和使用commandlinks与<f:ajax>改变包含的页面。

<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的(后)施工期间页面,然后一个全新的GET请求将始终显示欢迎页面。唯一的缺点是这些页面不再是可收藏的,但鉴于这个特殊的功能要求,这似乎并不是一个主要的问题。

0

我解决了使用下一个方法重新加载页面问题。

Phase listener阶段RENDER_RESPONSE创建NavigateHomePage。 在需要浏览器重新加载的每个页面上,应导航到“主页”f:phaseListenertype = "my.NavigateHomePage"

NavigateHomePage在方法afterPhase定义当前页名称(从request路径)并将其存储在session

NavigateHomePage在方法beforePhase定义当前页名称(从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; 
    } 

}