2013-03-29 68 views
0

方案1: 如果friendlyURL是 '/ requestform/servicerequest' 和requestProcessorBean.userRequestVO == null然后验证会话,并重定向到“/网络/ PDS /登录页面..重定向页面使用JSF PhaseListener在

方案2: 如果friendlyURL为'/ requestform/servicerequest'并且requestProcessorBean.userRequestVO != null则重定向到'serviceRequest.xhtml'页面。

我想知道我可以如何使用JSF Phase Listener实现场景1。我已经实现方案1,如下所示: requestForm.xhtml:

<?xml version="1.0" encoding="UTF-8"?> 
<f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
    </h:head> 
    <h:body> 
     <h:outputFormat rendered="#{lookupBean.friendlyURL == '/requestform/servicerequest' and (requestProcessorBean.userRequestVO != null)}"> 
      <ui:include src="serviceRequest.xhtml" /> 
     </h:outputFormat> 
    </h:body> 
</f:view> 

我使用的Liferay 6.0和JSF 2.0。

感谢

+0

你是积极的,你想要的是重定向?你现在正在做的是动态包含,而不是重定向(这实际上导致用户被带到另一个视图)。请指定您真正需要的内容 – kolossus

+0

我想为方案1重定向我想重定向。 – Sri

回答

0

我真的不会推荐一个阶段侦听条件重定向。改为使用<f:event type="preRenderView"/>。但是,如果由于某种原因,你限制使用的PhaseListener,您的实现应该是这样的:

  1. 定义的PhaseListener看起来像这样

    /*we're defining the PhaseListener as a ManagedBean so 
    * we can inject other beans into it 
    */ 
    @ManagedBean(name = "thePhaseListener") 
    @RequestScoped 
    public class TestPhaseListener implements PhaseListener { 
    
    
        @ManagedProperty(value = "#{requestProcessorBean}") 
        transient private RequestProcessorBean requestProcessorBean; 
    
        @ManagedProperty(value = "#{lookupBean}") 
        transient private LookupBean lookupBean; 
    
        @Override 
        public void afterPhase(PhaseEvent event) { 
         //throw new UnsupportedOperationException("Not supported yet."); 
        } 
    
        @Override 
        public void beforePhase(PhaseEvent event) { 
    
         try { 
    
          if (lookupBean.getFriendlyURL.equals("/requestform/servicerequest") && (requestProcessorBean.getUserRequestVO() == null)) { 
          event.getFacesContext().getExternalContext().redirect("/web/pds/login"); 
          } 
         } catch (IOException ex) { 
          Logger.getLogger(TestPhaseListener.class.getName()).log(Level.SEVERE, null, ex); 
         } 
        } 
    
        @Override 
        public PhaseId getPhaseId() { 
         return PhaseId.RESTORE_VIEW; // The RESTORE_VIEW phase is the first in the lifecycle of a JSF view 
        } 
    } 
    
  2. 与注册新的PhaseListener标签下面的页面上,你的愿望

    <f:phaseListener type="com.you.TestPhaseListener"/> 
    

就像我在beginni提到在这篇文章中,这种方法不必要的笨重,太多的努力来实现这么少的IMO,滥用phaselisteners。