2017-03-05 28 views
0

在一個實現了PhaseListener接口的jsf bean中,僅在getPhaseId方法指示的階段之前和之後纔會調用beforePhaseafterPhase方法。這種機制只能使我們只選擇一個階段,這兩個方法將在之前和之後被調用。
有沒有辦法告訴JSF這兩種方法(beforePhaseafterPhase)呼籲的生命週期方法(在JSF中爲生命週期方法子集調用偵聽器

  1. 一個子集(而不僅僅是一個)恢復視圖
  2. 應用請求值
  3. 工藝驗證
  4. 更新模型值
  5. 調用應用
  6. 渲染響應相

public class HelloBean implements PhaseListener { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public void afterPhase(PhaseEvent phaseEvent) { 
     System.out.println("after phase "+phaseEvent.getPhaseId()); 
    } 

    @Override 
    public void beforePhase(PhaseEvent phaseEvent) { 
     System.out.println("beforePhase "+phaseEvent.getPhaseId()); 
    } 

    public void testMethod(){ 
     System.out.println("Test Method"); 
    } 

    @Override 
    public PhaseId getPhaseId() { 
     return PhaseId.RESTORE_VIEW; 
    } 
} 

回答

0

不幸的是,這是不可能的。作爲一個普通的工作,你身邊可以實現自定義擴展的PhaseListener是這樣的:

public interface MultiplePhasesListener extends PhaseListener { 

    @Override 
    default void beforePhase(PhaseEvent phaseEvent) { 
     if (processPhase(phaseEvent.getPhaseId())) { 
      beforePhases(phaseEvent); 
     } 
    } 

    @Override 
    default void afterPhase(PhaseEvent phaseEvent) { 
     if (processPhase(phaseEvent.getPhaseId())) { 
      afterPhases(phaseEvent); 
     } 
    } 

    @Override 
    default PhaseId getPhaseId() { 
     return PhaseId.ANY_PHASE; 
    } 

    default boolean processPhase(PhaseId phaseId) { 
     if (phaseId == null) { 
      return false; 
     } 
     List<PhaseId> phaseIds = getPhaseIds(); 
     if (phaseIds == null || phaseIds.isEmpty()) { 
      return false; 
     } 
     return phaseIds.contains(phaseId); 
    } 

    void beforePhases(PhaseEvent phaseEvent); 

    void afterPhases(PhaseEvent phaseEvent); 

    List<PhaseId> getPhaseIds(); 
} 

而且使用這樣的:

public class MultiplePhasesListenerImpl implements MultiplePhasesListener { 

    private static final long serialVersionUID = 1877176187821557447L; 

    @Override 
    public void beforePhases(PhaseEvent phaseEvent) { 
     System.out.println(phaseEvent.getPhaseId()); 
    } 

    @Override 
    public void afterPhases(PhaseEvent phaseEvent) { 
     System.out.println(phaseEvent.getPhaseId()); 
    } 

    @Override 
    public List<PhaseId> getPhaseIds() { 
     return Arrays.asList(PhaseId.APPLY_REQUEST_VALUES, PhaseId.RENDER_RESPONSE); 
    } 
} 

注意,PhaseListener在方法之前的任何階段,但邏輯之後調用只在所需階段之前和之後處理。

此外,請注意MultiplePhasesListener接口的實現使用屬於Java 8的默認方法。如果使用較低的Java版本,則可以使用抽象類而不是接口並擴展該抽象類的PhaseListener實現。缺點是你不能從另一個班級延伸。

+0

感謝您的答案@Alex Fire。但正如你所說,「PhaseListener方法在任何階段之前和之後被調用,但邏輯​​只在所需階段之前和之後被處理」。我的目的是在每個生命週期階段沒有方法調用開銷的情況下實現這一目標。 – Mostafa

相關問題