action和actionListener之间的差异

时间:2010-10-11 19:20:31

标签: jsf jsf-2 action actionlistener

actionactionListener之间的区别是什么?我应该何时使用actionactionListener

4 个答案:

答案 0 :(得分:553)

答案 1 :(得分:45)

正如BalusC指出的那样,actionListener默认情况下会吞下异常,但在JSF 2.0中还有更多内容。也就是说,它不只是吞下和记录,而是实际发布异常。

通过以下呼叫发生这种情况:

context.getApplication().publishEvent(context, ExceptionQueuedEvent.class,                                                          
    new ExceptionQueuedEventContext(context, exception, source, phaseId)
);

此事件的默认侦听器是ExceptionHandler,其中Mojarra设置为com.sun.faces.context.ExceptionHandlerImpl。这个实现基本上会重新抛出任何异常,除非它涉及记录的AbortProcessingException。 ActionListeners包装客户端代码在此类AbortProcessingException中抛出的异常,该异常解释了为什么始终记录这些异常。

但是,可以在faces-config.xml中使用自定义实现替换此ExceptionHandler

<exception-handlerfactory>
   com.foo.myExceptionHandler
</exception-handlerfactory>

单个bean也可以监听这些事件,而不是全局监听。以下是对此概念的证明:

@ManagedBean
@RequestScoped
public class MyBean {

    public void actionMethod(ActionEvent event) {

        FacesContext.getCurrentInstance().getApplication().subscribeToEvent(ExceptionQueuedEvent.class, new SystemEventListener() {

        @Override
        public void processEvent(SystemEvent event) throws AbortProcessingException {
            ExceptionQueuedEventContext content = (ExceptionQueuedEventContext)event.getSource();
            throw new RuntimeException(content.getException());
        }

        @Override
        public boolean isListenerForSource(Object source) {
            return true;
        }
        });

        throw new RuntimeException("test");
    }

}

(请注意,这不是人们通常应该如何编写侦听器的代码,这仅用于演示目的!)

从这样的Facelet中调用它:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
    <h:body>
        <h:form>
            <h:commandButton value="test" actionListener="#{myBean.actionMethod}"/>
        </h:form>
    </h:body>
</html>

将导致显示错误页面。

答案 2 :(得分:39)

在调用Action之前,首先触发ActionListener,并选择修改响应,并确定下一页的位置。

如果同一页面上有多个按钮,它们应该转到相同的位置,但做的事情略有不同,则可以对每个按钮使用相同的Action,但使用不同的ActionListener来处理稍微不同的功能。

以下是描述关系的链接:

http://www.java-samples.com/showtutorial.php?tutorialid=605

答案 3 :(得分:0)

TL; DR

ActionListener(可以有多个)按照它们在action之前的注册顺序执行

长答案

企业action通常会调用EJB服务,并且在必要时还会设置最终结果和/或导航到其他视图 如果不是您正在做的事情,那么actionListener更合适,即,当用户与组件交互时,例如h:commandButtonh:link,可以通过传递名称来处理它们。 UI组件的actionListener属性中的托管bean方法,或实现一个ActionListener接口并将实现类名传递给UI组件的actionListener属性。