2015-11-26 3 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 к вашему классу рендеринга с соответствующими значениями componentFamily и rendererType. 2) определить свой компонент RenderType в вашем классе компонента, используя setRendererType в конструкторе класса.

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

Я стараюсь понять его (кажется, просто поэтапно следует, что указано в документации рендеринга для поведения декодирования), но это сработало для меня. Благодарю. ^^ –

Смежные вопросы