2010-10-27 81 views
0

我有一個圍繞在父頁面內使用JSF 2.0組合組件的概念思維塊。我瞭解如何爲複合組件的動作實現ActionListener(以及其他),但是如何爲父頁面使用這種連線?例如,我希望我的登錄複合組件執行身份驗證,完成後,通過事件(ActionListener?)通知父頁面的支持bean以執行一些UI初始化工作。這裏的關鍵是登錄組件會說,「嘿,我完成了,用戶很好,輪到你了。」在父頁面中接收JSF 2.0組合組件事件支持Bean

在此先感謝您的幫助。

和平。

克里斯,我發現你這是用複合材料部件+自定義組件類型+ ActionSource2 +系統事件 acomplish

回答

0

的一種方式。

在您的複合材料的界面設置組件型(未definied時,執行(鑽嘴魚科或MyFaces的)使用默認的組件類型。

<cc:interface componentType="example.Login"> 
    <cc:attribute name="text" type="java.lang.String"/> 
    <cc:attribute name="actionExpression" method-signature="void method()"/> 
</cc:interface> 

<cc:implementation> 
    <p> 
     <h:outputLabel value="User"/> 
     <h:inputText id="user"/> 
    </p> 
    <p> 
     <h:outputLabel value="Password"/> 
     <h:inputSecret id="password"/> 
    </p> 
</cc:implementation> 

此組件類型是實現NamingContainer一個Java類(UINamingContainer是實現此接口的組件的子類)接下來,您必須實現ActionSource2,以便在用戶驗證時生成一個動作事件

verifyng必須在驗證用戶和密碼組件後你的驗證,但JSF過程驗證)呃要知道驗證何時發生,我們使用系統事件。

這是自定義組件的代碼示例。該類實現ActionSource2接口的方法,並重寫廣播來處理ActionEvent的。我在Mojarra中使用了一些特定的類(因爲ActionSource和ActionSource2之間的遺留問題)。

@FacesComponent("example.Login") //Component type in the composite 
@ListenerFor(systemEventClass=PostValidateEvent.class) //Event to listen for user and password verification 
public class LoginComponent extends UINamingContainer implements ActionSource2{ 

    @Override 
    public void processEvent(ComponentSystemEvent event) throws AbortProcessingException { 
     if(event instanceof PostValidateEvent){ 
      System.out.println("post validate"); 
     } 
     super.processEvent(event); 
     String user=(String) ((HtmlInputText)findComponent("user")).getValue(); 
     String password=(String) ((HtmlInputSecret)findComponent("password")).getValue(); 
     System.out.println("user: "+user); 
     System.out.println("password: "+password); 
     //a simple logic for verification 
     if(user != null && user.equals("victor") && password != null && password.equals(user)){ 
      System.out.println("user ok"); 
      queueEvent(new ActionEvent(this)); 
     } 
    } 


    private MethodExpression exp; 

    @Override 
    public MethodExpression getActionExpression() { 
     return exp; 
    } 

    @Override 
    public void setActionExpression(MethodExpression action) { 
     exp=action; 
    } 

    @Override 
    public MethodBinding getAction() { 
     return exp != null ? new MethodBindingMethodExpressionAdapter(exp): null; 
    } 

    @Override 
    public void setAction(MethodBinding action) { 
     setActionExpression(new MethodExpressionMethodBindingAdapter(action)); 
    } 

    private MethodBinding actionListener; 

    @Override 
    public MethodBinding getActionListener() { 
     return actionListener; 
    } 

    @Override 
    public void setActionListener(MethodBinding actionListener) { 
     this.actionListener=actionListener; 
    } 

    private boolean i; 

    @Override 
    public boolean isImmediate() { 
     return i; 
    } 

    @Override 
    public void setImmediate(boolean immediate) { 
     this.i=immediate; 
    } 

    List<ActionListener> listeners=new LinkedList<ActionListener>(); 

    @Override 
    public void addActionListener(ActionListener listener) { 
     listeners.add(listener); 
    } 

    @Override 
    public ActionListener[] getActionListeners() { 
     return listeners.toArray(new ActionListener[0]); 
    } 

    @Override 
    public void removeActionListener(ActionListener listener) { 
     listeners.remove(listener); 
    } 

    @Override 
    public void broadcast(FacesEvent event) throws AbortProcessingException { 
     super.broadcast(event); 

     if (event instanceof ActionEvent) { 
      FacesContext context = getFacesContext(); 
      MethodBinding binding = getActionListener(); 
      if (binding != null) { 
       binding.invoke(context, new Object[] { event }); 
      } 

      ActionListener listener = context.getApplication().getActionListener(); 
      if (listener != null) { 
       listener.processAction((ActionEvent) event); 
      } 
     } 
    } 

} 

而且這是在使用網頁代碼:

<ez:login actionExpression="#{bean.logged}"/> 
+0

感謝維克多的代碼段。我將在另一週回到我的複合組件,並更詳細地調查您的實現。它絕對看起來不錯。再次感謝! – Chris 2011-02-07 17:35:49