Ведение журнала вызванного действия управляемого компонента в PhaseListener - PullRequest
4 голосов
/ 25 января 2011

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

1 Ответ

12 голосов
/ 25 января 2011

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

Пример запуска:

@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;
}
...