2011-01-24 4 views
3

Я использую Sun JSF 2.0 и написал прослушиватель фаз, продолжающийся javax.faces.event.PhaseListener. Я могу регистрировать исходный URI, целевой URI, общее время и так далее. Но до сих пор не удалось зарегистрировать ManagedBean и соответствующий метод, который будет вызываться во время этого события клиента. Как я могу это сделать?Регистрация активированного действия bean-компонента в PhaseListener

+0

Обратите внимание, что ВС была передана Oracle больше года назад. – BalusC

ответ

11

Компоненты ввода отправляют свой идентификатор клиента в качестве имени параметра запроса в случае синхронных запросов и в качестве значения параметра запроса javax.faces.source запрашивают параметр в случае асинхронных (ajax) запросов. Просто запрограммируйте параметры запроса и проверьте, разрешен ли compnonent UICommand на UIViewRoot#findComponent() на основе этой информации, а затем обрабатывать соответствующим образом.

Kickoff пример:

@Override 
public void beforePhase(PhaseEvent event) { 
    FacesContext context = event.getFacesContext(); 

    if (context.isPostback()) { 
     UICommand component = findInvokedCommandComponent(context); 

     if (component != null) { 
      String methodExpression = component.getActionExpression().getExpressionString(); 
      // It'll contain #{bean.action}. 
     } 
    } 
} 

private UICommand findInvokedCommandComponent(FacesContext context) { 
    UIViewRoot view = context.getViewRoot(); 
    Map<String, String> params = context.getExternalContext().getRequestParameterMap(); 

    if (context.getPartialViewContext().isAjaxRequest()) { 
     return (UICommand) view.findComponent(params.get("javax.faces.source")); 
    } else { 
     for (String clientId : params.keySet()) { 
      UIComponent component = view.findComponent(clientId); 

      if (component instanceof UICommand) { 
       return (UICommand) component; 
      } 
     } 
    } 

    return null; 
} 
+0

Это сработало ... спасибо – Hussain