Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何记录JSF ajax请求的方法表达式_Ajax_Jsf_Logging_Methodexpression - Fatal编程技术网

如何记录JSF ajax请求的方法表达式

如何记录JSF ajax请求的方法表达式,ajax,jsf,logging,methodexpression,Ajax,Jsf,Logging,Methodexpression,我已经了解了如何在过滤器中记录何时请求是ajax请求以及它来自哪个页面 我真正想做的是记录ajax请求的实际用途。例如ajax调用的方法的名称(例如此调用中的“findAddress: 我真正想做的是记录ajax请求的实际用途,例如ajax调用的方法的名称(例如“findAddress”)在这个调用中:特别是关于侦听器方法名称,请看这里:@tt\u dev interest。我可能会使用它,但是facesContext在我的筛选器中不可用,因为它不是bean。我确实相信我可以从标准请求/会话中的

我已经了解了如何在过滤器中记录何时请求是ajax请求以及它来自哪个页面

我真正想做的是记录ajax请求的实际用途。例如ajax调用的方法的名称(例如此调用中的“findAddress:


我真正想做的是记录ajax请求的实际用途,例如ajax调用的方法的名称(例如“findAddress”)在这个调用中:
特别是关于侦听器方法名称,请看这里:@tt\u dev interest。我可能会使用它,但是facesContext在我的筛选器中不可用,因为它不是bean。我确实相信我可以从标准请求/会话中的某个地方获取facesContext,但我不记得是什么时候e、 我的应用程序在调试中搜索,但没有结果。没有理由否决这个问题。我知道100分奖金会引起你的注意。再次感谢@BalusC,由于你的回答,我对JSF了解更多。解决方案听起来可行,而且可能是。我会在我着手实施你的时候奖励奖金r建议。不客气。至于赏金,你也可以让系统自动奖励。赏金问题在列表中停留的时间越长,就会有越多的人看到并投票支持问答,特别是在赏金的最后一天。这样,你就可以赚回一点你花在赏金上的钱。
public class TrackingFilter implements Filter {

private static Logger LOG = Logger.getLogger(TrackingFilter.class);

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {    

    HttpServletRequest req = (HttpServletRequest) request;

    String pageHit = req.getRequestURI().substring(req.getContextPath().length()+1).replace(".xhtml", "");
    if(!pageHit.contains("javax.faces.resource")){ // if is a url we want to log
        if ("partial/ajax".equals(req.getHeader("Faces-Request"))) {
            LOG.trace("ajax on URI: " + req.getRequestURI());
        }
public class AjaxActionLoggerPhaseListener implements PhaseListener {

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // NOOP.
    }

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

        if (!(context.isPostback() && context.getPartialViewContext().isAjaxRequest())) {
            return; // Not an ajax postback.
        }

        Map<String, String> params = context.getExternalContext().getRequestParameterMap();
        String sourceClientId = params.get("javax.faces.source");
        String behaviorEvent = params.get("javax.faces.behavior.event");

        UIComponent source = context.getViewRoot().findComponent(sourceClientId);
        List<String> methodExpressions = new ArrayList<>();

        if (source instanceof ClientBehaviorHolder && behaviorEvent != null) {
            for (ClientBehavior behavior : ((ClientBehaviorHolder) source).getClientBehaviors().get(behaviorEvent)) {
                List<BehaviorListener> listeners = getField(BehaviorBase.class, List.class, behavior);

                if (listeners != null) {
                    for (BehaviorListener listener : listeners) {
                        MethodExpression methodExpression = getField(listener.getClass(), MethodExpression.class, listener);

                        if (methodExpression != null) {
                            methodExpressions.add(methodExpression.getExpressionString());
                        }
                    }
                }
            }
        }

        if (source instanceof ActionSource2) {
            MethodExpression methodExpression = ((ActionSource2) source).getActionExpression();

            if (methodExpression != null) {
                methodExpressions.add(methodExpression.getExpressionString());
            }
        }

        System.out.println(methodExpressions); // Do your thing with it.
    }

    private static <C, F> F getField(Class<? extends C> classType, Class<F> fieldType, C instance) {
        try {
            for (Field field : classType.getDeclaredFields()) {
                if (field.getType().isAssignableFrom(fieldType)) {
                    field.setAccessible(true);
                    return (F) field.get(instance);
                }
            }
        } catch (Exception e) {
            // Handle?
        }

        return null;
    }

}
<lifecycle>
    <phase-listener>com.example.AjaxActionLoggerPhaseListener</phase-listener>
</lifecycle>
public class FacesActionLoggerPhaseListener implements PhaseListener {

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.PROCESS_VALIDATIONS;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // NOOP.
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        if (!event.getFacesContext().isPostback())) {
            return;
        }

        UIComponent source = Components.getCurrentActionSource();
        List<String> methodExpressions = Components.getActionExpressionsAndListeners(source);
        System.out.println(methodExpressions); // Do your thing with it.
    }

}