2015-11-26 61 views
0

我一直在研究如何開發JSF自定義組件來提高我對它的工作原理的知識(到目前爲止它已經非常有趣)。如何解碼commandButton動作

我做了我自己的commandButton(從HtmlCommandButton擴展而來),它在組件類中進行所有解碼和導入時按預期工作。

當我決定爲我的組件創建一個單獨的面呈現器時,它停止工作。經過一番研究後,我得知我必須重寫渲染器的解碼方法,並且之前正在工作,因爲此方法已由HtmlCommandButton實現。

經過一番研究,我發現瞭如何解碼動作監聽器(thanks to BalusC),並且我還學習瞭如何解碼ajax事件。但是我仍然不知道如何解碼操作。

這是現在我的解碼方法:

@Override 
public void decode(FacesContext context, UIComponent component) { 
    CommandButtonUI commandButton = (CommandButtonUI) component; 
    //decode click ajax events 
    List<ClientBehavior> clientBehaviours = commandButton.getClientBehaviors().get("click"); 
    if (clientBehaviours != null) { 
     for (ClientBehavior cb : clientBehaviours) { 
      cb.decode(context, component); 
     } 
    } 
    //decode action listenet 
    if (context.getExternalContext().getRequestParameterMap().containsKey(commandButton.getClientId(context))) { 
     component.queueEvent(new ActionEvent(component)); 
    } 
} 

我已經試圖找到HtmlCommandButton的源解碼和分析,但我沒能找到它,因爲顯然它是由一個插件生成。

回答

0

這就是我的做法。但不要忘記:1)將@FacesRenderer註釋添加到您的渲染類中,分別使用componentFamilyrendererType值。 2)使用類構造函數中的setRendererType在組件類上定義組件類RenderType。

public void decode(FacesContext pContext, UIComponent pComponent) { 
    YourComponent xButton = (DBSButton) pComponent;   
    String  xClientId = xButton.getClientId(); 
    if(xButton.getReadOnly()) {return;} 

    decodeBehaviors(pContext, xButton); 

    if (RenderKitUtils.isPartialOrBehaviorAction(pContext, xClientId)  
    || pContext.getExternalContext().getRequestParameterMap().containsKey(xClientId)) { 
     xButton.queueEvent(new ActionEvent(xButton));  
    } 
} 

protected void decodeBehaviors(FacesContext pContext, UIComponent pComponent) 
{ 
    if(!(pComponent instanceof ClientBehaviorHolder)) { 
     return; 
    } 

    Map<String, List<ClientBehavior>> xBehaviors = ((ClientBehaviorHolder) pComponent).getClientBehaviors(); 
    if(xBehaviors.isEmpty()) { 
     return; 
    } 

    Map<String, String> xParams = pContext.getExternalContext().getRequestParameterMap(); 
    String xBehaviorEvent = xParams.get("javax.faces.behavior.event"); 

    if(null != xBehaviorEvent) { 
     List<ClientBehavior> xBehaviorsForEvent = xBehaviors.get(xBehaviorEvent); 

     if(xBehaviorsForEvent != null && !xBehaviorsForEvent.isEmpty()) { 
      String xBehaviorSource = xParams.get("javax.faces.source"); 
      String xClientId = pComponent.getClientId(); 

      if(xBehaviorSource != null && xClientId.startsWith(xBehaviorSource)) { 
       for(ClientBehavior xBehavior: xBehaviorsForEvent) { 
        xBehavior.decode(pContext, pComponent); 
       } 
      } 
     } 
    } 
} 
+0

我還是老樣子試圖瞭解它(似乎它只是遵循一步一步發生了什麼的解碼行爲的RenderKit文件規定),但它爲我工作。謝謝。 ^^ –

相關問題