Я использую Sun JSF 2.0 и написал прослушиватель фаз, продолжающийся javax.faces.event.PhaseListener
. Я могу регистрировать исходный URI, целевой URI, общее время и так далее. Но до сих пор не удалось зарегистрировать ManagedBean и соответствующий метод, который будет вызываться во время этого события клиента. Как я могу это сделать?Регистрация активированного действия bean-компонента в PhaseListener
3
A
ответ
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
Обратите внимание, что ВС была передана Oracle больше года назад. – BalusC